2009-05-17 2 views
13

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

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

UPDATE: Мы обнаружили, что COM-компонент сам по себе является оберткой вокруг некоторого ANSI C, который мы используем для исходного источника. Мы смогли скомпилировать это в Visual Studio как родную 64-разрядную dll и импортировать ее в .NET - извините за то, что переместили стойки ворот!

+0

Комментарий, поскольку я этого не сделал, но вам нужно убедиться, что вы запускаете COM-объект как внепроцессный сервер. Если вы загрузите его как in-process, он будет работать как 64-разрядный, что не удастся. –

ответ

8

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

Here is an explanation основных понятий.

+0

Я немного переместил ворота, потому что мы обнаружили некоторый исходный код, который привел нас к другому решению. Я принимаю этот ответ, поскольку считаю, что он наилучшим образом отвечает на исходный вопрос и ссылки на полезные материалы для чтения. –

3

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

+0

Этот подход работает, хотя, если вы уже используете COM, зачем переключаться на именованные каналы вместо использования COM-взаимодействия? –

+0

@Reed Copsey: Да, конечно, вы могли бы использовать это для COM. Но мой подход более общий; он может работать и для нормальных библиотек. – Zifre

+0

Я думал об использовании WCF для создания IPC с использованием именных каналов. Проблема только в том, что на обоих концах трубы нужно увидеть одно и то же определение интерфейса, которое должно быть в 32-битной сборке. Все это взрывается, когда вы пытаетесь запустить его. –

3

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

  1. Использование tlbimp.exe для создания 64 битную время выполнения вызываемой оболочки:

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

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

    regsvr32.exe foo.dll

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

+0

Это не решение исходной проблемы. –

Смежные вопросы