我对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天......
答案 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的更多信息,这里有一些很好的教程: