8

まず、この質問を参照したいと思います: C# と C++ の間で変数を共有しています。

それは私が探しているもののようですが、これを実装しようとするとエラーが発生します。

まず、これは私のコードです:

C++ MyCppWrapper.h

namespace CppWrapping
{
    #pragma pack(1)
    public struct MyPoint
    {
    public: 
        float X;
        float Y;
        float Z;
        unsigned char R;
        unsigned char G;
        unsigned char B;
        unsigned char A;

    }MyPoint_t;
    #pragma pack()

    public ref class MyCppWrapper
    {
    public:
        MyCpplWrapper(void);
        List<MyPoint>^ getData();
    };
};

C++ MyCppWrapper.cpp

List<MyPoint>^ MyCppWrapper::getData()
{
    List<MyPoint>^ temp = gcnew List<MyPoint>();
    for (int i = 0; i < Data.Length; i++)
    {
        PointT& pt = Data.points[i];
        MyPoint holder = MyPoint();
        holder.X = pt.x;
        holder.Y = pt.y;
        holder.Z = pt.z;
        holder.R = pt.r;
        holder.G = pt.g;
        holder.B = pt.b;
        holder.A = pt.a;
        temp[i] = holder;
    }
    return temp;
}

C# MyLinker.cs

[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct MyPoint_t
{
    public float X;
    public float Y;
    public float Z;
    public byte R;
    public byte G;
    public byte B;
    public byte A;
};

public void getData()
{
    _wrapper = new MyCppWrapper();
    List<MyPoint_t> data = _wrapper.getData();
}

かなりの数のエラーがありますが、最終的には次の 3 つのエラーになります。

error C3225: generic type argument for 'T' cannot be 'CppWrapping::MyPoint', it must be a value type or a handle to a reference type

'CppWrapping.MyPoint' is inaccessible due to its protection level

'CppWrapping.MyCppWrapper.getData()' is inaccessible due to its protection level

List data = _wrapper.getData();また、カーソルをコードの上に置くと、コードの下に赤いマークが表示されます。

Cannot convert source type 'System.Collections.Generic.List<CppWrapping.MyPoint>' to target type 'System.Collections.Generic.List<ProjectA.MyLinker.MyPoint_t>'

どうすればこれを解決できますか?

編集:

エラーの数を 58 から 1 に減らすように変更public struct MyPointしました。現在のエラーは次のとおりです。public value struct MyPoint

Cannot implicitly convert type 'System.Collections.Generic.List<CppWrapping.MyPoint>' to 'System.Collections.Generic.List<ProjectA.MyLinker.MyPoint_t>'
4

1 に答える 1

5
public struct MyPoint {}

これはアンマネージ構造体を宣言します。メンバーなしで不透明な値の型としてエクスポートされるため、C# コードはそれにアクセスできません。次のように宣言する必要があります

public value struct MyPoint {}

次に行うことは、C# コードから MyPoint_t 宣言を削除することです。型 ID には型の元のアセンブリが含まれているため、MyPoint_t は MyPoint と互換性がありません。C++/CLI アセンブリから MyPoint 型を簡単に使用できます。

_wrapper = new MyCppWrapper();
List<MyPoint> data = _wrapper.getData();

または、単純に C# の型推論を利用します。

var data = _wrapper.getData();
于 2013-03-07T15:27:03.290 に答える