我在vs中的解决方案结构如下。
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中时),它仍然没有编译。
现在为什么会这样?
答案 0 :(得分:2)
编译器需要引用程序集。哪个永远不应存储在GAC中。 GAC只是帮助CLR找到您在编译时使用的任何引用程序集的正确版本。因此编译器从不在GAC中查找参考汇编。他们也不可能这样做,他们不知道要寻找什么版本。
当您将程序集添加到GAC时,这会出错。构建系统现在不再将DLL复制到输出目录,因为它可以告诉不再需要它。因此,CodeDom代码不再有效,因为缺少引用程序集,编译器无法再找到它。
请勿在开发计算机上使用GAC。仅在您安装程序的计算机上。在您的特定情况下,应该永远不会因为您依赖于编译的程序集与运行代码时加载的程序集相同。