2010-05-31 3 views
14

Я приведу пример использования 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, чтобы позволить мне пройти проверку политики?

+0

http://stackoverflow.com/a/24037103/1005741 Это может помочь кому-то! – hriziya

ответ

13

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

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

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

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

+0

Не могли бы вы привести пример создания соответствующего объекта доказательства? –

+0

Вы пытались использовать AppDomain.Current.Evidence? –

+0

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

11

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