You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动