简体   繁体   English

在C#中移动结构数据

[英]Moving structure data in C#

Lets say I have the following structure in C 可以说我在C中有以下结构

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

Now I have a C routine that is called with a pointer to MYSTRUCT and I need to populate the structure, eg, 现在我有一个C程序,用一个指向MYSTRUCT的指针调用,我需要填充结构,例如,

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

How would I write MyCall in C#? 我如何用C#编写MyCall? I have tried this in Visual Studio 2010: 我在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);
}

Thanks for any tips on the right way to do this. 感谢您提供正确方法的任何提示。

Try changing the StructLayout. 尝试更改StructLayout。

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

Since, you're passing as a reference, have you tried setting it as: 既然,您作为参考传递,您是否尝试将其设置为:

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

When using the ref keyword, you'll call MyProc like so: 使用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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM