0

我正在开发 ac# codedom 项目,该项目为用户提供动态编译 c# 代码。添加 wpf 的程序集 dll 时出现错误(它适用于 winforms)。当我尝试添加像“System.Windows.Media”这样的引用时,它是说“在程序集中找不到####。你是否缺少一些引用”。但是,当我通过其 dll 路径(如“C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll”添加引用时,它会说“文件 C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll not found”但是当我将 System.Printing.dll 放到应用程序可执行文件夹中时,它工作正常。

以下是我用来添加对编译器选项的引用的代码:

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

我无法理解这个问题。还有其他方法可以添加 wpf 程序集吗?

谢谢

4

1 回答 1

1

好吧,我无法在脑海中提供一个彻底的答案,但首先您需要意识到编译引用与能够在应用程序执行期间解析程序集不同。因此,如果在应用程序执行期间给出该错误,我可以想象它会引发类型加载器异常。

其次,您可能会收到“在程序集中找不到####。您是否缺少一些参考”,因为您所依赖的类的基本类型位于 System.Windows.Media 所指的程序集中。

您可以尝试解决这个添加对在您想要引用的程序集的 Assembly.ReflectionOnlyLoad 期间加载的程序集的引用。如果为 AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve 添加事件处理程序,则可以添加确保可以加载这些程序集的代码,然后只需添加对 CodeCompileUnit 的引用。

不过,我遇到了一个问题,那就是一些引用在编译过程中被优化掉了,所以我实现了一个讨厌的 hack,它只是向 CodeCompileUnit 添加了一个容器类,它初始化了在每个这些程序集中找到的第一个可构造类型。

希望那些对你有帮助。

于 2010-11-16T06:41:27.950 回答