3

c#からアクセスしたいc++アンマネージコードがあります。だから私はいくつかのチュートリアルに従い、私のプロジェクト用のdllをビルドしました(1つのクラスのみ)。今、私はそれをc#から使用したいと思います、そして私は次のようにp/invokeを使用しています。

私の質問は次のとおりです。Windowsポイントをマーシャリングして、c ++コードにベクトルとして渡すことはできますか?すべてのコードを変更できます(qwindowsポイントを除くが、独自のポイントを作成できます)。ACラッパーを作成する必要がない解決策はありますか?私はこの質問に従っていました:C#からのパラメーターとしてstd :: vector <> :: iteratorを使用して、アンマネージC ++関数を呼び出す方法は?

多くの感謝1ps、私は「解決策」を見つけましたが、それを見ることができませんhttp://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21461195.html

c#

using Point = System.Windows.Point;

class CPlusPlusWrapper
{

    [DllImport("EmotionsDLL.dll", EntryPoint = "calibrate_to_file")]
    static extern int calibrate_to_file(vector<points> pontos);//marshall here

    [DllImport("EmotionsDLL.dll", EntryPoint = "calibration_neutral")]
    static extern int calibration_neutral();
    /// <summary>
    /// wraps c++ project into c#
    /// </summary>

    public void calibrate_to_file() { 

}

dllヘッダー

namespace EMOTIONSDLL
{
    struct points{
        double x;
        double y;
        double z;
    };

    #define db at<double>

    class DLLDIR EMOTIONS
    {
    public:

        EMOTIONS();

        CvERTrees *  Rtree ;


        vector<points> mapear_kinect_porto(vector<points> pontos);

        void calibrate_to_file(vector<points> pontos);

        int calibration_neutral();

        int EmotionsRecognition();
    };
}
4

2 に答える 2

4

C#配列をC ++ std :: vectorとしてマーシャリングすることもできますが、std :: vectorのレイアウトと実装がコンパイラのバージョン間で同じであるとは限らないため、非常に複雑であり、単に良い考えではありません。

代わりに、パラメーターを配列へのポインターに変更し、配列の長さを指定するパラメーターを追加する必要があります。

int calibrate_to_file(points* pontos, int length);

また、C#では、メソッドを配列を取るものとして宣言し、MarshalAs(UnmanagedType.LPArray)属性を適用します。

static extern int calibrate_to_file([MarshalAs(UnmanagedType.LPArray)]] Point[] pontos, int length);

また、C++ポイント構造はSystem.Windows.Pointと互換性がないことにも注意してください。後者にはzメンバーがありません。

しかし、コードのより大きな問題は、DLLインポートを実際に期待できないことです。インスタンスメソッドをインポートして、そのように呼び出すことができます。インスタンスメソッドにはそのクラスのインスタンスが必要であり、C#から非COM C ++クラスのインスタンスを作成する簡単な方法はありません(これもお勧めできません)。したがって、これをCOMクラスに変換するか、C ++/CLIラッパーを作成する必要があります。

于 2013-03-17T22:54:51.940 に答える
1

vector<T>タイプの配列を渡してから、相対関数でそれらを'またはListに変換する必要があると思います。

static externINTcalibrate_to_file()を参照 し、C++ではVOIDであるという事実も考えられます。calibrate_to_file()

DLLEXPORT更新:関数のタグが欠落していると思いますか?

于 2013-03-17T22:00:23.680 に答える