c++ /CLI如何翻译这段代码



我对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…顺便说一句,为什么改变会更好?

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

3)棘手的问题。是否有可能让我把CLI获得IplImage结构(从OpenCV库)(我的函数的结果)在IplImage .NET结构,当我调用我的包装器?不知道这个问题是否可以理解…

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

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

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

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的教程,这里有一些很好的教程:

快速c++/CLI -在不到10分钟内学习c++/CLI

c++/CLI for c#程序员

相关内容

  • 没有找到相关文章