Ответ 1
Лучшим подходом является создание COM-сервера вне процесса, который обертывает вашу 32-разрядную DLL. Затем вы можете вызвать это из 64-битного кода.
Вот объяснение основных понятий.
Мне нужно интегрировать некоторый старый 32-разрядный код, для которого у меня нет исходного кода, в проект таким образом, что его можно вызывать из 64-разрядной сборки .NET. Исходный код реализован как 32-битный COM-объект в DLL. Windows не разрешает прямые вызовы от 64 до 32-битных объектов, поэтому я ищу вдохновение в том, как справляться с этой ситуацией.
Как можно получить доступ к устаревшему 32-битовому COM-объекту из 64-разрядной сборки .NET?
UPDATE: Мы обнаружили, что COM-компонент сам по себе является оберткой вокруг некоторого ANSI C, который мы используем для исходного источника. Мы смогли скомпилировать это в Visual Studio как родную 64-разрядную dll и импортировать ее в .NET - извините за то, что переместили стойки ворот!
Лучшим подходом является создание COM-сервера вне процесса, который обертывает вашу 32-разрядную DLL. Затем вы можете вызвать это из 64-битного кода.
Вот объяснение основных понятий.
Что вам нужно сделать, так это создать два процесса, взаимодействующих с IPC. Таким образом, может быть 32 бит, а один может быть 64 бит. Вам нужно создать программу 32, которая связывается с объектом COM и предоставляет свой API через некоторый механизм IPC, такой как именованный канал. Таким образом ваша программа .NET может получить к ней доступ из другого процесса.
Отметьте это сообщение в блоге. Вы можете ссылаться на 32-битную COM-сборку из 64-разрядного .NET-приложения, используя оболочку, предназначенную для выполнения. Короткий вариант следующий...
Используйте tlbimp.exe для создания 64-битного обзвона, совместимого со временем выполнения:
tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll
Зарегистрируйте сборку COM (а не RCW), если вы еще этого не сделали:
regsvr32.exe foo.dll
Ссылка на RCW (например, Interop.Foo.dll
) из вашего приложения. Измените конфигурацию сборки на x64 и дайте "рок".