Как я могу динамически загружать необработанные сборки, содержащие неуправляемый код? (Минуя исключение проверки не проверяемой проверки кода)
Я приведу пример использования 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 на разные страницы, корректировку исправлений и т.д. Когда сборка загружается из необработанных байтов, эти необработанные байты отображаются в память как, и только управляемые метаданные считываются. Никакие данные или настройки безопасности не изменят это поведение.