【问题标题】:Less Strict CodeDomProvider for Compiling DLLs用于编译 DLL 的不太严格的 CodeDomProvider
【发布时间】:2012-08-25 21:45:10
【问题描述】:

有没有办法使用 CodeDomProvider 进行不太严格的编译?我正在尝试使用以下方法将 dll 文件编译并加载到我已经运行的程序中:

public static String Compile(string commandName, string source = "")
 {
        private static CodeDomProvider compiler = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
        private static CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = false;
        parameters.MainClass = commandName;
        parameters.OutputAssembly = dll;
        parameters.ReferencedAssemblies.Add("MCLight_.dll");
        parameters.CompilerOptions = "/optimize";
        parameters.WarningLevel = 4;
        parameters.TreatWarningsAsErrors = false;
        StreamReader sr = new StreamReader(sourcepath + "cmd" + commandName + ".cs");
        results = compiler.CompileAssemblyFromSource(parameters, sr.ReadToEnd());
        .....
 }

问题是这样的错误:

错误 #CS0122 消息:“MCLight.Independent”由于其保护级别而无法访问 线路:1178

错误 #CS1501 消息:方法 'Find' 没有重载需要 '1' 参数 线路:617

正在被抛出。

现在我知道一个事实,当我在 VS 中将它编译为我的解决方案的一部分时,它编译得很好。但是当单独编译时,它会抛出这些错误。有没有办法让编译器忽略这些错误,因为我知道它会很好地挂接到应用程序中?

【问题讨论】:

  • 一般来说,编译器不能简单地忽略错误。错误意味着编译器无法编译代码,它不知道代码究竟应该做什么,因此无法生成编译后的程序集。
  • 您能否发布一个简短的示例代码,我们可以使用它来实际重现此错误? (包括被引用程序集的代码。)
  • 好吧,我不想发布三个完整的课程。您需要知道的是“独立”是同一解决方案中的另一个类,它尝试访问的方法是静态方法。错误数量的参数错误是试图访问“播放器”类中的静态方法。特殊的是这个方法有一个可选参数。但是编译器将该可选参数视为必需参数。代码中没有错误。如果有,那么原始解决方案将无法编译。所以我不需要修复任何错误,我只需要知道为什么编译器会认为有错误。
  • 在这种情况下,我认为第二个错误的原因是您明确声明要使用 .Net 3.5 中的 C# 编译器,该编译器不支持可选参数。不确定是什么导致了第一个错误。
  • 是的,但是如果您阅读此页面上的其他 cmets,您会看到我尝试使用 4.0 并且失败了。我要做的是通过创建“即时编译和加载”选项为我的服务器加载外部命令。所以这些外部命令需要访问正在运行的程序的方法。 DLL 应该能够轻松地挂接到该正在运行的进程,而不会出现任何编译错误。

标签: c# dll compiler-construction compiler-errors codedom


【解决方案1】:

您可以尝试将警告级别设置得更低:

      parameters.WarningLevel = 1;

但是如果没有看到你正在编译的代码源,就很难确定。

【讨论】:

  • 我将警告级别设置为 0,但它仍然抛出错误。基本上独立是同一解决方案中的另一个类,它试图访问的方法是静态方法。错误数量的参数错误是试图访问不同类中的静态方法。特殊的是这个方法有一个可选参数。但是编译器将该可选参数视为必需参数。这个编译器与 VS2010 的规则不同是有原因的吗?
  • 直到 4.0 才添加可选参数——尝试使用 4.0 而不是 3.5
  • 试过了,它似乎不知道 4.0 是什么,它抛出一个错误: = new CSharpCodeProvider(new Dictionary() { { "CompilerVersion", "v4.0 " } });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多