C# 当你不';我在编译时不知道DLL? 在C++中,我试图调用C++中的一个简单函数。问题是我在编译时不知道库的名称或位置。在C++中,这是容易的:< /P> 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? 在C++中,我试图调用C++中的一个简单函数。问题是我在编译时不知道库的名称或位置。在C++中,这是容易的:< /P> 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#,pinvoke,C#,Pinvoke,就我个人而言,我不知道如何在C#中做到这一点。如果我知道dll名称,我不会有任何问题,它看起来像这样: [DllImport("someLib.dll")] uint MyMethod(int i, [In, MarshalAs(UnmanagedType.Interface)] IUnknown input, [Out, MarshalAs(UnmanagedType.Interface)] out IUnknown output);

就我个人而言,我不知道如何在C#中做到这一点。如果我知道dll名称,我不会有任何问题,它看起来像这样:

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

如何在不知道编译时加载的dll的情况下执行此操作?

这里有一个解决方案:(基于LoadLibrary/GetProcAddress)

您也可以这样做。声明其签名与导出函数匹配的委托类型,就像SomeFuncSig一样。Pinvoke LoadLibrary和GeCopTeLoad获取导出函数的ItPtR,就像您在C++中所做的那样。然后使用Marshal.GetDelegateForFunctionPointer()创建委托对象。

如果您预先知道DLL名称,并且预先知道函数名称,那么有一种更简单的方法


您可以简单地声明p/Invoke签名,然后使用
LoadLibrary
根据配置文件条目加载DLL。只要在使用任何P/Invoke函数之前成功调用
LoadLibrary
,它们就会成功,因为DLL已经加载。

我是否遗漏了什么?要使用LoadLibrary,您确实需要知道dll的名称。如果OP知道dll的名称,他不会首先尝试找到不同的解决方案。编辑:我想我错过了“编译时”和“运行时”。