1

我不太了解 C++,但我必须使用 .NET 编写一些 C++ 代码。我尝试使用 DLLImport,但失败了。所以我尝试使用 C++/CLI 来制作一种包装器。

但我不确定是否了解所有内容...

这是带有我要导出的函数的基本 C++ H 文件(MyFunction)

 extern "C"
 {
  __declspec(dllexport) IplImage* MyFunction(IplImage *src, std::string* name, OneEnumerationType myEnum, bool myBool, float myFloat);
 }     

这是 Wrapper h 代码。

#include "MyFunction.h"; // the file containing the h code
#include <string>

namespace MyWrapper{
 public ref class MyWrapperClass {
     public: 
       MyWrapper(){};
       IplImage^ GetMyFunction(IplImage *src, std::string^ name, OneEnumerationType myEnum, bool myBool, float myFloat);
}

这是包装器 cpp 代码。

#include "MyWrapperCode.h";

namespace MyWrapper{
IplImage^ MyWrapperClass::GetMyFunction(IplImage* src, std:string^ name, OneEnumerationType myEnum, bool myBool, float myFloat){
  MyFunction(src, name, myEnum, myBool, myFloat);
 }
}

这些是我的问题:

1)当我编译时,错误是“'^:不能在类型 IplImage' 上使用这种间接,对于类型“std::string”的相同消息。我遵循了这个逻辑:

ClasseNative clNat2 = *clNat;  --> ClasseManagee clMan2 = *clMan;
ClasseNative &clNat3 = clNat2; -->  ClasseManagee %clMan3 = clMan2;
ClasseNative *clNat4 = &clNat2; --> ClasseManagee ^clMan4 = %clMan2;

我已经看到,最好使用 System::String。我尝试这种方式,但初始函数正在使用 std::string ...顺便说一句,为什么更改更好?

2) 如何获得 MyFunction IplImage 结果?我想通过一个私人成员和一个 get 但我不知道如何初始化它......

3)棘手的问题。当我调用我的包装器时,我是否可以将 CLI 获取 IplImage 结构(来自 OpenCV 库)(我的函数的结果)放入 IplImage .NET 结构中?不知道这个问题是否可以理解...

非常感谢你的帮助。在这个问题上转了3天......

4

2 回答 2

1

1) 仅通过添加 ^ 就无法将本机对象更改为托管对象,您必须创建包装器或传输数据,例如:

std::string nativeString = "my string";
String^ managedString = gcnew String(nativeString.c_str());
//now you can return it as 

2) 创建一个托管包装器或使用原始数据类型来传输数据

3)注意确定这是否会有所帮助,但请查看Emgu.CV

尝试阅读有关 C++\CLI 的更多信息,这里有一些不错的教程:

Quick C++/CLI - 在不到 10 分钟的时间内学习 C++/CLI

面向 C# 程序员的 C++/CLI

于 2013-04-10T14:03:23.313 回答
1

您的包装类需要根据 System::String^ 参数的内容创建一个新的 std::string 然后传递给您的本机函数。否则,您需要重写函数以将其他内容作为字符串输入,例如 LPWSTR 或 LPCSTR。

您可以编写一个 ref 类以具有 IplImage 将具有的所有数据的属性,然后将其传递给您的包装类。然后,您的包装类根据 ref 类的数据创建一个 IplImage 对象并传递给本机函数。反转返回值的数据复制方向。

于 2013-04-10T13:44:52.243 回答