Я создаю C ++ / CLI dll, который будет загружен в устаревшее приложение c ++.Устаревшее приложение делает это с традиционным вызовом LoadLibrary.И приложение, и DLL C ++ / CLI скомпилированы в 64-битном режиме.
Когда происходит вызов LoadLibrary, происходит сбой с ошибкой 193. Обычно это означает, что какой-то не 64-битный компонент пытается загрузить.Когда я смотрю на вывод загрузки dll в Visual Studio 2010, я вижу, что сбой происходит при загрузке mscoree.dll (если быть точным, я вижу, что моя dll загружена, затем mscoree загружена, затем mscoree выгружена, затем моя dll выгружена, то ошибка вернулась).В частности, C: \ Windows \ System32 \ mscoree.dll загружается, когда я проверяю этот файл mscoree.dll, я обнаруживаю, что он нацелен на I386.
Как я могу убедиться, что мое приложение будет ссылаться на правильный файл mscoree.dll?Я понимаю, что это можно сделать с помощью манифеста, но я не могу найти никакой хорошей информации о его создании.Идеальное решение позволит компилировать в 32-битном или 64-битном режиме и нацелить на правильный mscoree.dll.
В качестве дополнительного примечания я обнаружил mscoree.dll в параллельной папке, которую я проверил в 64-битном режиме, и скопировал ее в каталог моего приложения в надежде, что он первым подберет этот файл.Это не сработало, и версия C: \ Windows \ System32 все еще была загружена.
Спасибо,
Макс
Вывод файла CorFlags.exe на C ++ / CLI dll
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 16
ILONLY : 0
32BIT : 0
Signed : 0
Вывод файла pedump.exe на C: \ System32 \ mscoree.dll
PS C:\Windows\System32> pedump.exe .\mscoree.dll
Dump of file .\MSCOREE.DLL
File Header
Machine: 014C (I386)
Number of Sections: 0004
TimeDateStamp: 4B90752B -> Thu Mar 04 22:06:19 2010
PointerToSymbolTable: 00000000
NumberOfSymbols: 00000000
SizeOfOptionalHeader: 00E0
Characteristics: 2102
EXECUTABLE_IMAGE
32BIT_MACHINE
DLL
...
(отсюда далее идет pedump для описания импорта и экспорта, но это здесь не важно)
Расширенная информация о загрузке
Это полный вывод из-за сбоя загрузки.
Примечание: DLL-файл C ++ / CLI называется DsfClr.dllвывод был получен при запуске gflags.exe -i [exename] + sls и проверке результатов в отладчике
http://pastebin.com/FyumUiMN
ОБНОВЛЕНИЕ:
Используя опубликованный советВ приведенном ниже комментарии Рубена я смог определить, что mscoree.dll действительно нацелен на AMD64, но pedump предоставляет неверную информацию, поскольку он запускается в WOW64.При этом я до сих пор не могу загрузить эту библиотеку, если у кого-то есть какие-либо предложения, они будут очень благодарны.Я попробовал еще одну вещь: я создал новое приложение на C # и сослался на dll C ++ / CLI, затем в функции main () я создал экземпляр класса в dll C ++ / CLI.Это вызвало исключение нарушения доступа перед вызовом функции main ().Когда я удаляю экземпляры, основная функция работает нормально.Я предполагаю, что создание экземпляров вызывает задержку загрузки моей сборки C ++ / CLI, что приводит к той же ошибке загрузки, которую я видел из собственной сборки.