Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

64 to 32 bit Interop - how?

I need to integrate some legacy 32-bit code - for which I don't have the source code, into a project in such a way that it can be called from a 64-bit .NET assembly. The original code is implemented as a 32-bit COM object in a DLL. Windows doesn't allow direct calls from 64 to 32-bit objects, so I'm looking for inspiration on how to deal with this situation.

How can a legacy 32-bit COM object be accessed from a 64-bit .NET assembly?

UPDATE: We discovered that the COM component was itself a wrapper around some ANSI C, which we founf the original source for. We were able to compile that in Visual Studio as a native 64-bit dll, and import that into .NET - sorry to move the goalposts!

like image 823
Tim Long Avatar asked May 17 '09 18:05

Tim Long


3 Answers

The best approach is to make an out of process COM server that wraps your 32-bit DLL. You can then call this from 64bit code.

Here is an explanation of the basic concepts.

like image 137
Reed Copsey Avatar answered Nov 08 '22 13:11

Reed Copsey


What you need to do is create two processes communicating with IPC. This way, one can be 32 bit, and one can be 64 bit. You need to create a 32 program which links with the COM object and exposes its API through some IPC mechanism such as a named pipe. This way your .NET program can access it from another process.

like image 39
Zifre Avatar answered Nov 08 '22 14:11

Zifre


Check out this blog post. You can reference a 32 bit COM assembly from a 64 bit .NET application using a runtime callable wrapper. The short version is the following...

  1. Use tlbimp.exe to create a 64 bit Runtime Callable Wrapper:

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

  2. Register the COM assembly (not the RCW) if you haven't already:

    regsvr32.exe foo.dll

  3. Reference the RCW (eg. Interop.Foo.dll) from your application. Change your Build Configuration to x64 and let 'er rock.

like image 3
Tyson Avatar answered Nov 08 '22 14:11

Tyson