Ошибка при добавлении сборки из dll в C # параметр компилятора - PullRequest
0 голосов
/ 16 ноября 2010

Я работаю над проектом ac # codedom, который предоставляет пользователям возможность динамически компилировать код c #.Я получаю сообщение об ошибке при добавлении сборки DLL из wpf (он работает нормально для winforms).Когда я пытаюсь добавить ссылку типа «System.Windows.Media», он говорит, что «Не могу найти #### в сборке. Вам не хватает какой-либо ссылки».Но когда я добавляю ссылку по пути к dll, например «C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll», то он говорит, что «Файл C: \ Program Files \ ReferenceСборки \ Microsoft \ Framework \ v3.0 \ System.Printing.dll не найдены ", но когда я помещаю System.Printing.dll в исполняемую папку приложения, он работает нормально.

Ниже приведен код IЯ использую, чтобы добавить ссылку на параметр компилятора:

CompilerParameters oParameters;
:
:
:
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll";
oParameters.ReferencedAssemblies.Add(lcAssemblyDll);

Я не могу понять проблему.Также есть ли другой подход для добавления сборок wpf?

Спасибо

1 Ответ

1 голос
/ 16 ноября 2010

Ну, я не могу дать исчерпывающий ответ, но прежде всего вам нужно понять, что ссылка на компиляцию - это не то же самое, что возможность разрешить сборку во время выполнения приложения. Поэтому, если эта ошибка возникла во время выполнения приложения, я могу представить, что она вызывает исключения загрузчика типов.

Во-вторых, вы, вероятно, получаете сообщение «Не удается найти #### в сборке. Вы пропустили какую-то ссылку», потому что базовые типы классов, от которых вы зависите, находятся в сборках, на которые ссылается System.Windows.Media.

Вы можете попытаться решить эту проблему путем добавления ссылок на сборки, которые загружаются во время Assembly.ReflectionOnlyLoad сборок, на которые вы хотите сослаться. Если вы добавите обработчик события для AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve, вы можете добавить код, обеспечивающий загрузку этих сборок, а затем просто добавить ссылки на CodeCompileUnit.

Я столкнулся с одной проблемой, связанной с этим, и заключалась в том, что некоторые ссылки были оптимизированы во время компиляции, поэтому я реализовал неприятный хак, который просто добавляет класс контейнера в CodeCompileUnit, который инициализирует первый конструируемый тип, найденный в каждом из сборки.

Надеюсь, это немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...