【发布时间】:2013-03-07 14:40:47
【问题描述】:
首先,我想参考这个问题:Sharing variables between C# and 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();
}
有很多错误,但归根结底是这三个错误:
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>'
我该如何解决这个问题?
编辑:
我将public struct MyPoint 更改为public value struct MyPoint
将错误数量从 58 个减少到 1 个。
我现在的错误是:
Cannot implicitly convert type 'System.Collections.Generic.List<CppWrapping.MyPoint>' to 'System.Collections.Generic.List<ProjectA.MyLinker.MyPoint_t>'
【问题讨论】:
-
“'CppWrapping.MyPoint' 由于其保护级别而无法访问”只是意味着需要公开的方法/属性/类/结构不是。易于修复。
-
CppWrapping.MyPoint 已经公开(参见:上段代码)。
标签: c# list managed-c++