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

Я приведу пример использования 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) ".  Скажем, я пытаюсь загрузить эту сборку на дочернем AppDomain, как я могу настроить безопасность AppDomain, чтобы позволить мне пройти проверку политики?

Ответы

Ответ 1

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

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

"[...] мы разрешаем загружать только ILOnly изображения [...], поскольку ничего другого не безопасно" -

UPDATE: исправлена ​​ссылка с резервной копией archive.org.

Ответ 2

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