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!
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.
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.
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...
Use tlbimp.exe to create a 64 bit Runtime Callable Wrapper:
tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll
Register the COM assembly (not the RCW) if you haven't already:
regsvr32.exe foo.dll
Reference the RCW (eg. Interop.Foo.dll
) from your application. Change your Build Configuration to x64 and let 'er rock.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With