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
由客户提供。
谢谢!
如何为不同平台创建不同的配置并定义适当的常量,然后在代码中使用条件指令并抽象互操作细节?
像这样(一个粗略的例子)
#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)