Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Toffee от 05-09-2021, 10:48:54

Название: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Toffee от 05-09-2021, 10:48:54
Добый день. Делаю плагин для Revit. Захотел основные расчеты перенести в отдельную dll, которая будет храниться на сервере, а у пользователя будет выполняться запрос на сервер. Для теста сделал 2 dll. В одной (test.dll) через рефлексию обращаюсь ко второй (TestServerApp.dll).
Затык в классе Assembly.
Если я указываю путь ко второй dll через абсолютный путь на компе, то все работает.

(https://i.postimg.cc/MnZYSKqj/2021-09-01-17-26-02.png) (https://postimg.cc/MnZYSKqj)

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

(https://i.postimg.cc/MMZccX3y/2021-09-01-17-31-29.png) (https://postimg.cc/MMZccX3y)

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

(https://i.postimg.cc/xk6f45gz/2021-09-01-17-35-23.png) (https://postimg.cc/xk6f45gz)

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

(https://i.postimg.cc/V58wW3zV/2021-09-01-17-36-31.png) (https://postimg.cc/V58wW3zV)

Хочется понять что я делаю не так.
Ответы искал по интернету. В основном советуют компилировать dll для 64 битных систем. Но это для тех, у кого вторая dll вообще не подключается.
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Игнатович от 05-09-2021, 11:37:09
Проверь, что тебе реально прилетает в ответ от сервера. У меня сработало:

Код - 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.  
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Toffee от 05-09-2021, 17:49:55
Да, с вашей библиотекой работает. Также скачал ее через LoadData. Тоже работала. Но когда закинул ее на яндекс диск и попытался скачать, то выскочила ошибка. Видимо с яндекс диска не так качает.
Вы свою dll куда выложили?
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Ривилис от 05-09-2021, 17:55:21
Toffee,
Вообще-то у вас на картинке ссылка не на Яндекс-диск, а на onedrive.live.com (Microsoft). А вы попробуйте сохранить массив байт, скачанный с сайта и загрузить его через Assembly.LoadFrom(). Заодно и сравните скачанный файл с оригиналом.
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Игнатович от 05-09-2021, 18:10:21
Можно попробовать сохранить массив байт, полученный при скачивании с помощью WebClient-а. Есть вероятность, что там html / json / whatever else с указанием на ошибку. Возможно просто требуется авторизация

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

google cloud
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Toffee от 08-09-2021, 10:20:25
Вообще-то у вас на картинке ссылка не на Яндекс-диск, а на 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");

(https://i.postimg.cc/7bsmzTwY/2021-09-08-10-17-30.png) (https://postimg.cc/7bsmzTwY)

Можно попробовать сохранить массив байт, полученный при скачивании с помощью WebClient-а. Есть вероятность, что там html / json / whatever else с указанием на ошибку. Возможно просто требуется авторизация
Скорее всего с авторизацией что-то.
Спасибо. Буду ковырять дальше.
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Ривилис от 08-09-2021, 20:41:20
Toffee,
Обрати внимание на правило форматирования кода (ссылка у меня в подписи) у нас на форуме и соблюдай его.
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Ривилис от 08-09-2021, 20:42:44
Цитата: Александр Ривилис от 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 ты после этого смотрел? Что там?
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Toffee от 09-09-2021, 12:10:37
А содержимое файла d:\TestServerApp.dll ты после этого смотрел? Что там?
там ничего. и размер скачанного файла отличается от исходного
(https://i.postimg.cc/PNyZLrN4/2021-09-09-12-08-23.png) (https://postimg.cc/PNyZLrN4)
Название: Re: Assembly.Load для dll, которая находится на удаленном сервере
Отправлено: Александр Ривилис от 09-09-2021, 18:08:38
Toffee,
Ты бы его в Блокноте посмотрел - там скорее всего текстовый файл.