C ++ / CLI如何翻译此代码?

时间:2013-04-10 12:51:40

标签: pointers c++-cli iplimage

我对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);
}

这是Wrapper 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 ... BTW,为什么更改更好?

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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 - Learn C++/CLI in less than 10 minutes

C++/CLI for the C# programmer