abr*_*rar 1 c c# pinvoke interop struct
我基本上想要从c#中的用户获取int name和string age并将其发送到用c编写的dll方法,其中包含int和char [50]参数并返回字符串.i创建以下场景但我失败了,任何正文都有代码
我有一个在c开发的dll,它有一个结构
struct Argument
{
int age;
char name[50];
} ;
Run Code Online (Sandbox Code Playgroud)
和方法
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;
}
Run Code Online (Sandbox Code Playgroud)
我在Cs_dll.cs中的c#中声明它
[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);
}
Run Code Online (Sandbox Code Playgroud)
现在再按一个按钮我想做
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();
}
Run Code Online (Sandbox Code Playgroud)
但我遇到了错误
您需要将Argument的结构定义更改为
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
public int age;
[MarshalAs(UnmanagedType.LPStr, 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很有帮助.
小智 6
在结构体中,要封送定义为 char[] 的 char 数组,您应该使用 UnmanagementType.ByValTStr。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
public int age;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string name;
}
Run Code Online (Sandbox Code Playgroud)