【问题标题】:How to share a class in a Visual C++ DLL with C#?如何使用 C# 共享 Visual C++ DLL 中的类?
【发布时间】:2011-03-14 09:18:53
【问题描述】:

我用 C++ 编写程序并将其导出为 DLL。我有一个 C# WPF GUI,我想导入 DLL 来进行处理。

我对 C# 很陌生。如何在 C# 中使用 C++ 类?我知道我不能只使用 .h 文件。

因为我在 C++ 中使用了指针,所以在 C# 中我不能使用指针。这就是为什么我感到困惑。就像在 C++ 中一样,我使用 char* 而不是 string,并且我需要返回 double* 以获得大量 double 数据,诸如此类。

【问题讨论】:

  • 如果您包含您想从 C# 调用的方法之一的签名会有所帮助。

标签: c# visual-c++ dll pinvoke dllimport


【解决方案1】:

有很多方法:

  1. Export the DLL functions 并在 DLL 中使用 DllImportAttributeP/Invoke
  2. 如果是COM DLL,则可以通过TLBIMP.exe生成Runtime Callable Wrapper
  3. 您可以使用 C++/CLI 构建一个 .Net 程序集,该程序集在本机加载和调用 DLL 上的方法。

为了解决您的其他问题,是的,您可以在 C# 中使用指针。如果你有一个带有double* 参数的函数,你可以在 C# 中这样声明:

[DllImport("Your.DLL")]
private static extern unsafe void DoProcessing(double* data, int dataSize);

您需要确保选中 C# 项目的构建选项卡上的“允许不安全代码”复选框,然后,您可以使用指向您心中内容的指针。

但是,请注意,虽然我在这里提供了指针签名,但由于您显然对指针感到满意,因此还有其他签名对您来说可能更安全,并且不需要您使用不安全的代码编译 C# . CLR 中的标准编组器将负责从指针到 C# 数组的转换,前提是您在需要长度时给它一些提示:

[DllImport("Your.DLL")]
private static extern void DoProcessing(
        [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double[] data, 
        int dataSize);

这指示编组器使用索引 1 处的参数(第二个参数)作为第一个参数指向的双精度数组的大小。这使您可以避免使用 C# 中的指针,并使用安全的 CLI 类型。但是,如果您喜欢指针,我的建议是直接使用它们 - C# 对您来说比在没有它们的情况下弄清楚如何编写方法签名要容易。

有关 P/Invoke 的更多详细信息,请参阅此文档:http://msdn.microsoft.com/en-us/library/aa288468(VS.71).aspx

【讨论】:

    【解决方案2】:

    很大程度上取决于您的 C++ dll 的结构。如果您只有少数函数,并且它们不是类的成员函数,那么您可以将它们设为“外部 C”函数并使用 .NET 中的 P/Invoke 功能(有时称为 DllImport,因为您使用的属性)从 C# 访问函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多