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