Как динамически загружать необработанные сборки, которые содержат неуправляемый код? - PullRequest
18 голосов
/ 31 мая 2010

Я собираюсь привести пример использования System.Data.SQLite.DLL , который представляет собой смешанную сборку с неуправляемым кодом: Если я выполню это:

  var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL")

Никаких исключений не выдается, но если я сделаю это:

  var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL");
  var assembly = Assembly.Load(rawAssembly);

CLR создает исключение FileLoadException с «Проверка политики не удалось проверить кодом. (Исключение из HRESULT: 0x80131402)». Допустим, я пытаюсь загрузить эту сборку на дочерний домен приложения, как я могу настроить безопасность домена приложения, чтобы я мог пройти проверку политики?

Ответы [ 2 ]

17 голосов
/ 31 мая 2010

Мы жертва враждебного сообщения об исключении. Загрузка сборок с помощью Assembly.Load (byte []), содержащих неуправляемый код, не поддерживается. Это предмет этого элемента обратной связи .

ОБНОВЛЕНИЕ: связанный элемент обратной связи исчез, удален как часть очистки во время выпуска VS2012. Единственная его часть, которую можно восстановить, - это фрагмент, скопированный с другой веб-страницы:

«[…] мы разрешаем загружать только изображения ILOnly […], поскольку все остальное не безопасно» -

ОБНОВЛЕНИЕ: исправлена ​​ссылка с резервной копией archive.org.

12 голосов
/ 27 мая 2011

Проблема в том, что CLR не выполняет обычные шаги загрузки DLL - например, отображение отдельных разделов dll на разные страницы, корректировка исправлений и т. Д. Когда сборка загружается из необработанных байтов, эти необработанные байты отображаются в памяти как и считываются только управляемые метаданные. Никакое количество доказательств или настроек безопасности не изменит это поведение.

...