C#如何调用dll中的函数C++dll函数

C++与C#互调dll的实现步骤
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C++与C#互调dll的实现步骤,dll动态链接库的共享在一些大型项目中有一定的应用价值,需要的朋友可以参考下
本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dll动态链接库中可以用到。具体方法如下:
一、C#调用C++ dll步骤(只能导出方法):
1. c++建立空项目-&源文件文件夹中添加cpp文件和函数
2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持改为/clr
3. c#引用c++的dll
4. c#声明c++的方法,并添加 DllImport特性
5. c#工程属性设置为:目标平台x86
6. 注意方法的类型匹配
7. 引发PInvokeStackImbalance异常:注意:C++的"_declspec"和C#的“CallingConvention=CallingConvention.Cdecl”
另外,可以通过VS的异常窗口,取消掉对 PInvokeStackImbalance异常的检测:
点击VS的“调试 - 异常”,打开异常窗口,展开选择“Managed Debugging Assistants\PInvokeStackImbalance”,去掉对应的“引发”可选框。&
二、 c++调用 c# dll的步骤(可直接使用C#类):
1. 创建c++控制台应用程序
2. 拷贝c# dll到c++工程根目录
3. 工程属性-&配置-&常规-&公共语言运行时支持-&clr
工程属性-&配置-&c/c++常规-&调试信息格式-&zi
工程属性-&配置-&c/c++常规-&公共语言运行时支持-&clr
#using "CSharpDllProject.dll"
using namespace CSharpDllP
三、 c#调用c++类步骤(c++/cli,可直接使用C++类)
c++/cli简介:C++/CLI标准是基于Microsoft提交的标准C++与通用语言基础结构(Common Language Infrastructure)结合的技术
1.使用c++/cli语法对标准c++类进行包装(可采用聚合模式,引用标准c++类,实现所有标准c++的方法)
2.c#引用c++ dll后,可直接new出一个 c++/cli创建的托管类对象
希望本文所述方法对大家有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具提问于: 18:42
分享您的问题
所有回答(3)
C#直接调用不支持,你使用P/Invoke的话,只能引入DLL的引出函数,因此最好包装成标准的WIndows API风格在C#中调用;或者使用C++/CLI包装你的类,然后C#调用C++/CLI,不过调用层次有些多
园豆:16455
/question/.html
这里有个解答,LZ可以看看。
大概是加这么一句:
using System.Runtime.InteropS//引入dll文件中的函数
希望这篇文章对你有帮助,
&&&您需要以后才能回答,未注册用户请先。关注51Testing
C#动态调用C++编写的DLL函数
发表于: 10:46 &作者:fdyang & 来源:51Testing软件测试网采编
推荐标签:
  动态加载DLL需要使用 API函数:LoadLibrary、GetProcAddress以及FreeLibrary。我们可以使用DllImport在C#中使用这三个函数。  [DllImport("Kernel32")]  public static extern int GetProcAddress(int handle, String funcname);  [DllImport("Kernel32")]  public static extern int LoadLibrary(String funcname);  [DllImport("Kernel32")]  public static extern int FreeLibrary(int handle);  当我们在C++中动态调用Dll中的函数时,我们一般的方法是:  假设DLL中有一个导出函数,函数原型如下:  BOOL __stdcall foo(Object &object, LPVOID lpReserved);  1、首先定义相应的函数指针:  typedef BOOL (__stdcall *PFOO)(Object &object, LPVOID lpReserved);  2、调用LoadLibrary加载dll:  HINSTANCE hInst = ::LoadLibraryW(dllFileName);  3、调用GetProcAddress函数获取要调用函数的地址:  PFOO foo = (PFOO)GetProcAddress(hInst,"foo");  if(foo == NULL)  {  FreeLibrary(hInst);    }  4、调用foo函数:  BOOL bRet = foo(object,(LPVOID)NULL);  5、使用完后应释放DLL:  FreeLibrary(hInst);  那么在C#中应该怎么做呢?方法基本上一样,我们使用委托来代替C++的函数指针,通过.NET Framework 2.0新增的函数GetDelegateForFunctionPointer来得到一个委托的实例:  下面封装了一个类,通过该类我们就可以在C#中动态调用Dll中的函数了:public class DLLWrapper{///&summary&/// API LoadLibrary///&/summary&[DllImport("Kernel32")]public static extern int LoadLibrary(String funcname);///&summary&/// API GetProcAddress///&/summary&[DllImport("Kernel32")]public static extern int GetProcAddress(int handle, String funcname);///&summary&/// API FreeLibrary///&/summary&[DllImport("Kernel32")]public static extern int FreeLibrary(int handle);///&summary&///通过非托管函数名转换为对应的委托, by jingzhongrong///&/summary&///&param name="dllModule"&通过LoadLibrary获得的DLL句柄&/param&///&param name="functionName"&非托管函数名&/param&///&param name="t"&对应的委托类型&/param&///&returns&委托实例,可强制转换为适当的委托类型&/returns&public static Delegate GetFunctionAddress(int dllModule, string functionName, Type t){int address = GetProcAddress(dllModule, functionName);if (address == 0)elsereturn Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);}///&summary&///将表示函数地址的IntPtr实例转换成对应的委托, by jingzhongrong///&/summary&public static Delegate GetDelegateFromIntPtr(IntPtr address, Type t){if (address == IntPtr.Zero)elsereturn Marshal.GetDelegateForFunctionPointer(address, t);}///&summary&///将表示函数地址的int转换成对应的委托,by jingzhongrong///&/summary&public static Delegate GetDelegateFromIntPtr(int address, Type t){if (address == 0)elsereturn Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);}}
