gpt4 book ai didi

c# - 我如何将其转换为 c#(编码)

转载 作者:行者123 更新时间:2023-11-28 03:50:48 27 4
gpt4 key购买 nike

我有这些声明 (DLL) 并尝试在 C# 中转换它,以便我可以从 DLL 调用函数。

struct1 到 struct3 相同

typedef struct1  
{
int num;
char chars[25];
short shrt;
union
{
struct4 objstruct4;
}
}

typedef struct
{
Long Length;
short Type;
union
{
struct1 objStruct1;
struct2 objStruct2;
struct3 objStruct3;
}Data;
} Msg;

在 C# 中,我将这些...与 struct1 相同转换为 struct3

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct struct1
{
[MarshalAs(UnmanagedType.I4)]
public Int32 num;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
public string chars;

[MarshalAs(UnmanagedType.I2)]
public short shrt;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct struct4
{
[MarshalAs(UnmanagedType.Struct)]
public ...
...
}

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
protected struct Msg
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.I4)]
public int Length;

[FieldOffset(4)]
[MarshalAs(UnmanagedType.I2)]
public short Type;

[FieldOffset(6)]
[MarshalAs(UnmanagedType.Struct)]
public Data MsgData;
}

[StructLayout(LayoutKind.Explicit, Pack = 1, CharSet = CharSet.Ansi)]
public struct Data
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.Struct)]
public struct1 objStruct1;

[FieldOffset(0)]
[MarshalAs(UnmanagedType.Struct)]
public struct2 objStruct2;

[FieldOffset(0)]
[MarshalAs(UnmanagedType.Struct)]
public struct3 objStruct3;

问题是当我试图从 DLL 调用一个函数并将 struct MSG 作为 REF 传递时,内部结构/union (struct1 到 struct3)的一些成员变量没有值。就好像它们在内存中隆隆作响……

但是当我删除 struct MSG 中的 struct1 或 struct2 时,其余内部结构/union 内的所有成员变量都被成功检索。

如果我的转换是正确的或者我是否遗漏了什么,我能问问你的建议吗...或者有没有更好的方法来转换这个或者你有答案为什么会出现这个问题。我怀疑的一件事是结构、ANSI 或 Unicode 的大小,以及变量、结构的排列。

请指教 - 谢谢。

示例 2:
///////////////

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct1
{
[MarshalAs(UnmanagedType.I4)]
public Int32 num1;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
public string chars;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct2
{
[MarshalAs(UnmanagedType.I4)]
public Int32 num2;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct3
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = size + 1)]
public string chars;

[MarshalAs(UnmanagedType.I4)]
public Int32 num3;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct struct4
{
[MarshalAs(UnmanagedType.I4)]
public Int32 num4;

[MarshalAs(UnmanagedType.Struct)]
public Data DataMsg;

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct Data
{
//[FieldOffSet(0)]
public struct1 str1;

//[FieldOffSet(0)]
public struct2 str2;

//[FieldOffSet(0)]
public struct3 str3;
}
}
////////////////

最佳答案

您选择 Pack=1 的原因并不明显,大多数 C 编译器的默认值是 8,就像 .NET 一样。偏移量 6 处的 MsgData 不确定。在测试 C 程序中使用 sizeof 和 offsetof() 来找出所有内容所在的位置。与测试 C# 程序中的 Marshal.SizeOf 和 OffsetOf() 进行比较。在他们完全同意之前,这是行不通的。

关于c# - 我如何将其转换为 c#(编码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com