Assembly.Load для dll, которая находится на удаленном сервере

Автор Тема: Assembly.Load для dll, которая находится на удаленном сервере  (Прочитано 3806 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ToffeeАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
  • Skype: BorodaInside
Добый день. Делаю плагин для Revit. Захотел основные расчеты перенести в отдельную dll, которая будет храниться на сервере, а у пользователя будет выполняться запрос на сервер. Для теста сделал 2 dll. В одной (test.dll) через рефлексию обращаюсь ко второй (TestServerApp.dll).
Затык в классе Assembly.
Если я указываю путь ко второй dll через абсолютный путь на компе, то все работает.



Если я эту же dll (TestServerApp.dll)) загружаю на яндекс диск и получаю на нее ссылку



Массив байтов скачивается



но при загрузке в сборку выдает ошибку



Хочется понять что я делаю не так.
Ответы искал по интернету. В основном советуют компилировать dll для 64 битных систем. Но это для тех, у кого вторая dll вообще не подключается.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Проверь, что тебе реально прилетает в ответ от сервера. У меня сработало:

Код - C# [Выбрать]
  1. using System;
  2. using System.Net;
  3. using System.Reflection;
  4.  
  5. namespace ConsoleApp1
  6. {
  7.     class Program
  8.     {
  9.         static void Main()
  10.         {
  11.             var webClient = new WebClient();
  12.  
  13.             var remoteLibraryContent = webClient.DownloadData("https://alleria.storage.googleapis.com/temp/RemoteLib.dll");
  14.  
  15.             var library = Assembly.Load(remoteLibraryContent);
  16.  
  17.             var testType = library.GetType("RemoteLib.TestClass");
  18.  
  19.             var testMethod = testType.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
  20.  
  21.             var testObject = Activator.CreateInstance(testType);
  22.  
  23.             testMethod?.Invoke(testObject, Array.Empty<object>());
  24.  
  25.             Console.ReadKey();
  26.         }
  27.     }
  28. }
  29.  

Оффлайн ToffeeАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
  • Skype: BorodaInside
Да, с вашей библиотекой работает. Также скачал ее через LoadData. Тоже работала. Но когда закинул ее на яндекс диск и попытался скачать, то выскочила ошибка. Видимо с яндекс диска не так качает.
Вы свою dll куда выложили?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Toffee,
Вообще-то у вас на картинке ссылка не на Яндекс-диск, а на onedrive.live.com (Microsoft). А вы попробуйте сохранить массив байт, скачанный с сайта и загрузить его через Assembly.LoadFrom(). Заодно и сравните скачанный файл с оригиналом.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Можно попробовать сохранить массив байт, полученный при скачивании с помощью WebClient-а. Есть вероятность, что там html / json / whatever else с указанием на ошибку. Возможно просто требуется авторизация

Вы свою dll куда выложили?

google cloud

Оффлайн ToffeeАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
  • Skype: BorodaInside
Вообще-то у вас на картинке ссылка не на Яндекс-диск, а на onedrive.live.com (Microsoft)

Да, это я на разные облачные хранилища выкладывал. Везде одна и та же ошибка.

А вы попробуйте сохранить массив байт, скачанный с сайта и загрузить его через Assembly.LoadFrom()

Код - C# [Выбрать]
  1. WebClient wc = new WebClient();
  2. byte[] testServerApp_dll = wc.DownloadData(url);
  3. wc.DownloadFile(url, "d:\\TestServerApp.dll");
  4. Assembly asm = Assembly.LoadFrom("d:\\TestServerApp.dll");



Можно попробовать сохранить массив байт, полученный при скачивании с помощью WebClient-а. Есть вероятность, что там html / json / whatever else с указанием на ошибку. Возможно просто требуется авторизация
Скорее всего с авторизацией что-то.
Спасибо. Буду ковырять дальше.
« Последнее редактирование: 08-09-2021, 20:41:41 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Toffee,
Обрати внимание на правило форматирования кода (ссылка у меня в подписи) у нас на форуме и соблюдай его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 05-09-2021, 17:55:21

    А вы попробуйте сохранить массив байт, скачанный с сайта и загрузить его через Assembly.LoadFrom()


Код - C# [Выбрать]

    WebClient wc = new WebClient();
    byte[] testServerApp_dll = wc.DownloadData(url);
    wc.DownloadFile(url, "d:\\TestServerApp.dll");
    Assembly asm = Assembly.LoadFrom("d:\\TestServerApp.dll");



А содержимое файла d:\TestServerApp.dll ты после этого смотрел? Что там?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ToffeeАвтор темы

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
  • Skype: BorodaInside
А содержимое файла d:\TestServerApp.dll ты после этого смотрел? Что там?
там ничего. и размер скачанного файла отличается от исходного


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Toffee,
Ты бы его в Блокноте посмотрел - там скорее всего текстовый файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение