У меня есть решение с двумя выходными dll (на самом деле больше, но позволяет сохранить его просто). Проект «Специальные» ссылки проект «Общий».Сборник Roslyn с двумя сборками?
Я пытаюсь написать генератор кода, который анализирует некоторые файлы из «Специального» и размещает сгенерированный код-заглушку в проекте «Обычный». Чтобы справиться с этой круглой ссылкой, мне нужно работать с кодом, который не компилируется. Поэтому я использую Рослин.
Генератор должен иметь некоторые типы, замененные на основе информации о наследовании, поэтому мне нужно создать блок компиляции, чтобы получить доступ к семантической модели. Кроме того, мне нужно заменить некоторые вещи на основе происхождения типов (независимо от того, определены ли они в «Специальном» или «Обычном» или более точном: на основе глобальных атрибутов сборки).
Генератор должен иметь возможность запускаться как задачи MSBuild.
Я попробовал два подхода к настройке моего окружения, и я застрял с обоими:
Я пытался просто загрузить свое решение в генераторе. Это не удается из-за «Невозможно передать прозрачный прокси для ввода« Roslyn.Utilities.SerializableDataStorage ». Затем я попытался создать решение с нуля, добавив IProjects и IDocuments, и я уже пробовал LoadProjectFromCommandLineArguments, как было предложено в this answer, но для меня ничего не работает, и я получаю такое же исключение при запуске из MSBuild (он отлично работает при запуске через консоль).
Кто-нибудь знает, как бороться с исключением SerializableDataStorage?
Я попытался создать компиляцию и добавить все мои исходники cs. Но теперь я не могу найти способ узнать, пришли ли мои символы из сборки «Special» или «Common».
Могу ли я скомпилировать в две разные сборки, используя одну компиляцию? Или я могу передать одну компиляцию в качестве ссылки на другую компиляцию? (Есть ли MetadataReference я могу кормить Compilation.AddReference, что указывает на другой компиляции?)
PS: Что-то я еще не пробовал, чтобы добавить какой-то метаданные (например, узел комментария в начале) к деревьям синтаксиса, прежде чем я добавлю их в компиляцию или использую свойство SyntaxTree.FilePath и некоторое сопоставление, чтобы использовать эту информацию в моем генераторе, чтобы определить, имеет ли определенный тип от «Special» или «Common». Я бы скорее не стал делать такие вещи, как это, потому что это быстро стало бы грязным (на самом деле у меня около 20 библиотек dll).
Что касается первой проблемы: как вы получили двоичные файлы на машине, и что такое «битность» процесса, в котором он работает? Можете ли вы попробовать установить Roslyn CTP вместо NuGet? Кроме того, если это 64-разрядный процесс, вы можете попробовать запустить его в 32-битном процессе? –
Я бегу по 64-битной, Windows 8, немного endian и действительно получил roslyn через nuget. Я не знаю, как сообщить визуальной студии о запуске MSBuild в любом конкретном режиме (32 или 64). Я уже пытался настроить проект на «Предпочитаю 32 бит», но получил то же исключение. – Imi
Если вы используете msbuild через Visual Studio, он всегда будет использовать 32-разрядную версию. Из командной строки вы можете запустить 64-разрядную версию явно из каталога% Windir% \ Microsoft.Net \ Framework64 \ v4.0.30319. Также - попробуйте установить CTP MSI (который добавит сборки Roslyn в GAC) и посмотрим, справится ли это с проблемой. –