AnyCPU C # DLL в 64-битном процессе загружает 32-битную DLL - PullRequest
2 голосов
/ 26 апреля 2011

У меня 64-битный процесс C ++, который загружает AnyCPU C # DLL.Может ли эта AnyCPU C # DLL загружать 32-битные C ++ DLL, или она может загружать только 64-битные DLL?

Спасибо!: -)

Ответы [ 4 ]

7 голосов
/ 26 апреля 2011

AnyCPU DLL работает в контексте вызывающего процесса, который по вашему вопросу равен x64.Если эта библиотека AnyCPU загружает другую библиотеку DLL, она также выполняется в контексте вызывающего процесса x64, который загрузил библиотеку AnyCPU.Это проблема с запуском кода на разных платформах.Если вы хотите запустить 32-битную DLL с помощью x64-процесса, который вызывает AnyCPU DLL, вам нужно создать что-то, называемое процессом SURROGATE - это в основном x86 (32-битный) процесс, который может запускаться и загружать 32-битную DLLвы хотите получить доступ из вызывающего процесса x64.Как только вы запустите этот процесс x86, этот процесс x64 сможет взаимодействовать с процессом x86 (который загрузил DLL-библиотеку x86), используя межпроцессное взаимодействие, и будет обеспечен косвенный вызов функций DLL x86 из процесса x64.

2 голосов
/ 26 апреля 2011

Вы можете загружать dll только с той же битностью, что и процесс. Сама Any CPU dll может быть загружена как в 64-, так и в 32-битные процессы, но это не означает, что она может загружать собственные 32-битные библиотеки в 64-битные процессы.

Единственный известный мне обходной путь - это 32-битный вспомогательный процесс, который загружает вашу 32-битную DLL и затем связывается с этим процессом.

1 голос
/ 26 апреля 2011

Нет, вы не можете загружать 32-битные DLL в 64-битный процесс.

AnyCPU означает, что C # DLL может быть загружена в 32-битный или 64-битный процесс, но нечто он может загружать DLL любой битности.

0 голосов
/ 26 апреля 2011

32-битная DLL не может быть загружена в 64-битном процессе.

Я вижу проблему в вашем вопросе: это невозможно, ваша AnyCPU сборка загружает 32-битную C ++ dll, поскольку она делает сборку специфичной для этой архитектуры.

Создание этого AnyCPU означает, что он будет динамически загружать DLL, специфичную для архитектуры, на которой он работает. Таким образом, он работает на Любой процессор .

Короче говоря, сборка ошибочно помечена как AnyCPU.

...