2013-05-03 2 views
2

У меня есть решение с двумя выходными dll (на самом деле больше, но позволяет сохранить его просто). Проект «Специальные» ссылки проект «Общий».Сборник Roslyn с двумя сборками?

Я пытаюсь написать генератор кода, который анализирует некоторые файлы из «Специального» и размещает сгенерированный код-заглушку в проекте «Обычный». Чтобы справиться с этой круглой ссылкой, мне нужно работать с кодом, который не компилируется. Поэтому я использую Рослин.

Генератор должен иметь некоторые типы, замененные на основе информации о наследовании, поэтому мне нужно создать блок компиляции, чтобы получить доступ к семантической модели. Кроме того, мне нужно заменить некоторые вещи на основе происхождения типов (независимо от того, определены ли они в «Специальном» или «Обычном» или более точном: на основе глобальных атрибутов сборки).

Генератор должен иметь возможность запускаться как задачи MSBuild.

Я попробовал два подхода к настройке моего окружения, и я застрял с обоими:

  1. Я пытался просто загрузить свое решение в генераторе. Это не удается из-за «Невозможно передать прозрачный прокси для ввода« Roslyn.Utilities.SerializableDataStorage ». Затем я попытался создать решение с нуля, добавив IProjects и IDocuments, и я уже пробовал LoadProjectFromCommandLineArguments, как было предложено в this answer, но для меня ничего не работает, и я получаю такое же исключение при запуске из MSBuild (он отлично работает при запуске через консоль).

    Кто-нибудь знает, как бороться с исключением SerializableDataStorage?

  2. Я попытался создать компиляцию и добавить все мои исходники cs. Но теперь я не могу найти способ узнать, пришли ли мои символы из сборки «Special» или «Common».

    Могу ли я скомпилировать в две разные сборки, используя одну компиляцию? Или я могу передать одну компиляцию в качестве ссылки на другую компиляцию? (Есть ли MetadataReference я могу кормить Compilation.AddReference, что указывает на другой компиляции?)

PS: Что-то я еще не пробовал, чтобы добавить какой-то метаданные (например, узел комментария в начале) к деревьям синтаксиса, прежде чем я добавлю их в компиляцию или использую свойство SyntaxTree.FilePath и некоторое сопоставление, чтобы использовать эту информацию в моем генераторе, чтобы определить, имеет ли определенный тип от «Special» или «Common». Я бы скорее не стал делать такие вещи, как это, потому что это быстро стало бы грязным (на самом деле у меня около 20 библиотек dll).

+0

Что касается первой проблемы: как вы получили двоичные файлы на машине, и что такое «битность» процесса, в котором он работает? Можете ли вы попробовать установить Roslyn CTP вместо NuGet? Кроме того, если это 64-разрядный процесс, вы можете попробовать запустить его в 32-битном процессе? –

+0

Я бегу по 64-битной, Windows 8, немного endian и действительно получил roslyn через nuget. Я не знаю, как сообщить визуальной студии о запуске MSBuild в любом конкретном режиме (32 или 64). Я уже пытался настроить проект на «Предпочитаю 32 бит», но получил то же исключение. – Imi

+0

Если вы используете msbuild через Visual Studio, он всегда будет использовать 32-разрядную версию. Из командной строки вы можете запустить 64-разрядную версию явно из каталога% Windir% \ Microsoft.Net \ Framework64 \ v4.0.30319. Также - попробуйте установить CTP MSI (который добавит сборки Roslyn в GAC) и посмотрим, справится ли это с проблемой. –

ответ

3

Таким образом, существует соответствие 1: 1 между компиляциями и встроенными сборками, поэтому, если вам нужно представлять обе сборки во время анализа, вам нужны две компиляции. Чтобы добавить ссылки между ними, просто сделайте compilation.AddReference(new CompilationReference(sourceCompilation)), и символы должны импортировать, как вы ожидаете. Не забывайте, что компиляции неизменяемы, поэтому, если вы когда-либо использовали fork sourceCompilation, вам, возможно, придется также развернуть свою реферирующую компиляцию.

На любом данном символе есть свойство ContainingAssembly, которое возвращает вас к сборке, в которой появился символ. Убедитесь, что вы правильно настроили свои имена на своих компиляциях, и это позволит вам понять это.

Смежные вопросы