Проблема взаимодействия в .NET - PullRequest
2 голосов
/ 16 января 2009

У меня есть 32-битная управляемая сборка, которая обращается к 32-битному компоненту COM. Когда я компилирую сборку, используя 64-битный флаг, я получаю сообщение об ошибке, когда пытаюсь получить доступ к 32-битному компоненту COM из него.

Есть ли способ обойти эту проблему?

Ответы [ 5 ]

2 голосов
/ 16 января 2009

В дополнение к уже предоставленным ответам:

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

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

Следовательно, код больше не может загружать 32-битную DLL в 64-битной системе.

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

2 голосов
/ 16 января 2009

Когда вы используете 64-битный флаг и работаете на 64-битной ОС, сборка загружается в 64-битный процесс. Подавляющее большинство COM-объектов создаются как «In Proc Servers».

Первым шагом в создании «in proc server» является загрузка DLL, содержащей COM-объект, в процесс, выполняющий создание. DLL является 32-битной и не может быть загружена в процесс.

Вы, к сожалению, застряли с 2 вариантами

  1. Явно скомпилируйте EXE-файл .Net для 32-разрядных
  2. Напишите компонент, чтобы он мог размещаться в своем собственном процессе. Даже тогда я не уверен, насколько легко будет заставить 32-битный и 64-битный процесс общаться друг с другом.
1 голос
/ 16 января 2009

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

0 голосов
/ 02 мая 2009

Когда процесс загружается как x64, вы не можете загружать двоичные файлы / сборки / что-либо x86.

0 голосов
/ 16 января 2009

Вы можете попробовать использовать corflags (может / не работать) или настроить приложение на компиляцию только в 32-битной версии.

corflags <assemblyname> /32bit-

, который снимает 32-битное ограничение для сборок .Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...