【问题标题】:marshalling a struct containing string编组包含字符串的结构
【发布时间】:2021-09-24 21:36:10
【问题描述】:

我基本上想在 c# 中从用户那里获取 int 名称和字符串年龄并将其发送到用 c 编写的 dll 方法,该方法在其中接受 int 和 char[50] 参数并返回字符串。我创建了以下场景但我失败了,任何机构都有代码

我有一个用 c 开发的 dll,它有一个结构

struct Argument 
{
int age;
char name[50];
} ;

还有一个方法

extern "C"
{
    __declspec(dllexport) Argument FillData(Argument data)
 {
        Argument mydata;

        mydata.age=data.age;
        for(int i=0;i<=sizeof(data);i++)
        {
            mydata.name[i]=data.name[i];

        }
        return mydata;

 }

我在 c# 中的 Cs_dll.cs 中声明它

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
    public struct Argument
    {
        public int age;
        [MarshalAs(UnmanagedType.TBStr)]
        //public char name;
       public char[] name;

    };
  public  class Cs_Dll
    {
      [DllImport("TestLib.dll")]
            public static extern Argument FillData (Argument data);


    }

现在我想要一个按钮来做

 private void button1_Click(object sender, EventArgs e)
        {
            Argument data=new Argument();
            data.age=Convert.ToInt32(textBox_age.Text);
            char[] name={'a','b','r','a','r', ' ', 'a', 'h', 'm', 'e', 'd', '\0' };
            for (int i = 0; i <= name.Length; i++)
            {
                data.name[i] = name[i];
            }

               // Array.Copy(name, data.name, name.Length);


            Argument result = Cs_Dll.FillData(data);
            textBox_get.Text = result.age.ToString();
            textBox_age.Text = result.name.ToString();

        }

但我遇到了错误

【问题讨论】:

    标签: c# c interop struct pinvoke


    【解决方案1】:

    您需要将 Argument 的结构定义更改为任一

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string name; }

    - 或 -

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] unsafe public struct Argument { public int age; fixed char name[50]; }

    您可能还会发现文章 Default Marshaling for Strings 很有帮助。

    【讨论】:

    【解决方案2】:

    在结构中,要编组定义为 char[] 的 char 数组,您应该改用 UnmanagedType.ByValTStr。

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct Argument
    {
        public int age;
    
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
        public string name;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多