Best way to call 32-bit unmanaged code from 64-bit Managed Code using a managed code wrapper

前端 未结 2 589
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-04 06:46

The frequency with which I am coming across the situation where I have to call native 32-bit code from a managed 64-bit process is increasing as 64-bit machines and applications

相关标签:
2条回答
  • 2021-02-04 06:59

    I had the same problem and my solution was to use remoting. Basically the project consisted of:

    • Platform-independent CalculatorRemote.dll library with
      • CalculatorNative internal static class with x32 P/Invoke methods
      • RemoteCalculator class derived from MarshalByRefObject which used native methods from CalculatorNative;
    • Main platform-independent C# library (e.g. Calculator.dll), referencing CalculatorRemote.dll, with Calculator class which was privately using singleton of the RemoteCalculator class to invoke x32 functions where needed;
    • x32 console application which hosted RemoteCalculator from CalculatorRemote.dll to consume by Calculator.dll via IpcChannel.

    So if the main application started in x64 mode it was spawning a RemoteCalculator host application and used remoted RemoteCalculator instance. (When in x32 it just used a local instance of RemoteCalculator.) The tricky part was telling calculator-host application to shut down.

    I think this it better than using COM because:

    • You don't have to register COM classes anywhere;
    • Interoperating with COM should be slower than .NET remoting;
    • Sometimes if something is going wrong on the COM-side you need to restart your application to recover from that; (possibly I'm just not very familiar with COM)
    • When running in x32 mode there won't be any performance penalty with remoting -- all methods will be invoked in the same AppDomain.
    0 讨论(0)
  • 2021-02-04 07:00

    Pretty much the only answer is out of process communication. You could create a .NET project that is a 32-bit executable that makes all of the 32-bit calls needed and communicate with it via Windows Messages, WCF, Named Pipes, Memory Mapped Files (4.0), etc. I am pretty sure this is how Paint.NET does their WIA (Windows Imaging Acquisition) from a 64-bit process.

    In the case of PDN, they simply pass the name of the file they expect as the output, but more complex communication isn't difficult. It could be a better way to go depending on what you're doing.

    0 讨论(0)
提交回复
热议问题