我在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中),但仍未编译。现在为什么会这样?
最佳答案
编译器需要引用程序集。永远不要将其存储在GAC中。 GAC只是为了帮助CLR找到您在编译时使用的任何引用程序集的正确版本。因此,编译器永远不会在GAC中寻找引用程序集。他们也不可能这样做,因为他们不知道要寻找的版本。
因此,当您将程序集添加到GAC时,这出了错。现在,生成系统不再可以将DLL复制到输出目录,因为它可以告诉我们不再需要这样做。因此,由于缺少引用程序集,并且编译器无法找到它,因此您的CodeDom代码不再起作用。
不要在您的开发机器上使用GAC。仅在安装程序的计算机上(如果有)。在您的特定情况下,由于您依赖于程序集,因此永远不要与运行代码时加载的程序集相同。
关于c# - 将程序集添加到gac时csharpcodeprovider无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16506414/