1

私は通常 C# を使用しますが、C++ 経由で C メソッドを呼び出すことができます。そこで、次のような C++ ラッパーを作成しました。

C++ ヘッダー ファイルは次のようになります。

#pragma once

using namespace System;

namespace CSharpToCPP {

    public ref class SomeWrapper
    {
        public:
        double ReturnValue();
    };
}

C++ コードは次のようになります。

double CSharpToCPP::SomeWrapper::ReturnValue()
{
    return 1;
}

これにより、C# で参照できる dll が得られます。C# での作業コードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        SomeWrapper Wrapper = new SomeWrapper();

        Console.WriteLine(Wrapper.ReturnValue());
    }
}

ここで、C++ メソッド ReturnValue でいくつかのデータを作成し、この署名で C メソッドを呼び出したいと思います。

real_T get_value(const e_struct_T parameters, real_T temp)

const e_struct_T とは何か、そのようなデータを作成する方法を説明する正しい方向に私を向けてください。C コードは自動的に生成されたもので、既知の内容の構造体を使用する必要があります。次のようにヘッダーファイルで構造を定義しようとしました:

struct Parameters{
    double x;
    int y;
    char z1;
    bool z2;
};

次に、次のようなデータを入力します。

Parameters Ps;
Ps.x = z2;
Ps.x = 2.0;

次のように get_value を呼び出す前に:

get_value(Ps, 10.0);

これは動作しません。ありがとう!

4

1 に答える 1

2

の定義を含むヘッダー ファイルを検索しe_struct_t、呼び出し元のファイルにインクルードし、その型の変数を使用して に渡す必要がget_valueあります。ちなみに、呼び出し元のターゲット メソッドC#が pureの場合は、C++ ラッパーを作成する代わりに(チュートリアルはこちらC) を直接使用することを検討する必要があります。さらに、単純な P/Invoke により、展開が大幅に簡素化されます (追加の dll は必要ありません)。P/Invoke

于 2012-11-29T15:57:05.707 に答える