C# 互操作中的条件变量类型取决于操作系统和架构

问题描述 投票:0回答:1

C# 互操作问题。

我有一个使用结构体的 C++ 库:

struct CPPSTRUCT
{
    long v1;
    short v2;
    long v3;
}

在C#中,我有相应的结构:

[StructLayout(LayoutKind.Sequential)]
public struct MANAGEDSTRUCT
{ 
    public int v1;
    public short v2;
    public int v3;
}

只要为 Windows x64 构建 C++ 库,它就可以工作,但是,当为 Linux x64 构建相同的库时,它就会中断。 其破坏的原因是因为

long
的 C++ 长度在 Win x64 中为 4 个字节,但在 Linux x64 中为 8 个字节:将
int
中的
MANAGEDSTRUCT
类型更改为
long
类型修复了 Linux x64 的问题,但是在 Windows x64 上打破它。 另一个问题是,当设置/获取
v1
中的
v3
MANAGEDSTRUCT
的值时,也可能成为有条件的。

我正在寻找最好的 C# 合适方法来有条件地声明变量类型/根据操作系统/架构对它进行编组,以便使用 C++ 库的应用程序可以针对多个平台,而不必担心类型,并且能够在

 中设置值MANAGEDSSTRUCT
由客户提供。

谢谢!

c# variables interop declaration
1个回答
0
投票

如何为不同平台创建不同的配置并定义适当的常量,然后在代码中使用条件指令并抽象互操作细节?

像这样(一个粗略的例子)

    #if LINUX64
    
    [StructLayout(LayoutKind.Sequential)]
    public struct MANAGEDSTRUCT
    { 
        public long v1;
        public short v2;
        public long v3;
    }
    
    #else
    
    [StructLayout(LayoutKind.Sequential)]
    public struct MANAGEDSTRUCT
    { 
        public int v1;
        public short v2;
        public int v3;
    }
    
    #endif
    
    public int DoSomething(int v1, short v2, int v3)
    {
        MANAGEDSTRUCT s = new MANAGEDSTRUCT();
        s.v1 = v1;
        s.v2 = v2;
        s.v3 = v3;
        // Do interop stuff
        return (int)s.v1;  // I assume that the value will fit in 4 bytes since it work under Windows
    }

附注

C++ 库是您/您的同事开发的吗?如果是,我建议重写它以与平台无关的方式指定结构字段的大小(int32_t 或 int64_t)

© www.soinside.com 2019 - 2024. All rights reserved.