Не удалось загрузить файл или сборку - PullRequest
4 голосов
/ 06 июля 2010

Это мое сообщение об ошибке:

Не удалось загрузить файл или сборку 'file: /// C: \ Windows \ system32 \ Rule.dll'. Система не может найти указанный файл.

Проблема в том, что тот же самый exe работает в моей среде разработки, но не на производительном сервере. Программа представляет собой инструмент, который должен запускаться как запланированная задача в Windows Server 2008. Он состоит из исполняемого файла, одного так называемого Database.dll и Rule.dll. Exe-файл должен динамически загружать Rule.dll в codebehind, но он завершается с ошибкой, указанной выше, только при запуске из планировщика задач. Почему он смотрит в папку System32, а не в папку приложения? Это проблема UAC? ​​

'Load the rule engine into memory
Dim asmRule As System.Reflection.Assembly = Nothing
Try
  asmRule = System.Reflection.Assembly.LoadFrom("Rule.dll") 'fails on productive system
Catch ex As System.Exception
  HistoryLog.writeLog("SysLog", ex, "Cannot find Rule.dll in Application Folder")
End Try

Ответы [ 4 ]

7 голосов
/ 06 июля 2010

Метод LoadFrom будет использовать Environment.CurrentDirectory для построения полного пути к загружаемой сборке. Текущий каталог не совпадает с базовым путем приложения.

Вы должны указать полный путь к методу LoadFrom, его можно создать с помощью AppDomain.CurrentDomain.BaseDirectory, если файл находится в той же папке, что и исполняемый файл.

7 голосов
/ 06 июля 2010

Вы пробовали:

asmRule = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"));
2 голосов
/ 06 июля 2010

Проверьте папку system32 рабочего сервера на наличие файла с именем Rule.dll.«Проверка» или попытка загрузки сборки из системной папки может произойти до попытки загрузки из папки приложения.

Это перечисленный недостаток LoadFrom в MSDN :

Если сборка загружена с LoadFrom, и путь проверки включает сборку с тем же идентификатором, но с другим местоположением, InvalidCastException, MissingMethodException или может возникнуть другое непредвиденное поведение.1010 *

Если это так, и вы не можете удалить Rule.dll из system32, то вы можете указать полный путь к сборке.

1 голос
/ 06 июля 2010

Установите задачу «Пуск в» в той же папке, что и исполняемый файл (в Windows 7 это на странице свойств, на которой вы настраиваете путь запуска приложения) - таким образом, текущая папка (из среды) во время работы приложения совпадает с папкой приложения.Затем .Net должна использовать эту папку при разрешении путей без рутирования.

То, что вы видите, я считаю, является распространенной проблемой, которую вы также можете получить с помощью ярлыков.

То есть -папка автозагрузки устанавливается так же, как корень планировщика задач - чья библиотека запуска находится в каталоге c: \ windows \ system32

Тот факт, что «он работает на моей машине (tm)», вероятно, потому, чтокогда вы отлаживаете его локально, вы запускаете его напрямую?

Другие ответы здесь, которые предлагают использовать BaseDirectory, также будут работать.

Точно так же вы можете также изменить код на использование полного имени сборкии просто используйте Assembly.Load.Тем не менее, это сломается, если версия / culture / publickeytoken этого DLL изменится в будущем.Конечно, это можно исправить, используя файл .config, чтобы указать имя загружаемой библиотеки DLL, а не жестко ее кодировать.Который - в любом случае - хорошая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...