C#运行时编译自定义方法报错:无法加载临时DLL如何解决?
解决C#运行时编译找不到临时DLL的问题
首先,你遇到的找不到临时DLL的问题,根源其实不是DLL文件本身的问题,而是你的sourceCode2里有一个低级拼写错误,导致编译失败了——你把return写成了retrun!这个拼写错误会让编译过程无法生成有效的程序集,后续调用compilerResults.CompiledAssembly的时候其实拿到的是null,所以才会抛出找不到DLL的误导性错误(因为根本没生成成功)。
接下来给你一步步的解决方案:
1. 修正代码拼写错误
把sourceCode2里的retrun parameter;改成return parameter;,这是最关键的一步。修正后的代码应该是:
string sourceCode2 = @" public class Calc_Class { public int Rent (int parameter , int a) { int b= 20 ; if(a+parameter > 10 ){ for(int i=0;i<5;i++){ parameter = parameter+i; } return parameter; } return parameter += 42; } }";
2. 添加编译错误检查,提前定位问题
你的现有代码没有检查编译是否成功,这会导致你无法及时发现编译阶段的错误。建议在编译后立即检查compilerResults.Errors,如果有错误就直接输出,避免后续的误导性异常:
var compParms = new CompilerParameters { GenerateExecutable = false, GenerateInMemory = true }; var csProvider = new CSharpCodeProvider(); CompilerResults compilerResults = csProvider.CompileAssemblyFromSource(compParms, sourceCode2); // 新增:检查编译错误 if (compilerResults.Errors.HasErrors) { StringBuilder errorMsg = new StringBuilder(); foreach (CompilerError error in compilerResults.Errors) { errorMsg.AppendLine($"错误行 {error.Line}: {error.ErrorText}"); } MessageBox.Show(errorMsg.ToString()); return; } // 后续实例化和调用代码 object typeInstance = compilerResults.CompiledAssembly.CreateInstance("Calc_Class"); MethodInfo mi = typeInstance.GetType().GetMethod("Rent"); int methodOutput = (int)mi.Invoke(typeInstance, new object[] { 1, 19 }); textBox2.Text = methodOutput.ToString();
3. 针对复杂方法/数据库访问的额外处理
如果你的方法涉及数据库操作(比如使用SqlConnection等),还需要在CompilerParameters中添加对应的程序集引用,否则编译会因为找不到相关类型而失败:
// 添加必要的程序集引用 compParms.ReferencedAssemblies.Add("System.dll"); compParms.ReferencedAssemblies.Add("System.Data.dll"); // 如果用了Entity Framework等ORM框架,还要添加对应的程序集
这样处理后,不管是带循环的复杂逻辑还是数据库访问的代码,只要语法正确、引用了必要的程序集,都能正常编译运行。
内容的提问来源于stack exchange,提问作者Saeed Parand




