Assembly.UnsafeLoadFrom 导致 Web 应用程序崩溃

Posted

技术标签:

【中文标题】Assembly.UnsafeLoadFrom 导致 Web 应用程序崩溃【英文标题】:Assembly.UnsafeLoadFrom causes web app crash 【发布时间】:2017-01-03 15:17:48 【问题描述】:

我正在尝试从 Internet 加载 DLL,更具体地说,它是 Azure 存储 (Blob),因此我使用了“Assembly.UnsafeLoadFrom”,如下所示:

Assembly.UnsafeLoadFrom(@"https://accountname.blob.core.windows.net/test/calculator.dll");

但是因为设置了这个特定的调用,我的网络应用(已发布)返回:

"指定的 CGI 应用程序遇到错误并且服务器 终止进程。”

奇怪的是,如果我使用本地构建,那很好。没有崩溃,返回结果正确。

我正在使用 Visual Studio 2015 和 .net 5。

请告诉我如何解决此问题或如何调试它。

谢谢

【问题讨论】:

“test”容器(“calculator.dll”blob 所在的“)是否设置为允许公共访问?(我不建议这样做,但上面的代码行不会没有它就可以工作。)更好的解决方案可能是创建一个共享访问签名来访问 blob,并将完整的 URL(上面的 URl + SAS)传递给 Assembly.UnsafeLoadFrom() (或您使用的任何其他内容。)没有其中之一两种解决方案,对 Azure Storage 的请求不会被认证。 @AdamSorrin-MSFT 是的,该 dll 是可公开访问的。 【参考方案1】:

对于一个简单的方法,您可以通过以下代码实现您的目的:

calculator.dll

public class Calculator

    public string HelloWorld(string userName)
    
        return string.Format("Hello world, 0!", userName);
    

HomeController.cs

public async Task<ActionResult> Index()

    string url = "https://brucechen.blob.core.windows.net/dll/calculator.dll";
    HttpClient client = new HttpClient();
    var bytes = await client.GetByteArrayAsync(url);
    //load assembly from bytes
    Assembly assembly = Assembly.Load(bytes);
    var calc = assembly.CreateInstance("calculator.Calculator");
    //invoke the method and get result
    var result = calc.GetType().InvokeMember("HelloWorld", BindingFlags.InvokeMethod, null, calc, new[]  "Bruce" );
    ViewData["result"] = result;
    return View();

结果

【讨论】:

它可以工作。另一种工作方式是先下载文件然后使用它。

以上是关于Assembly.UnsafeLoadFrom 导致 Web 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

思维导图学习---计算机相关基础思维导图

思维导图学习---计算机相关基础思维导图

MindManager思维导图教程:HTML5交互式导图

怎样利用思维导图模板绘制思维导图?分享几款常用的思维导图模板

在线思维导图软件,5分钟让你做出思维导图

手机怎么做思维导图