使用 CompileAssemblyFromSource 加载自定义程序集

本文关键字:程序集 自定义 加载 CompileAssemblyFromSource 使用 | 更新日期: 2023-09-27 18:32:54

我不太确定该怎么做。 总体目标是能够获取用户脚本,并在 .NET 环境中执行它。 我已经编写了大部分代码并且只要我不尝试加载自己的程序集就可以正常工作。 但是,为了安全地授予用户对系统内部部分的访问权限,已创建代理 DLL。 这就是问题所在。

现在这个代理DLL有一件事,一个接口。

CompilerParameters options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = true;
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("ScriptProxy.dll");
Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
CompilerResults result = provider.CompileAssemblyFromSource(options, script);
// This line here throws the error:
return result.CompiledAssembly;

运行上面的代码,它会抛出以下错误:

System.IO.FileNotFoundException : 无法加载文件或程序集 'file:///C:''Users...''AppData''Local''Temp''scts5w5o.dll' 或其之一 依赖。系统找不到指定的文件。

当然,我的第一个想法是,"...什么是SCTS5W5O.dll?">

这是ScriptProxy.dll未正确加载,还是 ScriptProxy 本身.dll试图加载位于某处临时文件中的依赖项? 还是完全不同的东西?

应该提到,我正在从 NUnit 测试运行器执行此代码。 我不确定这是否有区别。

使用 CompileAssemblyFromSource 加载自定义程序集

这是因为编译步骤失败,并且您尚未检查它是否存在错误...

    static Assembly Compile(string script)
    {
        CompilerParameters options = new CompilerParameters();
        options.GenerateExecutable = false;
        options.GenerateInMemory = true;
        options.ReferencedAssemblies.Add("System.dll");
        options.ReferencedAssemblies.Add("ScriptProxy.dll");
        Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
        CompilerResults result = provider.CompileAssemblyFromSource(options, script);
        // Check the compiler results for errors
        StringWriter sw = new StringWriter();
        foreach (CompilerError ce in result.Errors)
        {
            if (ce.IsWarning) continue;
            sw.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText);
        }
        // If there were errors, raise an exception...
        string errorText = sw.ToString();
        if (errorText.Length > 0)
            throw new ApplicationException(errorText);
        return result.CompiledAssembly;
    }

我不认为标记为answer的帖子真的是一个答案!! ...但是我在这里找到了答案

parameters.ReferencedAssemblies.Add(typeof(<TYPE FROM DOMAIN.DLL>).Assembly.Location);

这意味着如果您尝试添加第三方dll引用(有时.net dlls也会给出例外(,那么只需将其复制到executable folder..它将正常工作..否则您也可以在那里定义完整路径。