gpt4 book ai didi

c# - 在 C# 中移动结构数据

转载 作者:可可西里 更新时间:2023-11-01 11:33:55 25 4
gpt4 key购买 nike

假设我在 C 中有以下结构

typedef struct
{
int field1;
char field2[16];
} MYSTRUCT;

现在我有一个用指向 MYSTRUCT 的指针调用的 C 例程,我需要填充该结构,例如,

int MyCall(MYSTRUCT *ms)
{
char *hello = "hello world";
int hlen = strlen(hello);
ms->field1 = hlen;
strcpy_s(ms->field2,16,hello);
return(hlen);
}

如何用 C# 编写 MyCall?我在 Visual Studio 2010 中试过这个:

...
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
public struct MYSTRUCT
{
[FieldOffset(0)]
UInt32 field1;
[FieldOffset(4)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
string field2;
}

public int MyProc(ref MYSTRUCT ms)
{
string hello = "hello world";
int hlen = hello.Length;
Marshal.Copy(hello, ms.field2, 0, hlen); // doesn't work
Array.Copy(hello, ms.field2, hlen); // doesn't work
// tried a number of other ways with no luck
// ms.field2 is not a resolved reference
return(hlen);
}

感谢您提供有关正确执行此操作的任何提示。

最佳答案

尝试更改 StructLayout。

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct MYSTRUCT
{
public UInt32 field1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string field2;
}

既然您是作为引用传递的,您是否尝试过将其设置为:

public int MyProc(ref MYSTRUCT ms)
{
string hello = "hello world";
ms.field2 = hello;
return hello.Length;
}

当使用 ref 关键字时,您将像这样调用 MyProc:

static void Main(string[] args)
{
var s = new MYSTRUCT();
Console.WriteLine(MyProc(ref s)); // you must use "ref" when passing an argument
Console.WriteLine(s.field2);
Console.ReadKey();
}

关于c# - 在 C# 中移动结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328974/

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