c# - 在编译时不知道 DLL 时调用 PInvoke?

标签 c# pinvoke

在 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 名称,我就不会有任何问题,它看起来像这样:

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

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

最佳答案

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

关于c# - 在编译时不知道 DLL 时调用 PInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606184/

相关文章:

c# - 如何使用 P/INVOKE 将 C++ char* 编码为 C# 字符串

C# - 为什么我需要初始化一个 [Out] 参数

delphi - 我使用Delphi调用DLL,但仍然出现错误

c# - 使用 Visual Studio 2012 Express for Web 添加 Web API 和文件夹引用到空的 ASP.NET 项目

c# - 如何合并两个内存流?

c# - 调用 C dll 函数来更改 C# 中传递的参数

c++ - 包装非托管 C++ 类以便 .Net 托管客户端应用程序可以使用它们的最佳方法是什么?

c# - 不可调用成员 'File' 在生成报告时不能像方法一样使用

c# - 为什么这段代码会给出 "Possible null reference return"编译器警告?

c# - PInvoke 在类定义中不起作用