1

C++ についてはよくわかりませんが、.NET で C++ コードを動作させる必要があります。DLLImport を試してみましたが、失敗しました。そこで、C++/CLI を使って一種のラッパーを作成しようとしました。

しかし、すべてを理解できるかどうかはわかりません...

これは、エクスポートしたい関数 (MyFunction) を含む基本的な C++ H ファイルです。

 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 が (OpenCV ライブラリから) IplImage 構造を取得する (関数の結果) を 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 についてもう少し読んでみてください。いくつかの素晴らしいチュートリアルがあります。

クイック C++/CLI - C++/CLI を 10 分未満で学習

C# プログラマー向けの C++/CLI

于 2013-04-10T14:03:23.313 に答える