Как динамически загружать необработанные сборки, содержащие неуправляемый код?(В обход исключения "Проверка политики не удалось проверить кодом")
Я собираюсь привести пример использования 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 ответа
Мы являемся жертвой грубого сообщения об исключении. Загрузка сборок с помощью Assembly.Load(byte[]), которые содержат неуправляемый код, не поддерживается. Это тема этого элемента обратной связи.
ОБНОВЛЕНИЕ: связанный элемент обратной связи исчез, удален как часть очистки во время выпуска VS2012. Единственная часть, которую он может восстановить, это фрагмент, скопированный с другой веб-страницы:
"[…] Мы разрешаем загружать только изображения ILOnly […], поскольку все остальное не безопасно" -
ОБНОВЛЕНИЕ: исправлена ссылка с резервной копией archive.org.
Проблема в том, что CLR не выполняет обычные шаги загрузки DLL - например, отображение отдельных разделов библиотеки DLL на разные страницы, корректировка исправлений и т. Д. Когда сборка загружается из необработанных байтов, эти необработанные байты отображаются в память как есть, и только управляемые метаданные читаются. Никакое количество доказательств или настроек безопасности не изменит это поведение.