将程序集添加到gac时,Csharpcodeprovider无法编译

本文关键字:Csharpcodeprovider 编译 程序集 添加 gac | 更新日期: 2023-09-27 18:13:21

我在vs中的解决方案结构如下:

  • MyRuleEngineFramework
  • RulesEditor

MyRuleEngineFramework是一个类库。RulesEditor是一个winforms项目。后者引用前者,但是,该程序集不会在编辑器项目的任何地方使用。

只有几行代码我做了一种引用:

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("MyRuleEngineFramework.dll");
cp.OutputAssembly = "temp.dll";
cp.GenerateInMemory = false;
CompilerResults cr = provider.CompileAssemblyFromSource(cp, SourceCode);

上面的代码执行得很好,我第一次就得到了编译好的程序集。

然后我注册了MyRuleEngineFramework.dll到gac.

在此之后生成的代码(SourceCode)没有编译。然后我删除了对编辑器项目中的dll的引用(而汇编仍然在Gac中),它仍然没有编译。

为什么会这样呢?

将程序集添加到gac时,Csharpcodeprovider无法编译

编译器需要引用程序集。它永远不应该存储在GAC中。GAC的存在只是为了帮助CLR找到您在编译时使用的任何引用程序集的正确版本。因此,编译器永远不会在GAC中查找引用程序集。他们也不可能这样做,因为他们不知道要找哪个版本。

因此,当您将程序集添加到GAC中时,这就出错了。构建系统现在不再将DLL复制到输出目录,因为它知道这不再是必要的。所以你的CodeDom代码不能再工作了,因为参考程序集丢失了,编译器再也找不到它了。

不要在开发机器上使用GAC。只能在安装程序的机器上使用。在您的特殊情况下,应该永远不会,因为您依赖于您编译时使用的程序集与运行代码时加载的程序集相同。

相关文章:
  • 没有找到相关文章