当你在编译时不知道DLL时PInvoke?

LCC*_*LCC 7 c# pinvoke

在C#中,我正在尝试使用C++中的"简单"函数.问题是我在编译时不知道库的名称或位置.在C++中,这很容易:

typedef HRESULT (*SomeFuncSig)(int, IUnknown *, IUnknown **);

const char *lib = "someLib.dll";  // Calculated at runtime

HMODULE mod = LoadLibrary(lib);
SomeFuncSig func = (SomeFuncSig)GetProcAddress("MyMethod");

IUnknown *in = GetSomeParam();
IUnknown *out = NULL;
HRESULT hr = func(12345, in, &out);

// Leave module loaded to continue using foo.
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法弄清楚如何在C#中做到这一点.我不会有任何麻烦,如果我知道DLL的名称,它看起来事情是这样的:

[DllImport("someLib.dll")]
uint MyMethod(int i,
              [In, MarshalAs(UnmanagedType.Interface)] IUnknown input, 
              [Out, MarshalAs(UnmanagedType.Interface)] out IUnknown output);
Run Code Online (Sandbox Code Playgroud)

如果不知道我在编译时加载的DLL,我该怎么做?

Han*_*ant 7

你以同样的方式做到这一点.声明一个委托类型,其签名与导出的函数匹配,就像SomeFuncSig一样.Pinvoke LoadLibrary和GetProcAddress获取导出函数的IntPtr,就像在C++中一样.然后使用Marshal.GetDelegateForFunctionPointer()创建委托对象.


Sim*_*ier 5

这是一个解决方案:从.NET(C#)动态调用非托管dll(基于LoadLibrary/GetProcAddress)