C#部份
namespace testInteroperability
{
class MsgBoxTest
{
[DllImport("user32.dll")]
static extern int MessageBox(IntPtr hWnd,string text, string caption,int type);
public static void testMB()
{
MessageBox(IntPtr.Zero,
"Please do not press this again.", "Attention", 0);
}
}
}
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace testInteroperability
{
class testMyDLL
{
/*
* 内容:C#调用C++写的Native DLL的示例
* 作者:kagula
* 日期:20120920
* 测试环境:VS2008SP1 .NET FRAMEWORK 3.5
*
* 注意:
* [1]你需要使用exeScope工具查看C++的函数导出后在DLL中的入口名称
* 下面语句EntryPoint后跟的是C++函数导出后,在DLL中的入口名称
* 因为c++的重载机制,同个函数名可以有不同的参数和返回值等等,为了区别开来,所以加了@@之类
*
* [2]如果你经常修改C++DLL中的函数参数列表,VC会自动生成新的引用名称很不方便
* 这时,你可以在C++项目中,[Add]->[New Item]->[Visual C++]->[Code]->[Module-Definition File(.def)]
* 添加一个模块定义文件(.def),定义函数外部引用的名称。
*
* [3]你必须修改你的DLL项目的DLL输出路径到C#程序的输出路径中
* 例"<Solution所在路径>\<Solution名称>\<项目名称>\bin\Debug"
*
* [4]C++的DLL项目同C#测试DLL的项目要放在同一个Solution中
* 勾选C#项目属性[Debug]->[Enable Debuggers]->[Enable unmanaged code debugging]选项
* 现在调试你的C#项目自动会进入到你在C++项目中下的断点。
*
*
* 参考资料
* [1]《Type Library Importer in Managed Code》
* http://clrinterop.codeplex.com/releases/view/17579
* [2]《How to copy a String into a struct using C#》
* http://www.codeproject.com/Articles/7357/How-to-copy-a-String-into-a-struct-using-C
* [3]《C#中具体如何调用Win32函数》
* http://www.pinvoke.net
* [4]《C++字符集问题终极分析(可解决乱码问题)》
* http://hi.baidu.com/xddipuauedhkpqe/item/b59ee29082aaff35336eebcc
*/
//测试基本调用,引用名称,为VC自动生成
[DllImport(@"MyDLL.dll", EntryPoint = "?fnMyDLL@@YAHXZ")]