【发布时间】: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