Interop от 64 до 32 бит - как? - PullRequest
13 голосов
/ 17 мая 2009

Мне нужно интегрировать некий устаревший 32-битный код, для которого у меня нет исходного кода, в проект таким образом, чтобы его можно было вызывать из 64-битной сборки .NET. Исходный код реализован как 32-битный COM-объект в DLL. Windows не допускает прямых вызовов от 64 до 32-битных объектов, поэтому я ищу вдохновение, как справиться с этой ситуацией.

Как получить доступ к устаревшему 32-битному COM-объекту из 64-битной сборки .NET?

ОБНОВЛЕНИЕ: Мы обнаружили, что компонент COM сам по себе является оболочкой для некоторого ANSI C, для которого мы и создали первоисточник. Мы смогли скомпилировать это в Visual Studio как родной 64-битный dll и импортировать его в .NET - извините, чтобы переместить стойку ворот!

Ответы [ 3 ]

8 голосов
/ 17 мая 2009

Лучший подход - создать COM-сервер вне процесса, который обернет вашу 32-битную DLL. Затем вы можете вызвать это из 64-битного кода.

Вот объяснение основных понятий.

3 голосов
/ 22 июня 2011

Проверьте это сообщение в блоге . Вы можете ссылаться на 32-битную COM-сборку из 64-битного приложения .NET, используя вызываемую оболочку времени выполнения. Короткая версия следующая ...

  1. Используйте tlbimp.exe для создания 64-битной Callable Wrapper Runtime:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. Зарегистрируйте сборку COM (не RCW), если вы еще этого не сделали:

    regsvr32.exe foo.dll

  3. Ссылка на RCW (например, Interop.Foo.dll) из вашего приложения. Измените свою конфигурацию сборки на x64 и позвольте ей качаться.

3 голосов
/ 17 мая 2009

Что вам нужно сделать, это создать два процесса, взаимодействующих с IPC. Таким образом, один может быть 32-разрядным, а другой - 64-разрядным. Вам необходимо создать 32-программу, которая связывается с COM-объектом и предоставляет его API через некоторый механизм IPC, такой как именованный канал. Таким образом, ваша программа .NET может получить к ней доступ из другого процесса.

...