Загрузка dll библиотек из сетевых ресурсов

Автор Тема: Загрузка dll библиотек из сетевых ресурсов  (Прочитано 8815 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
Здравствуйте, уважаемые форумчане! Подскажите, пожалуйста, как вы выходите из положения когда требуется загрузить dllку в автокад и сетевого ресурса?


Цитировать
"Не удалось загрузить сборку. Сведения об ошибке: System.IO.FileLoadException: Не удалось загрузить файл или сборку "file:///" либо одну из их зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515)
Имя файла: 'file:///' ---> System.NotSupportedException: Предпринята попытка загрузить сборку из сетевого ресурса, что в предыдущих версиях .NET Framework могло привести к помещению сборки в "песочницу". Этот выпуск .NET Framework не включает политику CAS по умолчанию, поэтому данная загрузка может быть опасной. Если эта нагрузка не предназначена для изоляции сборки, включите переключатель loadFromRemoteSources. Дополнительные сведения см. на странице http://go.microsoft.com/fwlink/?LinkId=155569.
   в System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   в System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   в System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   в System.Reflection.Assembly.LoadFrom(String assemblyFile)
   в Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
   в loadmgd()"

Очевидно, что если пользователей 100+ то не совсем рационально каждому в acad.config прописывать строчку
" <loadFromRemoteSources enabled="true"/> "

Также не помог способ из следующей статьи
sites.google.com/site/bushmansnetlaboratory/moi-zametki/ispolzovanie-na-lokalnoj-masine-bibliotek-razmeseennyh-na-servere-ili-v-internete

Что самое интересное у некоторых пользователей все-таки грузятся дллки без прописанной строчки в акад конфиг
" <loadFromRemoteSources enabled="true"/> "
« Последнее редактирование: 31-08-2016, 13:20:13 от Александр Ривилис »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Также не помог способ из следующей статьи
sites.google.com/site/bushmansnetlaboratory/moi-zametki/ispolzovanie-na-lokalnoj-masine-bibliotek-razmeseennyh-na-servere-ili-v-internete
Обозначенный способ указан для .Net 3.5. На некоторых компьютерах, временами, по непонятным причинам, в какой-то момент права, назначенные через caspol слетают. Повторное назначение того же уровня прав не помогает, приходится давать более высокие права (я об этом где-то уже писал).

Начиная с .Net 4 система безопасности в .Net была существенно переработана. Если мне не изменяет память, то caspol там так же попал под редактирование. Глянь эту тему: http://stackoverflow.com/questions/12011190/net-4-0-executing-network-assemblies

Очевидно, что если пользователей 100+ то не совсем рационально каждому в acad.config прописывать строчку
" <loadFromRemoteSources enabled="true"/> "
Очевидно, что ты сам себе создаёшь проблему с обновлениями: ты не сможешь обновить ресурсы, расположенные в сети, до тех пор, пока не будут завершены все приложения, использующие их. Учитывая твоё "100+" - делать ты это будешь ночью, когда никого в офисе нет.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
ИМХО будет проще кешировать по мере надобности эти dll на локальные машины и грузить их именно с локальных путей.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Учитывая твоё "100+" - делать ты это будешь ночью, когда никого в офисе нет.
Скорее вообще никогда, т.к. многие не выключают компы на ночь. У самого такая привычка, вечером встал и домой пошел, а утром пришел и продолжил с того же места, с теми же файлами...

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
Цитировать
Очевидно, что ты сам себе создаёшь проблему с обновлениями: ты не сможешь обновить ресурсы, расположенные в сети, до тех пор, пока не будут завершены все приложения, использующие их. Учитывая твоё "100+" - делать ты это будешь ночью, когда никого в офисе нет.

- а вот тут не согласен

я уже планировал обновить дллку которая используется на сетевом ресурсе и не мог ее обновить, но через управление мой компьютер - пкм - управление - действие - подключиться к другому компьютеру (выбираю серв где лежит дллка) и в Общих папка видны учетки которые грузят дллку и от тудва их спокойно можно отключить....

после такого отключения приходилось в кратчайшие сроки заменять дллку на серваке чтобы ее никто не успел прогрузить при запуске автокада
« Последнее редактирование: 31-08-2016, 13:20:56 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
ИМХО будет проще кешировать по мере надобности эти dll на локальные машины
Можно чуточку подробнее?)
Вы имеете ввиду лиспом копировать дллки из локального диска скажем в диск C и уже на диске C их запускать?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Необязательно лиспом. При старте ACAD'a проверить, загружены или нет dll, если не загружены - определить, изменились они на сервере или нет, и, если изменились, скопировать их оттуда. У Андрея в свое время где-то были статьи на эту тему, насколько я помню.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Отмечено как Решение bert 31-08-2016, 13:29:26

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
bert
Приветствую на форуме! Ты конечно имеешь право использовать любую схему для использования своей сборки, но прислушайся к советам бывалых.
Я бы предложил еще одну схему:
1. Ты создаёшь своё приложение (exe-файл), который прописывается в автозагрузку на всех 100+ компьютерах в сети и находится (!!!) на локальных PC (если это .NET приложение).
2. Это приложение занимается отслеживанием обновления сборки (dll-файл или несколько dll-файлов) и всех сопутствующих файлов на сервере и при возможности обновляет их на локальном PC. Само-собой соответствующий каталог на локальном PC должен быть доступен для записи. Отслеживание работает по таймеру (например 1 минута если файлов не много).
3. Если AutoCAD запущен, то обновление работать не будет, т.к. сборка занята. Если необходимо принудительное обновление, то достаточно завершить AutoCAD и подождать минуту-другую...
4. Приложение (exe-файл) следует тщательно протестировать сразу, так как обновление его будет связано со сложностями.
Это всё на уровне идеи, которую я когда-то реализовал и она работает. Единственная разница - у меня это не .NET приложение и не .NET сборка, а native exe-файл, и ряд arx-файлов, cui/cuix-файлов, dwg-файлов и т.д. И отслеживание по таймеру я не делал - мне достаточно было вставить exe-файл в автозагрузку Windows. А если требуется принудительное обновление, то AutoCAD завершают и запускают мой exe-файл, выполняющий обновление.

P.S.: Красным цветом на форуме пользуются только Администраторы/Модераторы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
Всем спасибо, оперативно отозвались на мой вопрос!
Александр Ривилис, Большое спасибо за совет, прислушаюсь к Вам и воспользуюсь данной схемой!

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
У меня создана dll'ка которая прописана в автозагрузке автокада у всех пользователей. Она обращается к БД сверяет соответствие локальной копии "набора софта" (если меняется хотя-бы одна dll - то считаем что весь набор новый) и в случае необходимости копирует и распаковывает новый набор и уже потом загружает его. БД удобней тем - что пишутся все логи что и у кого загружено и пр. - что несколько раз бывало полезно.

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
У меня тоже не exe, а dll, которая прописана всем в автозагрузку автокада, а она уже при загрузке автокада либо подгружает нужные dll из локальной директории, либо обновляет локальные копии с сетевой шары, а потом уже всё равно подгружает.
Сама первоначальная dll была упакована в виде msi-установщика, который прописывает что надо в автозагрузку, и копирует всё куда надо. Админы раскатывают это дело на все машины легко.
Подгрузка плагинов идёт с помощью Assembly.LoadFrom
Думал ещё как-то nuget для этого дела приспособить, да не было времени разобраться..
Алексей