【问题标题】:Call C++ Dll in C#.net using dllImport使用 dllImport 在 C#.net 中调用 C++ Dll
【发布时间】:2012-04-19 06:24:39
【问题描述】:

请查看以下示例

void ExitLibrary(); // C++ function

我可以像下面那样转换为 C#

[DllImport("VisualFOD.dll", CharSet = CharSet.Ansi)]
public static extern void ExitLibrary();

此方法将用于启动实时捕获

bool StartLive(DShowLib::Grabber* f_Grabber, HDC f_hHdc, RECT f_WindowRect);

此方法将用于启动实时捕获

[DllImport("TIS_UDSHL09_vc71.dll", CharSet = CharSet.Ansi)]
public static extern bool StartLive(IntPtr f_Grabber, IntPtr f_hHdc, Rectangle f_WindowRect);

我无法访问第二条语句 C++ 函数中提到的实际类 DShowLib::Grabber。

你知道如何声明和获取库类名吗?

此 dll 不是作为对 C# 环境的引用的 COM/.Net dll。

【问题讨论】:

  • 我想这就是你要找的东西:stackoverflow.com/questions/4741035/…
  • 这不会有好的结局。您可以使用 DirectShow.NET 包装器修改 DirectShow。在谷歌查询中输入,第二次点击。

标签: c# c++ pinvoke call dllimport


【解决方案1】:

是的。您可以通过 PInvoke 直接从您自己的 C# 代码中实例化和访问 C++ 类对象,但它非常复杂并且涉及大量工作,请到这里阅读 C++ PInvoke Interop SDK 可以做什么。

http://www.xinterop.com/index.php/2013/04/13/introduction-to-c-pinvoke-interop-sdk/

(虽然是商业软件,我是作者)

【讨论】:

    【解决方案2】:

    为了让 C#/C++ 互操作更容易进行了许多尝试,但到目前为止,来自 Microsoft 的托管 C++ 可能是最好的(尽管它不是 C++ 标准的一部分)。

    另一个有希望的选择是 Mono 的 CXXI,

    http://tirania.org/blog/archive/2011/Dec-19.html

    提供符合标准的方法。

    它仍然需要一些 hack(可能是 Google Summer of Code 2012),但它最终应该支持 Visual C++ 和 Windows。

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,如果 DShowLib::Grabber 类驻留在 DLL 中(并且由 C++ 头文件访问),您将无法直接在 C# 中访问它。

      有两种解决方案。首先,可以将原生的DLL类封装在C++/CLI类中,这样就可以包含原生的C++头文件;其次,您可以编写自己的 DLL,您可以在其中展平 DLL 类并 P/Invoke 您的展平方法。

      我的意思是扁平化:

      class C
      {
          void M(int i, float j);
      }
      

      方法 M 必须像这样调用:

      __declspec(dllexport) BOOL __stdcall C_M(C * instance, int i, float j)
      {
          if (instance == nullptr)
              return FALSE;
      
          instance->M(i, j);
      
          return TRUE;
      }
      

      但是,对于您的问题,请考虑 cmets。如果你可以为你感兴趣的库使用现成的包装器,你应该这样做:)

      【讨论】:

      • 非常感谢您提供的信息。我会尝试并进一步更新您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多