As far as I know, C# can only interop with COM interfaces. Lucky enough it doesn't need to be a full blown COM object with registry, it can be any plain old C++ class implementing IUnknown.
So do something like this in C++:
#include <Windows.h> // Generate with from VisualStudio Tools/Create Guid menu static const GUID IID_MyInterface = { 0xefbf7d84, 0x3efe, 0x41e0, { 0x95, 0x2e, 0x68, 0xa4, 0x4a, 0x3e, 0x72, 0xca } }; struct MyInterface: public IUnknown { // add your own functions here // they should be virtual and __stdcall STDMETHOD_(double, GetValue)() = 0; STDMETHOD(ThrowError)() = 0; }; class MyClass: public MyInterface { volatile long refcount_; public: MyClass(): refcount_(1) { } STDMETHODIMP QueryInterface(REFIID guid, void **pObj) { if(pObj == NULL) { return E_POINTER; } else if(guid == IID_IUnknown) { *pObj = this; AddRef(); return S_OK; } else if(guid == IID_MyInterface) { *pObj = this; AddRef(); return S_OK; } else { // always set [out] parameter *pObj = NULL; return E_NOINTERFACE; } } STDMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&refcount_); } STDMETHODIMP_(ULONG) Release() { ULONG result = InterlockedDecrement(&refcount_); if(result == 0) delete this; return result; } STDMETHODIMP_(DOUBLE) GetValue() { return 42.0; } STDMETHODIMP ThrowError() { return E_FAIL; } }; extern "C" __declspec(dllexport) LPUNKNOWN WINAPI CreateInstance() { return new MyClass(); }
And on the C# side you do something like this:
[ComImport] [Guid("EFBF7D84-3EFE-41E0-952E-68A44A3E72CA")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface MyInterface { [PreserveSig] double GetValue(); void ThrowError(); } class Program { [DllImport("mylib.dll")] static extern MyInterface CreateInstance(); static void Main(string[] args) { MyInterface iface = CreateInstance(); Console.WriteLine(iface.GetValue()); try { iface.ThrowError(); } catch(Exception ex) { Console.WriteLine(ex); } Console.ReadKey(true); } }
You can do pretty much anything you want this way, as long as the communication between C++ and C# goes through the virtual interface.