搜索风云榜
51Testing官方微信
51Testing官方微博
测试知识全知道C++调用C#的dll
相关文档 共39427条,当前页显示
贡献者:| 下载:
文件:27.50KB
贡献者:| 下载:
文件:40.50KB
贡献者:| 下载:
文件:40.00KB
贡献者:| 下载:
文件:13.50KB
贡献者:| 下载:
文件:87.28KB
贡献者:| 下载:
文件:52.50KB
贡献者:| 下载:
文件:94.67KB
贡献者:| 下载:
文件:18.32KB
贡献者:| 下载:
文件:105.09KB
贡献者:| 下载:
文件:586.52KB
贡献者:| 下载:
文件:191.45KB
贡献者:| 下载:
文件:126.42KB
贡献者:| 下载:
文件:87.93KB
贡献者:| 下载:
文件:146.25KB
贡献者:| 下载:
文件:2.12MB
贡献者:| 下载:
文件:105.00KB
贡献者:| 下载:
文件:119.75KB
贡献者:| 下载:
文件:168.12KB
贡献者:| 下载:
文件:130.68KB
贡献者:| 下载:
文件:15.82KB
贡献者:| 下载:
文件:101.64KB
贡献者:| 下载:
文件:64.06KB
贡献者:| 下载:
文件:6.53KB
贡献者:| 下载:
文件:324.28KB
贡献者:| 下载:
文件:71.83KB
贡献者:| 下载:
文件:59.79KB
贡献者:| 下载:
文件:46.00KB
贡献者:| 下载:
文件:336.00KB
贡献者:| 下载:
文件:528.86KB
贡献者:| 下载:
文件:3.79KB
相关标签:
随心阅读:IT人的最佳阅读工具
诚邀优质文档资源者入驻
阅读/下载:14/0 | 96.30KB
阅读/下载:281/0 | 27.50KB
阅读/下载:6/0 | 127.94KB
阅读/下载:6/0 | 301.58KB
阅读/下载:7/0 | 255.61KB
阅读/下载:33/0 | 16.50KB
阅读/下载:63/1 | 3.13MB
阅读/下载:1/0 | 22.00KB
阅读/下载:31/0 | 94.72KB
阅读/下载:1324/0 | 27.50KB
阅读/下载:14/0 | 96.30KB
阅读/下载:281/0 | 27.50KB
阅读/下载:6/0 | 127.94KB
阅读/下载:6/0 | 301.58KB
阅读/下载:7/0 | 255.61KB
阅读/下载:33/0 | 16.50KB
阅读/下载:63/1 | 3.13MB
阅读/下载:1/0 | 22.00KB
阅读/下载:31/0 | 94.72KB
阅读/下载:1324/0 | 27.50KB2002年10月 VC/MFC大版内专家分月排行榜第一2004年1月 软件工程/管理大版内专家分月排行榜第一2003年1月 软件工程/管理大版内专家分月排行榜第一
2002年10月 VC/MFC大版内专家分月排行榜第一2004年1月 软件工程/管理大版内专家分月排行榜第一2003年1月 软件工程/管理大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 易语言调用dll函数 的文章

 

随机推荐