Возникла исключительная ситуация при динамической загрузке сборки EXE в C ++ / CLI (не удалось загрузить файл или сборку ', версия = 1.0.3836.39802 ...) - PullRequest
2 голосов
/ 03 июля 2010

Я сталкиваюсь с исключением в C ++ / CLI при динамической загрузке сборки, которая сама создает EXE в управляемом режиме C ++ / CLI, используя Assembly.Load.Он успешно загружает сборку DLL, но не может загрузить сборку EXE и генерирует следующее исключение:

Произошло необработанное исключение типа 'System.IO.FileLoadException' в TestManager.dll

Не удалось загрузить файл или сборку 'testAssembly, версия = 1.0.3836.39802, культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей.Попытка загрузить непроверяемый исполняемый файл с исправлениями (IAT с более чем 2 разделами или разделом TLS.)

Исключение из HRESULT: 0x80131019

Сам TestManager.dll является управляемым dllи загружается в другой процесс CLR в CLI и пытается загрузить сборку EXE как отдельный процесс, но завершается неудачно и создает исключение.

Возможно, это связано с игрой в смешанных режимах.

Ответы [ 3 ]

4 голосов
/ 03 июля 2010

"Смешанный режим C ++ EXE не может быть перемещен в память должным образом при загрузке в качестве сборочной сборки. Вот почему происходит сбой во время выполнения."

Цитата из Ответ Microsoft на эту ошибку в Connect, где объясняют, что не собираются это исправлять (слишком много проблем для редкой ситуации).

1 голос
/ 01 марта 2017

TL; DR: измените тип сборки со смешанного на управляемый, изменив поддержку CLR с /clr на /clr:pure.

подробности:
У меня сегодня была очень похожая ситуация:
У меня есть различные управляемые библиотеки DLL, все скомпилированы с /clr, потому что некоторые из них импортируют собственные библиотеки DLL.
У меня есть EXE, также скомпилированный с /clr.
Все они написаны на C ++ / CLI.

До сих пор все пользовательские элементы управления находились в DLL. Сегодня я создал UC в сборке EXE и хотел вставить этот UC в основной форме EXE. Это не удалось и просто сказал

Не удалось загрузить элемент панели инструментов. Он будет удален из панели инструментов.

Ничего другого.

Итак, я создал новый проект winforms, добавил ссылку на EXE (работал) и попытался добавить элементы управления EXE в Visual Studio Designer Toolbox. Последнее действие не выполнено, сообщение об ошибке было

Попытка загрузить непроверяемый исполняемый файл с исправлениями (IAT с более чем 2 разделами или разделом TLS.)

Со вторым сообщением об ошибке я нашел этот пост Stackoverflow, где @Stephen явно выше кавычек

"Смешанный режим C ++ EXE не может быть перемещен в память должным образом, когда загружается как ссылка на сборку. Вот почему есть время выполнения неудача. "

из MSDN. Это означает, что я компилировал в сборку EXE смешанного режима, если сообщение было правильным. Поэтому я посмотрел, где можно изменить тип создаваемой сборки, и обнаружил Смешанные (собственные и управляемые) сборки на MSDN, ссылки на некоторые страницы с подробными описаниями, одна из которых Чистый и проверяемый код (C ++ / CLI) . Там я увидел, что мне нужно использовать /clr:pure.

После изменения этого параметра для моей сборки EXE (не DLL, они остаются смешанными), я смог добавить его в VS Designer Toolbox тестового проекта, а также вставить UC в основную форму EXE.

0 голосов
/ 04 июля 2010

Я думаю, вам нужно использовать именованные каналы для межпроцессного взаимодействия в .NET.Assembly.Load не будет работать для сборок EXE.

...