LoadLibrary 193

Я создаю 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 все еще была загружена.

Спасибо,

Макс

Вывод CorFlags.exe в dll C ++ / CLI

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
...

(отсюда до описать импорт и экспорт, но здесь это не важно)

Расширенная информация о загрузке

Это полный результат неудачной загрузки.

Примечание: 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, что вызывает ту же ошибку загрузки, которую я видел в собственной сборке.

5
задан Max Ehrlich 20 February 2012 в 04:38
поделиться