0

Я пытаюсь загрузить DLL из Интернета, более конкретно это Azure хранения (Blob), так что я использовал «Assembly.UnsafeLoadFrom», как это:Assembly.UnsafeLoadFrom вызывает веб-приложение аварии

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

Но becuaset этот конкретный вызов, мой веб-приложение (опубликовано) возвращает:

«указанное приложение CGI произошла ошибка и сервер завершение процесса.»

Странная часть, если я использую свою локальную сборку, это нормально. нет сбоя, и результат возврата правильный.

Я использую Visual Studio 2015 и .NET 5.

Пожалуйста, дайте мне знать, как решить эту проблему, или, как его отладить.

Благодаря

+0

Является ли контейнер «тест» (в котором «calculator.dll» капля ") постоянно находится набор для обеспечения доступа общественности? (Я бы не рекомендовал этого, но вышеприведенная строка кода не будет работать без него.) Лучшее решение, вероятно, заключается в создании подписи общего доступа для доступа к блобе и передачи полного URL (URl выше + SAS) в Assembly.UnsafeLoadFrom() (или что бы вы ни использовали). Без одного из этих двух решений запрос к Azure Storage не будет аутентифицирован. –

+0

@ AdamSorrin-MSFT Да, эта библиотека общедоступна. – derek

ответ

0

Для простой, вы могли бы достичь своей цели с помощью следующего кода:

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(); 
} 

Результат

+0

Он может работать. Другой рабочий путь - сначала загрузить файл, а затем использовать его. – derek