C#调用c++创建的dll
2012-05-26 15:16
246 查看
在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,操作成功。
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,操作成功。
相关文章推荐
- C#调用c++创建的dll
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- C#调用C++创建的DLL
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
- C#调用c++创建的dll
- 在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法
- C#中调用c++的dll具体创建与调用步骤,亲测有效~
- 在C#调用C++的DLL方法(一)生成非托管dll
- c#调用c++dll找不到入口点,一秒搞定
- C# 调用C++的dll,通过DllImport方式。 from http://www.cnblogs.com/xiaokang088/archive/2011/04/08/2009673.html
- C#调用C++的dll两种方法(托管与非托管)
- com调用的几种方法 及 C#调用C++编写的的COM DLL收藏
- C++通过DLL调用C#代码
- C#调用C++Dll封装时遇到的一系列问题【转】
- C# 调用Dll中非托管C++代码,函数参数的类型对照
- C#用委托调用C++写的dll里面的函数指针
- C#与C++的非托管代码交互小试(C#调用C++的DLL)