LegacyWrapper uses a wrapper process to call dlls from a process of the opposing architecture (X86 or AMD64).
Since you can't load a dll of another architecture directly, the wrapper utilizes a named pipe to abstract the call. You won't notice this though, because all the magic is hidden behind a single static method.
There is a NuGet package available here: Codefoundry.LegacyWrapper @ nuget.org
If you want to compile the LegacyWrapper yourself, make sure to place both the wrapper executable, LegacyWrapperClient.dll and LegacyWrapper.Common.dll in your directory.
// Define delegate matching DLL function private delegate int GetSystemMetrics(int index); // Create new WrapperClient // Remember to ensure a call to the Dispose()-Method! using (var client = new WrapperClient("User32.dll")) { // Make calls providing library name, function name, and parameters int x = (int)client.Invoke<GetSystemMetrics>("GetSystemMetrics", new object[] { 0 }); int y = (int)client.Invoke<GetSystemMetrics>("GetSystemMetrics", new object[] { 1 }); }The constructor takes an optional second parameter where you can specify the target architecture (it defaults to X86):
using (var client = new WrapperClient(TestDllPath, TargetArchitecture.Amd64)) { result = (int)client.Invoke<TestStdCallDelegate>("TestStdCall", new object[] { input }); }Please note that loading a 64bit dll will only work on 64bit operating systems.
If your delegate contains ref parameters, the object array passed as parameters to the Invoke<T> method will contain the updated values afterwards.
- Support for Attributes like
[CallingConvention]. - Type safe usage of generics in Call-Method
View this blog post to obtain a basic understanding of how the library works internally. There is also a blog post about the new 64bit feature in LegacyWrapper 2.1.
Feel free to submit any suggestions/issues and contribute to LegacyWrapper.
Copyright (c) 2017, Franz Wimmer. (MIT License)
See LICENSE for more info.
This library includes Nuane.Interop written by Lukas Pokorny.