Невозможно загрузить C ++ DLL в приложении C # в Vista x64 - PullRequest
1 голос
/ 04 декабря 2008

У меня есть DLL, написанная на C ++, которая должна использоваться приложением на C #. Он отлично работает под Vista x86, но под x64 не загружается. Поэтому я создаю версию DLL для x64 и определяю, является ли операционная система x86 или x64, и использую соответствующий вызов взаимодействия с соответствующей DLL. Это хорошо работает под Vista x86, но под Vista x64 я получаю ошибку «side-by-side» при попытке загрузить DLL. Почему он не загружается и что можно сделать, чтобы это исправить? (Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, я не уверен, какая информация имеет отношение к устранению неполадок этой проблемы.)

Ответы [ 5 ]

3 голосов
/ 04 декабря 2008

Первая идея: не могли бы вы попытаться установить для параметра «Цель платформы» в части проекта C # значение «x86», чтобы посмотреть, будет ли он работать в режиме 32-разрядной совместимости на компьютере с ОС Vista 64?

Было бы полезно получить дополнительную информацию об ошибке SxS - она ​​может быть связана с некоторыми конкретными (32-разрядными?) Версиями библиотек времени выполнения, которые не установлены?

2 голосов
/ 04 декабря 2008

Redist для VC90 для x64 должен быть установлен на клиентском компьютере. Что касается манифеста, то я думаю, что вы можете изменить его, чтобы удалить тег CPU. Либо так, либо скажи «любой».

2 голосов
/ 04 декабря 2008

дополнительная информация к ответу MadKeithV:

В Windows x64 процесс может быть запущен как 32-битный или 64-битный процесс. 64-битный процесс может загружать только 64-битные библиотеки, а 32-битный процесс - только 32-битные библиотеки.

Если цель вашей платформы (например, указанная в свойствах проекта) вашего приложения .Net установлена ​​на «Любой ЦП», промежуточный код будет скомпилирован в 32-битный или 64-битный код в зависимости от целевой платформы, т.е. в системе x64 Будет создан 64-битный код.

Поэтому код больше не может загружать 32-битные DLL.

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

1 голос
/ 04 декабря 2008

Если ничего не работает .. вы можете попробовать Process Monitor . Он показывает, какой файл (зависимость) не был найден .. это может дать вам подсказку для продолжения.

0 голосов
/ 04 декабря 2008

Скорее всего, параллельная ошибка вызвана тем, что вы установили параметры файла манифеста c ++ dll, либо они не внедряются, либо вы решили не встраивать манифест и используете манифест 32-битных версий.

Простое решение - пометить ваше приложение на c # как чашку x86 и запустить с 32-битной DLL.

...