Я создаю dll C ++ / CLI, которая будет загружена в устаревшее приложение 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 все еще была загружена.
Спасибо,
Макс
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
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
...
(отсюда до описать импорт и экспорт, но здесь это не важно)
Это полный результат неудачной загрузки.
Примечание: dll C ++ / CLI называется DsfClr.dll
вывод был получен путем запуска gflags.exe -i [exename] + sls и проверки результатов в отладчике
Использование подсказки, опубликованной ниже комментарий Рубена, я смог определить, что mscoree.dll действительно нацелен на AMD64, но pedump предоставляет неверную информацию, потому что он запускается в WOW64. При этом я все еще не могу загрузить эту библиотеку, если у кого-то есть предложения, они были бы очень признательны.
Еще одна вещь, которую я пробовал: я создал новое приложение C # и сослался на dll C ++ / CLI, затем в функции main () я создал экземпляр класса в dll C ++ / CLI.Это вызвало исключение нарушения прав доступа перед вызовом функции main (). Когда я удаляю экземпляр, основная функция работает нормально. Я предполагаю, что создание экземпляра вызывает задержку загрузки моей сборки C ++ / CLI, что вызывает ту же ошибку загрузки, которую я видел в собственной сборке.