各位大神们,小弟刚刚接触C#不久,这两天再用C#调用C++编写的MFC DLL,有一些问题不明白,想请教大家:(1)原来有这样的一段代码:(C#)
[DllImport("CheckDLL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern bool DoCheck( string strFilepath, ref bool bHasBook);
//........ bool bHasBook = false; DoCheck(ref bHasBook ); // DLL 会对bHasBook进行修改!!
//........我不明白的是,bHasBook这个变量应该在托管内存上,这样让外界的程序随意修改它,虽然可以行得通,但这种做法是不是不太标准?
(2)如果我将传入DLL的所有参数包装成一个结构体,请问如果结构体中含有Boolean 、 int 、 string,那我是不是必须使用Marshal分别为它们去分配非托管堆上的内存?然后才能让DLL进行更改?
之前我的程序没有这么做,总是提示我托管内存被修改的错误!如果我使用结构体进行DLL调用传参,有没有更方便的方式对其中的不同类型的成员进行操作呢?谢谢大家了!!!!
[DllImport("CheckDLL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern bool DoCheck( string strFilepath, ref bool bHasBook);
//........ bool bHasBook = false; DoCheck(ref bHasBook ); // DLL 会对bHasBook进行修改!!
//........我不明白的是,bHasBook这个变量应该在托管内存上,这样让外界的程序随意修改它,虽然可以行得通,但这种做法是不是不太标准?
(2)如果我将传入DLL的所有参数包装成一个结构体,请问如果结构体中含有Boolean 、 int 、 string,那我是不是必须使用Marshal分别为它们去分配非托管堆上的内存?然后才能让DLL进行更改?
之前我的程序没有这么做,总是提示我托管内存被修改的错误!如果我使用结构体进行DLL调用传参,有没有更方便的方式对其中的不同类型的成员进行操作呢?谢谢大家了!!!!
解决方案 »
- 简单问题,关于RichText...
- C#中以类的实例作为线程参数应该怎么操作
- C# winform 怎么在另一个Form类中操作主Form类中的控件呢?
- c#写的程序如何封装成一个可以在windows上随处运行的EXE
- 处女贴 ,大家多支持 ……
- C#中如何获取panel控件中的鼠标坐标???
- 不能将项目“jjj”中的依赖项“office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”复制到运行目录,因为它
- c#制作连连看时怎么初始化图片啊,望高手解答!
- 如何实现在A页面某事件触发B页面中的某个事件(C#)?
- 存储过程返回@@identity的问题!!!
- C#ping怎么返回多个值
- C#多次实例化
(2)传入不需要,如果传出指针的话,需要Marshal去拷贝内存。
结构体必须使用StructLayout(LayoutKind.Explicit) Attribute,保证每个字节大小、顺序都和对方一致。