编组包含字符串的结构 [英] marshalling a struct containing string
问题描述
我基本上想在 c# 中从用户那里获取 int 名称和字符串年龄,并将其发送到用 c 编写的 dll 方法,其中使用 int 和 char[50] 参数并返回字符串.我创建了以下场景,但我失败了,任何机构都有代码
我有一个用 c 开发的 dll,它有一个结构
struct 参数{年龄;字符名称[50];};
和方法
extern "C"{__declspec(dllexport) 参数 FillData(参数数据){参数 mydata;mydata.age=data.age;for(int i=0;i<=sizeof(data);i++){mydata.name[i]=data.name[i];}返回我的数据;}
我在 Cs_dll.cs 中的 c# 中声明它
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]公共结构参数{公开年龄;[MarshalAs(UnmanagedType.TBStr)]//公共字符名称;公共字符[] 名称;};公共类 Cs_Dll{[DllImport("TestLib.dll")]public static extern Argument FillData(参数数据);}
现在又出现了一个我想做的按钮
private void button1_Click(object sender, EventArgs e){参数数据=新参数();data.age=Convert.ToInt32(textBox_age.Text);char[] name={'a','b','r','a','r', ' ', 'a', 'h', 'm', 'e', 'd', ' ' };for (int i = 0; i <= name.Length; i++){数据名称[i] = 名称[i];}//Array.Copy(name, data.name, name.Length);参数结果 = Cs_Dll.FillData(data);textBox_get.Text = result.age.ToString();textBox_age.Text = result.name.ToString();}
但我遇到了错误
您需要将 Argument 的结构定义更改为任一
<前><代码>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]公共结构参数{公开年龄;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]公共字符串名称;}- 或 -
<前><代码>[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]不安全的公共结构参数{公开年龄;固定字符名称[50];}您可能还会发现文章字符串的默认封送处理很有帮助.
i basically want to take int name and string age from user in c# and send it to dll method written in c which take int and char[50] arguments in it and return string .i created following scenario but i am failed ,any body has the code
i have a dll developed in c which ahas a structure
struct Argument
{
int age;
char name[50];
} ;
and a method
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;
}
i declare it in c# in 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);
}
now againts a button iwant to do
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', ' ' };
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();
}
but i am stuck with error
You need to change your struct definition of Argument to either
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
public int age;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string name;
}
- or -
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
unsafe public struct Argument
{
public int age;
fixed char name[50];
}
You might also find the article Default Marshaling for Strings helpful.
这篇关于编组包含字符串的结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!