0

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

  • MyRuleEngine框架
  • 规则编辑器

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 中时),它仍然没有编译。

现在为什么会发生这种情况?

4

1 回答 1

2

编译器需要一个参考程序集。永远不应将其存储在 GAC 中。GAC 只是帮助 CLR 找到您在编译时使用的任何参考程序集的正确版本。因此,编译器永远不会在 GAC 中查找参考程序集。他们也不可能这样做,他们不知道要寻找什么版本。

因此,当您将程序集添加到 GAC 时出现了问题。构建系统现在不再将 DLL 复制到输出目录,因为它可以判断这不再需要。因此,您的 CodeDom 代码无法再工作,因为缺少参考程序集并且编译器无法再找到它。

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

于 2013-05-12T12:44:08.273 回答