加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将C数据导出到C#结构?

发布时间:2020-12-16 07:35:12 所属栏目:百科 来源:网络整理
导读:我正在努力将C结构数据导出到C#. 假设我有以下结构代表一个3浮点向量: // C++struct fvec3{public: float x,y,z; fvec3(float x,float y,float z) : x(x),y(y),z(z) { }};// C#[StructLayout(LayoutKind.Sequential)]struct fvec3{ public float x,z; publi
我正在努力将C结构数据导出到C#.

假设我有以下结构代表一个3浮点向量:

// C++
struct fvec3
{
public:
    float x,y,z;
    fvec3(float x,float y,float z) : x(x),y(y),z(z) { }
};

// C#
[StructLayout(LayoutKind.Sequential)]
struct fvec3
{
    public float x,z;

    public fvec3(float x,float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

现在,如果我想使用从C#到C的fvec3,我可以使用以下内容而不会出现问题:

// C++
__declspec(dllexport) void Import(fvec3 vector)
{
    std::cout << vector.x << " " << vector.y << " " << vector.z;
}

// C#
[DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)]
public static extern void Import(fvec3 vector);

...

Import(new fvec3(1,2,3)); // Prints "1 2 3".

现在的问题是反过来:将C fvec3返回给C#.我怎样才能做到这一点?
我已经看到许多C#实现使用了以下内容:

// C#
[DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)]
public static extern void Export(out fvec3 vector);

...

fvec3 vector;
Export(out vector); // vector contains the value given by C++

但是我该如何编写C Export功能呢?

我尝试了所有我能想到的签名和身体:

// Signatures: 
__declspec(dllexport) void Export(fvec3 vector)
__declspec(dllexport) void Export(fvec3* vector)
__declspec(dllexport) void Export(fvec3& vector)

// Bodies (with the pointer variants)
vector = fvec3(1,3);
memcpy(&fvec3(1,3),&vector,sizeof(fvec3));
*vector = new fvec(1,3);

其中一些没有效果,一些返回垃圾值,一些导致崩溃.

解决方法

ref和out参数通常与指针参数匹配.

试试这个:

__declspec(dllexport) void Export(fvec3 *vector)
{
    *vector = fvec3(1,3);
}

(未测试)

或者,您应该只需从函数中返回一个fvec3:

// C++
__declspec(dllexport) fvec3 Export(void)
{
    return fvec3(1,3);
}

// C#
[DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)]
public static extern fvec3 Export();

...

fvec3 vector = Export();

(未测试)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读