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 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章