c# - 将程序集添加到gac时csharpcodeprovider无法编译

标签 c# reference compiler-errors .net-assembly codedom

我在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中。 GAC只是为了帮助CLR找到您在编译时使用的任何引用程序集的正确版本。因此,编译器永远不会在GAC中寻找引用程序集。他们也不可能这样做,因为他们不知道要寻找的版本。

    因此,当您将程序集添加到GAC时,这出了错。现在,生成系统不再可以将DLL复制到输出目录,因为它可以告诉我们不再需要这样做。因此,由于缺少引用程序集,并且编译器无法找到它,因此您的CodeDom代码不再起作用。

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

    关于c# - 将程序集添加到gac时csharpcodeprovider无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506414/

    相关文章:

    c# - 领域驱动设计 - 大型子集合

    c# - 将数组拆分为特定长度的子数组

    c++ - "std::string const &s"和 "const std::string &s"有什么区别?

    swift - 从闭包调用的方法中的 self 上下文

    c# - 为什么编译器与继承中的 namespace 冲突

    c# - IdentityServer3 PostMan invalid_client

    c# - FindAsync 很慢,但是延迟加载很快

    c++ - 为什么 const 引用可以指向常量而普通引用不能

    c - 程序没有显示错误,但无法编译。你能帮我解决我需要做的事情吗

    spring - Spring Tools Suite中的Groovy版本冲突