Ошибка при добавлении сборки из dll в параметр компилятора C# Codedom
Я работаю над проектом 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 в исполняемую папку приложения, он работает нормально.
Ниже приведен код, который я использую для добавления ссылки на опцию компилятора:
CompilerParameters oParameters;
:
:
:
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll";
oParameters.ReferencedAssemblies.Add(lcAssemblyDll);
Я не в состоянии понять проблему. Также есть ли другой подход для добавления сборок wpf?
Спасибо
1 ответ
Что ж, я не могу дать исчерпывающий ответ, но прежде всего вам нужно понять, что ссылка на компиляцию - это не то же самое, что возможность разрешить сборку во время выполнения приложения. Поэтому, если эта ошибка возникла во время выполнения приложения, я могу представить, что она вызывает исключения загрузчика типов.
Во-вторых, вы, вероятно, получаете сообщение "Не удается найти #### в сборке. Вам не хватает какой-либо ссылки", поскольку базовые типы классов, от которых вы зависите, находятся в сборках, на которые ссылается System.Windows.Media.
Вы можете попытаться решить эту проблему путем добавления ссылок на сборки, которые загружаются во время Assembly.ReflectionOnlyLoad сборок, на которые вы хотите сослаться. Если вы добавите обработчик событий для AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve, вы можете добавить код, обеспечивающий загрузку этих сборок, а затем просто добавить ссылки на CodeCompileUnit.
Хотя я столкнулся с одной проблемой, связанной с этим, и заключалась в том, что некоторые ссылки были оптимизированы во время компиляции, поэтому я реализовал неприятный хак, который просто добавляет класс контейнера в CodeCompileUnit, который инициализирует первый конструируемый тип, найденный в каждой из этих сборок.
Надеюсь, это немного поможет.