c# – 使用CompileAssemblyFromSource加载自定义程序集

c# – 使用CompileAssemblyFromSource加载自定义程序集,第1张

概述我不太清楚该怎么做.总体目标是能够获取用户脚本,并在.NET环境中执行它.我已经编写了大部分代码并且工作正常,我不会尝试加载自己的程序集.但是,为了安全地让用户访问系统的内部部分,已经创建了代理DLL.这就是问题所在. 现在这个代理DLL有一个东西,一个接口. CompilerParameters options = new CompilerParameters();options.Genera 我不太清楚该怎么做.总体目标是能够获取用户脚本,并在.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 : Could not load file or assembly
‘file:///C:\Users…\AppData\Local\Temp\scts5w5o.dll’ or one of its
dependencIEs. The system cannot find the file specifIEd.

当然我的第一个想法是,“……什么是scts5w5o.dll?”

这是ScriptProxy.dll无法正确加载,还是ScriptProxy.dll本身试图加载依赖项,这些依赖项位于某个临时文件中?或者它是完全不同的东西?

我应该提一下,我正在从NUnit测试运行器执行此代码.我不确定这是否有所作为.

解决方法 这是因为编译步骤失败,您没有检查错误…
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;    }
总结

以上是内存溢出为你收集整理的c# – 使用CompileAssemblyFromSource加载自定义程序集全部内容,希望文章能够帮你解决c# – 使用CompileAssemblyFromSource加载自定义程序集所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存