【发布时间】:2012-03-27 17:18:58
【问题描述】:
在 C# 中,我试图 PInvoke 我在 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.
对于我的一生,我无法弄清楚如何在 C# 中做到这一点。如果我知道 dll 名称,我不会有任何麻烦,它看起来像这样 something:
[DllImport("someLib.dll")]
uint MyMethod(int i,
[In, MarshalAs(UnmanagedType.Interface)] IUnknown input,
[Out, MarshalAs(UnmanagedType.Interface)] out IUnknown output);
如何在不知道编译时加载的 dll 的情况下执行此操作?
【问题讨论】: