dotnet下如何使用API函数

如题所述

Windows API就是Windows系统的API函数简称(Application Program Interface,即:应用程序接口函数),它是Windows操作系统提供给各种开发基于Windows平台应用软件的开发语言的一些公用的函数,这些函数一般都比较底层,所以当各种开发语言使用自带的函数或类库已无法解决问题时,调用Windows API函数往往是一种非常直接、有效的解决方法。但由于在程序中调用Windows API函数一般都很复杂,所以对于程序员来说,是否能够灵活的使用Windows API函数,往往也是其水平高低的一个重要标志。但自从微软推出.Net框架以后,各种开发基于.Net平台下的程序语言,如Visual Basic .Net、Visual C#等却很少使用Windows API函数,并且微软公司也不像以前那样,提倡在这些.Net开发语言中使用Windows API函数,其主要的原因如下:

  1. .Net框架所附带的类库.Net FrameWork SDK是一个内容丰富、功能强大的软件开发包,各种Windows API函数所实现的各种功能几乎都可以在这个软件开发包中找到与之对应的部分。

  2. 微软Visual Basic .Net、Visual C#等目的是编写跨平台的应用程序,如果在Visual Basic .Net、Visual C#等中使用Windows API函数,这也就注定了编写出的程序只能运行于Windows平台之下,而弱化了.NET的跨平台能力。这也就是为什么微软不提倡在.Net平台调用Windows API函数的原因。

  虽然微软并不提倡在Visual Basic .Net、Visual C#中调用Windows API函数,但由于目前.Net 框架推出时间较短,.Net FrameWork SDK中提供的类库还并不足以完全替换Windows API函数的所有功能,所以在某些时候,.Net开发语言还是必须要调用Windows API函数。

  一.平台调用、托管DLL、非托管DLL简介:

  托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为“DLL”的文件。具体所指就是封装各种命名空间所在的DLL文件,如System.dll等。非托管DLL就是平常所的动态链接库等,其中就包括了封装所有Windows API函数的DLL文件。各种非托管DLL中的函数在公共语言运行库中不能直接被调用,而需要经过.Net框架提供的“平台调用”服务后才可以。

  “平台调用”是.Net框架为Visual Basic .Net、Visual C#等.Net开发语言提供的一种服务,用以在托管代码中引入各种非托管DLL中封装的函数(其中包括Windows API函数)。“平台调用”依赖于元数据在运行时查找导出函数并封装其参数。图01公共语言运行库利用“平台服务”调用非托管DLL中的函数的流程图:

图01:“平台服务”的调用非托管函数的流程图
  在托管代码中使用“平台调用”服务调用非托管DLL中封装的函数时,“平台服务”将依次执行以下操作:

  1. 查找包含该函数所在的DLL文件。

  2. 如果找到,则将该DLL文件 加载到内存中。

  3. 查找函数在内存中的地址并将其参数推到堆栈上,并封送所需的数据。

  4. 将控制权转移给非托管函数。 这样整个函数调用完成。

  在Visual Basic .Net中使用“平台调用”服务,申明Windows API函数主要有二种具体的实现方法:

  1. 使用DllImport特征类来申明Windows API函数。

  2. 使用“Declare”语句来申明Windows API函数。

  这二种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明Windows API函数时出错,所以并不提倡。而第二种方法相对简单,并且又保存了以前Visual Basic中的很多语法,所以在平常时大都使用这种方法来申明Windows API函数。
温馨提示:内容为网友见解,仅供参考
无其他回答

dotnet下如何使用API函数
1. 使用DllImport特征类来申明Windows API函数。2. 使用“Declare”语句来申明Windows API函数。这二种方法虽有异曲同工之效,但在繁简上却有很大差异,第一种方法申明过程比较复杂,很容易在申明Windows API函数时出错,所以并不提倡。而第二种方法相对简单,并且又保存了以前Visual Basic中的很多语法,...

使用C# 进行AI工程开发-应用篇(一):使用 Minimal Api 开发 Api 服务
首先创建Minimal API项目,代码量极简。在appsetting.json中配置服务URL,运行项目后,通过https:\/\/127.0.0.1\/swagger可以访问Swagger UI。为了使项目更正式,可以生成API文档,并将API代码集中于专门的目录中。BaseApi.cs文件作为API基类,可以在此基础上创建派生类。在Program.cs中调整配置,例如选择Gene...

DotNetCorePlugins- 动态加载和卸载 .NET 程序插件
要使用DotNetCorePlugins,首先安装McMaster.NETCore.PluginsNuGet包。主要API为PluginLoader.CreateFromAssemblyFile,用于从文件加载程序集。定义插件接口并实现。例如,创建一个包含GetName方法的接口,插件直接实现此接口。主程序通过PluginLoaderAPI加载插件,通常基于约定查找磁盘上的插件程序集,避免插件冲突与...

dotnet CLI工具是如何运行你的代码的
传统的 .NET 可执行文件需要借助操作系统技巧执行,如Windows检查 EXE 文件头确定架构,然后加载相应的 MSCorEE.dll,最后调用其入口点方法启动托管应用程序。然而,在引入新的跨平台 CoreCLR 和 CLI 工具后,执行流程发生了变化。要深入了解这一过程,需设置环境变量 COREHOST_TRACE 和 DOTNET_CLI_CAPTURE...

dotnet项目执行shell脚本实现简单的自动化部署
!\/bin\/bash#杀死占用8081端口的进程kill-9$(lsof-i:8081-t)cd\/home\/web\/web-demo\/#拉取代码gitpull#发布项目到publish文件夹dotnetpublish-opublishcdpublish\/#后台运行项目nohupdotnetWebDemo.dll--urlshttp:\/\/0.0.0.0:8081&添加执行权限 chmoda+xpublish.sh创建一个Demo项目部署到服务器,托管...

使用机器学习算法在 .NET Core 中运行的 100% C# 开源 AI 聊天机器...
要开始使用BotSharp,只需在项目中安装相应的NuGet包,包括`BotSharp.Core`和`BotSharp.RestApi`。首先,从其他聊天机器人平台导出代理。不同平台的导出方式各异,通常可以通过平台提供的功能将其导出为压缩文件。接着,将`meta.json`文件添加到压缩文件中。此文件用于告知BotSharp代理的来源,内容应包含代理...

适用于 .NET 的 现代化 HTTP 请求客户端 FluentHttpClient
开始使用前,请从 Nuget 中安装 Pathoschild.Http.FluentClient。基本用法示例:这是一个简单的 GET 请求,将响应内容反序列化为 Item 类。您还可以定义公共客户端,利用内置连接池提高性能,并在构造函数中设置 URL。客户端库提供开箱即用的 DELETE、GET、POST、PUT 等方法。URL 参数设置:您可以使用...

[c#.net资料]将VS2019的智能提示改为中文(API汉化)
1)C:\\Program Files\\dotnet\\packs 接着,查找对应版本的本地化文件。2)前往微软的本地化IntelliSense文件下载页面。3)选择与你系统版本相匹配的本地化文件。下载后,解压文件,获取三个文件。将这三个文件分别放入以下对应目录:1)复制zh-hans文件至路径:C:\\Program Files\\dotnet\\packs\\Microsoft....

Dotnet到底是什么技术? - 知乎
`next`参数在中间件间形成调用链,确保流程的连续性。中间件的执行流程可以被设计为“短路”形式,即执行完毕后即返回数据给客户端,不进入下一个中间件。这种设计可通过去掉`await next.Invoke()`来实现。此外,中间件可以与Endpoint映射,以提供简单的API处理,映射支持嵌套,以实现复杂的路由逻辑。在...

asp.net 8 中的 RequestTimeoutsMiddleware
.NET 8 引入了 RequestTimeoutsMiddleware,为实现请求超时处理提供了便利。以下示例将展示如何使用此功能。在全局范围内设置默认超时时间为1秒。为了验证,我们添加了一个测试的endpoint,名为\/timeout,其中处理逻辑包含了5秒的延迟,这将导致请求超时。使用dotnet-httpie测试API请求时,预期结果为504状态码。

相似回答
大家正在搜