[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Unicode)]
public struct tttsss
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=10)]
public string name;
} [DllImport("a.dll", CharSet = CharSet.Unicode)]
private static extern void ttaa(ref tttsss); // dll调用函数
public void dtta()
{
tttsss hk = new tttsss(); // 为什么编辑器在该语句执行完后看到hk.name还是null?
ttaa(hk); // 函数对hk没任何操作从该函数出来后hk.name值变成""?
hk.name = "abcdefghijklmn"; // 该语句结束后不应该是限制10个字节的输入么?怎么直接变成了"abcdefghijklmn"?还是string的被改变了已经不是原来new的内存空间?
}问题1,到底结构的内存空间分配是在什么情况下才实现?问题2,结构内的字符串怎么在C#中修改才保证在分配的内存空间内呢?
解决方案 »
- 安装vs2010软件,自带示例源代码怎么找不呀?
- 如何 删除上传数据中图片名称 及图片存放文件夹中对应的图片
- 为什么不进if语句!?????
- 关于控件dateTimePicker绑定数据的问题
- 求助:在C#中如何注册一个事件
- 安装visual studio2005需要怎么配置机器?
- 如何用ListView读取ini文件
- 如何增加XML节点的一个属性,请指点!!!!!!!!!
- 如何将DataGrid生成Excel,并且要求将DataSet数据写入Excel模版,再另存为新的文件?
- C#编写的DLL怎么隐藏私有成有?
- 关于HttpWebResponse的问题
- 很多人问.NET入门以后怎么办,随便说两句我的看法
MarshalAs是Attribute,Attribute可以认为是捆绑了一些声明Information,这些Information可以在程序需要时利用反射来获得。因此,MarshalAs仅仅在平台调用封送数据(即调用Dll)的那一刻才会起作用(类似于参数的作用),平时可以无视它
托管环境和非托管环境下的数据传递必须进行锁定或复制。而String类型因其在两种环境下的差异,而必须进行转换及复制(无论是In或Out),指定MarshalAs后,转换及复制在Dll调用及返回时由系统自动完成