【问题标题】:expose c++-cli dll to c#将 c++-cli dll 暴露给 c#
【发布时间】:2012-07-10 20:00:34
【问题描述】:

我正在使用 c++-cli 生成一个 dll。 dll 中的类如下所示:

ref class Locator

{
public:
Locator(int HP) : m_HP(HP) { } 
~Locator() 
{ } 
Dictionary<String^, array< Byte >^>^ Locate(Dictionary<String^, String^>^ imgParms) 
{ .....  }

private:
int m_HP;

如何公开它以在 c# 中使用它?类和成员没有在 c# 中公开

【问题讨论】:

  • 如果这是一个“普通”的 C/C++ 程序,你会使用 Interop。由于这是一个 C++-CLI(托管 C++)程序,您应该已经拥有程序集。只需在您的 C# 客户端中引用它们即可。 PS:老实说,我很好奇为什么有人想要使用 C++ CLI(与 VB.Net 或用于 .Net 的 C# 相比,或者为了可移植性和效率而使用标准 C++)?它总是让我感到困惑......
  • 应该是ref class Locator
  • paulsm4:有时,需要与本机库进行互操作,编写正确的 P/Invoke 和 ComImport 魔法可能比将整个 shebang 包装在 C++/CLI ref class 中更困难. :)
  • 我必须使用 C/C++,因为我使用 OpenCV 进行图像处理,但我会尝试参考
  • 所以我将 ref 添加到类定位器中,现在它无法编译:错误 C2664: 'cvReleaseCapture' : cannot convert parameter 1 from 'cli::interior_ptr' to 'CvCapture **' 1> with 1> [ 1> Type=CvCapture * 1> ] 1> 无法将托管类型转换为非托管类型

标签: c# c++-cli


【解决方案1】:

您需要使用public 关键字使托管类型对程序集的使用者可见。试试

public ref class Locator { ... };

【讨论】:

    【解决方案2】:

    几个月前我问过一个关于类似问题的问题:

    How to use a C callback from C#?

    以下是我对这个问题的回答中的一些额外提示:

    Calling C++ DLL from C++ works, but not from C#

    我读到你正在使用 OpenCV,你知道 Emgu CV: OpenCV in .NET (C#, VB, C++ and more) 吗? :-)

    【讨论】:

      【解决方案3】:

      C++/CLI 生成标准的 .NET 托管程序集。这就是 C++/CLI => 将现有 C++ 代码编译为托管程序集而不将其重写为 CLS 语言的全部意义所在。

      因此,只需将此程序集引用为您使用项目中的任何其他 .NET 程序集即可。然后消费:

      var imgParms = new Dictionary<string, string> { { "foo", "bar" }, { "baz", "bazinga" } };
      var locator = new Locator(123);
      var result = locator.Locate(imgParams);
      // TODO: do something with the result dictionary
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多