博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#调用c++创建的dll
阅读量:6803 次
发布时间:2019-06-26

本文共 1440 字,大约阅读时间需要 4 分钟。

在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法,环境VS2005。

VS2005中很多工程都可以生成DLL,例如atl,mfc,win32等等。选择Win32,步骤如下:

1:新建项目TestDLL,选择win32中的win32控制台应用程序,在“应用程序设置”中,选择“应用程序类型”为DLL,并将下方的附加选项勾上“空项目”,就可以了。 

2:添加一个C++类,这时vs2005会生成TestDLL.h和TestDLL.cpp的文件,在.h文件中,键入如下代码:

 #define LIBEXPORT_API extern "C" __declspec(dllexport) 

 LIBEXPORT_API int f( char * ch);

//这是一个测试程序 

3:然后在.cpp文件中,必须加入DllMain函数以作为程序出口,并实现函数f:

 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

 {

//程序出口    

  return TRUE;

 } 

//函数的实现在这里 LIBEXPORT_API int f(char * ch)

 {    

  return 88;

4:编译生成,就能得到与项目同名的TestDLL.dll。

注意,生成的dll文件在外面的一个debug文件中。

接下来该怎么调用dll,分别在C++和C#做了调用。调用过程如下:

 C++调用:

 1:首先将dll文件加入工程,拷贝dll置于c++项目文件所在的目录。

 2:调用代码   typedef int (*TEST) (char * ch);

//定义调用DLL函数的类型  

 //下面是调用过程

  HINSTANCE hDLL;    TEST f;   hDLL = LoadLibrary(_T("TestDLL.dll"));

//加载动态链接库TestDLL.dll文件; 

  f = (TEST)GetProcAddress(hDLL,(LPCSTR)"f");

//调用的f函数  

 int si ;   si = f("abc");   

 FreeLibrary(hDLL);

//卸载TestDLL.dll文件;   

 cout<<si;  

 return 0;

3:结果——屏幕返回88,正确地调用了dll中的方法。 

C#调用:

 1:将dll文件拷贝至C#执行文件所在目录,一般在/bin/debug目录下;

 2:调用代码  

using System.Runtime.InteropServices;

  ... 

  ...     

 class CallDLL   

   {

//使用一个类封装所有dll的函数   

       [DllImport("TestDLL.dll", EntryPoint = "f",  

            CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

//指定dll访问入口     

     public static extern int  f(string s);

//定义调用dll中函数的类型     

 } ...

 //使用dll中的函数

 int m = CallDLL.f("mmm");

3:结果m的值正是88,操作成功。

转载于:https://www.cnblogs.com/cotty/archive/2012/02/23/2364236.html

你可能感兴趣的文章
TNS-00512: Address already in use-TNS-12542: TNS:address already in use
查看>>
什么是快速排序(转)
查看>>
会议论文重新投稿算不算侵权?这肯定是所多人都遇到过的问题。
查看>>
js判断checkbox状态,处理表单提交事件
查看>>
工程师,请优化你的代码
查看>>
BZOJ3495 : PA2010 Riddle
查看>>
探访莱布尼茨:与大师穿越时空的碰撞
查看>>
Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
查看>>
如何削减高速语言?
查看>>
山寨游戏的未来Apple App Store
查看>>
JSON.parse()和JSON.stringify()
查看>>
python出现UnicodeEncodeError有可能产生的另一个原因
查看>>
域名绑定,解析总结
查看>>
JAVA 网络长短连接
查看>>
transform,transition,animation 的混合使用——进阶
查看>>
【网络流】 HDU 3468 Treasure Hunting
查看>>
foobar2000播放APE格式音乐的解决办法
查看>>
Spring+Quartz实现定时任务的配置方法(插曲)
查看>>
一个基于cocos2d-x 3.0和Box2d的demo小程序
查看>>
(转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
查看>>