`
132sh
  • 浏览: 38191 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

.net 如何用C/C++的DLL

阅读更多
一、DLL与应用程序

动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。

动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。

DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

1)        使用较少的资源

当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。

2)        推广模块式体系结构

DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。

3)        简化部署和安装

当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。

二、DLL的调用

每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。

(一)     调用DLL中的非托管函数一般方法

首先,应该在C#语言源程序中声明外部方法,其基本形式是:

[DLLImport(“DLL文件”)]

修饰符 extern 返回变量类型 方法名称 (参数列表)

其中:

DLL文件:包含定义外部方法的库文件。

修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。

返回变量类型:在DLL文件中你需调用方法的返回变量类型。

方法名称:在DLL文件中你需调用方法的名称。

参数列表:在DLL文件中你需调用方法的列表。

注意:需要在程序声明中使用System.Runtime.InteropServices命名空间。

      DllImport只能放置在方法声明上。

DLL文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path所设置的路径)。

返回变量类型、方法名称、参数列表一定要与DLL文件中的定义相一致。



若要使用其它函数名,可以使用EntryPoint属性设置,如:

[DllImport("user32.dll", EntryPoint="MessageBoxA")]

static extern int MsgBox(int hWnd, string msg, string caption, int type);

其它可选的 DllImportAttribute 属性:

CharSet 指示用在入口点中的字符集,如:CharSet=CharSet.Ansi;

SetLastError 指示方法是否保留 Win32"上一错误",如:SetLastError=true;

ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配,如:ExactSpelling=false;

PreserveSig指示方法的签名应当被保留还是被转换, 如:PreserveSig=true;

CallingConvention指示入口点的调用约定, 如:CallingConvention=CallingConvention.Winapi;


C#例子:

1.       启动VS.NET,新建一个项目,项目名称为“Tzb”,模板为“Windows 应用程序”。

2.       在“工具箱”的“ Windows 窗体”项中双击“Button”项,向“Form1”窗体中添加一个按钮。

3.       改变按钮的属性:Name为 “B1”,Text为 “用DllImport调用DLL弹出提示框”,并将按钮B1调整到适当大小,移到适当位置。

4.       在类视图中双击“Form1”,打开“Form1.cs”代码视图,在“namespace Tzb”上面输入“using System.Runtime.InteropServices;”,以导入该命名空间。

5.       在“Form1.cs[设计]”视图中双击按钮B1,在“B1_Click”方法上面使用关键字 static 和 extern 声明方法“MsgBox”,将 DllImport 属性附加到该方法,这里我们要使用的是“user32.dll”中的“MessageBoxA”函数,具体代码如下:

[DllImport("user32.dll", EntryPoint="MessageBoxA")]

static extern int MsgBox(int hWnd, string msg, string caption, int type);

然后在“B1_Click”方法体内添加如下代码,以调用方法“MsgBox”:

MsgBox(0," 这就是用 DllImport 调用 DLL 弹出的提示框哦! "," SDF ",0x30);

分享到:
评论

相关推荐

    C#【必备技能篇】VS2019 使用C/C++ 生成DLL 文件,并用 C/C++、C#调用DLL

    在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行...

    Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

    只需确保C++函数声明遵循C语言的命名约定(通常是extern "C"),并且C语言的DLL导出函数不使用C++特有的特性,如类、模板或异常。 4. **C#调用C/C++ DLL**:C#可以通过.NET Framework的P/Invoke(Platform Invoke)...

    C#调用C/C++ Dll中函数实例代码

    在.NET框架中,C#作为高级编程语言,与C或C++编译的动态链接库(DLL)交互是常见的需求。这种交互主要通过平台调用服务(Platform Invoke, P/Invoke)来实现,使得托管代码(如C#)能够调用非托管代码(如C/C++的DLL)...

    ASP.NET调用C++的DLL

    ASP.NET调用C++的DLL是一个常见的跨语言技术,在.NET框架下实现对原生C++动态链接库(DLL)的功能调用,可以充分利用C++的性能优势和.NET的易用性。以下将详细介绍这一过程的关键步骤和涉及的技术点。 1. **C++ DLL...

    VS2010使用VB.NET调用C++的DLL例子

    本示例涉及的是如何在Visual Studio 2010(简称VS2010)中使用VB.NET调用C++编写的动态链接库(DLL)。这个过程涉及到.NET Framework与非托管代码之间的交互,即所谓的“平台调用”(P/Invoke)。 首先,我们要了解...

    C/C++文件监控通用DLL

    对于C#开发者来说,虽然.NET框架提供了FileSystemWatcher类,可以直接用来监控文件系统变化,但使用C/C++文件监控通用DLL可以跨平台,不受.NET框架限制。只需通过P/Invoke技术(Platform Invoke)调用DLL中的函数,...

    基于C语言QT开发的校园导游系统.zip

    同时也支持使用cmake+mingw编译运行,注意mingw需要支持C++11标准以上,以及需要将对应的qt目录中mingw的dll目录添加进环境变量中。 也可以打开文件夹 school_guied_system1.0,直接运行其中的 school_guied_system...

    C/C++ 调用Adobe Acrobat Reader DC实现PDF文件打印

    本话题聚焦于使用C/C++编程语言调用Adobe Acrobat Reader DC来实现PDF文件的打印功能。Adobe Acrobat Reader DC是一款广泛使用的PDF阅读器,它提供了丰富的API接口,允许开发者通过编程方式控制其行为,包括打开、...

    python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    t532.rar 测试代码 https://blog.csdn.net/wowocpp/article/details/105382257 python 调用 C++ dll 32位 64位 问题 ctypes.cdll.LoadLibrary

    vc++.net用mfc方式调用dll

    在VC++.NET中,使用MFC(Microsoft Foundation Classes)调用DLL(动态链接库)是一项常见的编程任务。MFC是一个C++类库,它为Windows应用程序开发提供了丰富的接口,而DLL则是一种可重用的代码模块,允许不同程序...

    vscode C/C++环境配置助手

    【标题】:“vscode C/C++环境配置助手” ...通过`VSCodeConfigHelper.exe`这个程序,用户可以避免手动操作的复杂性,借助`Newtonsoft.Json.dll`库处理数据,从而更轻松地在VSCode中进行C/C++编程。

    解开VC++调用.Net DLL的神秘面纱

    这里,`extern "C"`确保编译器使用C调用约定,`__declspec(dllimport)`表示此函数是从外部DLL导入的,`__stdcall`是.NET方法的默认调用约定。 2. **加载DLL**:在程序运行时,我们需要加载.NET DLL。可以使用...

    vc6.0企业版

    它是C/C++编程语言的重要工具,尤其在20世纪90年代末到21世纪初,它在软件开发领域占据了主导地位。这款IDE集成了编译器、调试器和其他开发工具,为程序员提供了高效便捷的开发环境。 在C语言学习和考试系统中,VC...

    《精通.NET互操作:pinvoke, c++ interop和COM interop》全部源代码

    P/Invoke是.NET与C/C++代码交互的基础,尤其在处理操作系统级别的功能如文件操作、进程控制等时必不可少。 2. **C++ Interop(C++互操作性)** C++ Interop,也称为CLI(Common Language Infrastructure)C++,是...

    C/C++软件版本号设置和获取,加入编译时间

    获取的版本号信息类似如下格式,1.0为你要设置的版本号,后面为该版本的编译时间 1.0-V-2013-05-09T15:34:49(具体见博客:) https://blog.csdn.net/li171049/article/details/128670755

    C#调用C++DLL导出类

    在.NET环境中,C#代码通常与C++代码交互是通过平台调用(P/Invoke)或托管C++来实现的。...对于大型项目,考虑使用C++/CLI作为桥接层,它允许在.NET和C++之间直接进行互操作,无需转换为C风格的函数接口。

    在Unity3d中使用C++ DLL 之 回调 示例

    本文将详细介绍如何在Unity3d中使用C++ DLL,并提供回调函数的示例。 首先,我们需要理解Unity3d与C++ DLL交互的基本原理。Unity是基于Mono的.NET框架,而C++是原生代码,它们之间不能直接通信。为了解决这个问题,...

Global site tag (gtag.js) - Google Analytics