c#调用API

C#中调用API 在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:/Program Files/Microsoft Visual Studio .NET/Fram 阅读详情

转自 http://blog.youkuaiyun.com/koy0755/archive/2005/02/22/296864.aspx

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:/Program Files/Microsoft Visual Studio .NET/FrameworkSDK/Samples/Technologies/Interop/PlatformInvoke/WinAPIs/CS目录下有大量的调用API的例子。
一、调用格式
using System.Runtime.InteropServices; //引用此名称空间,简化后面的代码
...
//使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空。
[DllImport("user32.dll")]
public static extern ReturnType FunctionName(type arg1,type arg2,...);
//调用时与调用其他方法并无区别

可以使用字段进一步说明特性,用逗号隔开,如:
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
DllImportAttribute特性的公共字段如下:
1、CallingConvention 指示向非托管实现传递方法参数时所用的 CallingConvention 值。
  CallingConvention.Cdecl : 调用方清理堆栈。它使您能够调用具有 varargs 的函数。
  CallingConvention.StdCall : 被调用方清理堆栈。它是从托管代码调用非托管函数的默认约定。
2、CharSet 控制调用函数的名称版本及指示如何向方法封送 String 参数。
  此字段被设置为 CharSet 值之一。如果 CharSet 字段设置为 Unicode,则所有字符串参数在传递到非托管实现之前都转换成 Unicode 字符。这还导致向 DLL EntryPoint 的名称中追加字母“W”。如果此字段设置为 Ansi,则字符串将转换成 ANSI 字符串,同时向 DLL EntryPoint 的名称中追加字母“A”。大多数 Win32 API 使用这种追加“W”或“A”的约定。如果 CharSet 设置为 Auto,则这种转换就是与平台有关的(在 Windows NT 上为 Unicode,在 Windows 98 上为 Ansi)。CharSet 的默认值为 Ansi。CharSet 字段也用于确定将从指定的 DLL 导入哪个版本的函数。CharSet.Ansi 和 CharSet.Unicode 的名称匹配规则大不相同。对于 Ansi 来说,如果将 EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethod”。如果 DLL 中没有“MyMethod”,但存在“MyMethodA”,则返回“MyMethodA”。对于 Unicode 来说则正好相反。如果将 EntryPoint 设置为“MyMethod”且它存在的话,则返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,则返回“MyMethod”。如果使用的是 Auto,则匹配规则与平台有关(在 Windows NT 上为 Unicode,在 Windows 98 上为 Ansi)。如果 ExactSpelling 设置为 true,则只有当 DLL 中存在“MyMethod”时才返回“MyMethod”。

3、EntryPoint 指示要调用的 DLL 入口点的名称或序号。
  如果你的方法名不想与api函数同名的话,一定要指定此参数,例如:
[DllImport("user32.dll",CharSet="CharSet.Auto",EntryPoint="MessageBox")]
public static extern int MsgBox(IntPtr hWnd,string txt,string caption, int type);

4、ExactSpelling 指示是否应修改非托管 DLL 中的入口点的名称,以与 CharSet 字段中指定的 CharSet 值相对应。如果为 true,则当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Ansi 值时,向方法名称中追加字母 A,当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Unicode 值时,向方法的名称中追加字母 W。此字段的默认值是 false。
5、PreserveSig 指示托管方法签名不应转换成返回 HRESULT、并且可能有一个对应于返回值的附加 [out, retval] 参数的非托管签名。
6、SetLastError 指示被调用方在从属性化方法返回之前将调用 Win32 API SetLastError。 true 指示调用方将调用 SetLastError,默认为 false。运行时封送拆收器将调用 GetLastError 并缓存返回的值,以防其被其他 API 调用重写。用户可通过调用 GetLastWin32Error 来检索错误代码。

二、参数类型:
1、数值型直接用对应的就可。(DWORD -> int , WORD -> Int16)
2、API中字符串指针类型 -> .net中string
3、API中句柄 (dWord)  -> .net中IntPtr
4、API中结构   -> .net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类
公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用LayoutKind值初始化 StructLayoutAttribute 类的新实例。 LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。
LayoutKind.Explicit 用于控制每个数据成员的精确位置。利用 Explicit, 每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。如:
[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public class MySystemTime
{
    [FieldOffset(0)]public ushort wYear;
    [FieldOffset(2)]public ushort wMonth;
    [FieldOffset(4)]public ushort wDayOfWeek;
    [FieldOffset(6)]public ushort wDay;
    [FieldOffset(8)]public ushort wHour;
    [FieldOffset(10)]public ushort wMinute;
    [FieldOffset(12)]public ushort wSecond;
    [FieldOffset(14)]public ushort wMilliseconds;
}
下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:
/**********************************************
* API中定义原结构声明
* OSVERSIONINFOA STRUCT
*  dwOSVersionInfoSize   DWORD      ?
*  dwMajorVersion        DWORD      ?
*  dwMinorVersion        DWORD      ?
*  dwBuildNumber         DWORD      ?
*  dwPlatformId          DWORD      ?
*  szCSDVersion          BYTE 128 dup (?)
* OSVERSIONINFOA ENDS
*
* OSVERSIONINFO  equ  <OSVERSIONINFOA>
*********************************************/

//.net中声明为类
[ StructLayout( LayoutKind.Sequential )]   
public class OSVersionInfo
{   
    public int OSVersionInfoSize;
    public int majorVersion;
    public int minorVersion;
    public int buildNumber;
    public int platformId;

    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]    
    public String versionString;
}
//或者
//.net中声明为结构
[ StructLayout( LayoutKind.Sequential )]  
public struct OSVersionInfo2
{
    public int OSVersionInfoSize;
    public int majorVersion;
    public int minorVersion;
    public int buildNumber;
    public int platformId;

    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]    
    public String versionString;
}

此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给 Windows API 函数的字符串 (LPStr):
    [MarshalAs(UnmanagedType.LPStr)]
String existingfile;
    [MarshalAs(UnmanagedType.LPStr)]
String newfile;

注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。
[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );

三、如何保证使用托管对象的平台调用成功?
    如果在调用平台 invoke 后的任何位置都未引用托管对象,则垃圾回收器可能将完成该托管对象。这将释放资源并使句柄无效,从而导致平台invoke 调用失败。用 HandleRef 包装句柄可保证在平台 invoke 调用完成前,不对托管对象进行垃圾回收。
    例如下面:
        FileStream fs = new FileStream( "a.txt", FileMode.Open );
        StringBuilder buffer = new StringBuilder( 5 );
        int read = 0;
        ReadFile(fs.Handle, buffer, 5, out read, 0 ); //调用Win API中的ReadFile函数
由于fs是托管对象,所以有可能在平台调用还未完成时候被垃圾回收站回收。将文件流的句柄用HandleRef包装后,就能避免被垃圾站回收:
[ DllImport( "Kernel32.dll" )]
public static extern bool ReadFile(
  HandleRef hndRef,
  StringBuilder buffer,
  int numberOfBytesToRead,
  out int numberOfBytesRead,
  ref Overlapped flag );
......
......
        FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
        HandleRef hr = new HandleRef( fs, fs.Handle );
        StringBuilder buffer = new StringBuilder( 5 );
        int read = 0;
        // platform invoke will hold reference to HandleRef until call ends
        ReadFile( hr, buffer, 5, out read, 0 );

C#调用RESTful API 现在很多的网络服务都用RESTful API来实现。比如百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,好处是:调用更加灵活,也更容易扩展;JSON格式传输信息比XML减少约30%的数据量,效率更高。因此建议开发者使用REST风格的API。查找了很多调用Rest API网络碎片资料,总是无法理解或者生效。下面摘一点觉得有效果的作为参考吧。http://w 阅读详情

相关推荐

C#调用api接口

API函数是构筑Windows应用程序的基石,是Windows编程的必备利器。每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法

C#调用第三方API

【代码】C#调用第三方API。

m0_46081442的博客 2864

C#调用openAI的APi接口实现窗口聊天功能

.netframework6.0 使用Betalgo.OpenAI.GPT3库 实现从textBox1输入问题,点击发送按钮,提出的问题和结果显示到listBox1窗口 需要注意的是需要自己注册获得openAI的密钥,以及代理地址,否则无法访问获得结果

C# 调用 api

c# 调用api 例子

lijian260的专栏 1589

C#调用API教程

摘要:电子书籍,C#教程,Csharp教程   C# API大全pdf,内容涉及使用C#调用windows API 入门:   一:入门,直接从C# 调用DLL 导出   二.背后的原理―― 知其所以然,相关的知识   从.NET 平台调用Win32 API的一些基础知识以及编程实例,windows 数据类型探幽——千回百转你是谁?(1),用Visual C#调用Windows API 函数,主要的部分是API查询表,很详细,对c#很有用

低成本主从机械臂系统构建:6D位姿数据采集与VLA模型训练实战

本文详细介绍了如何构建低成本主从机械臂系统,实现高精度6D位姿数据采集与VLA模型训练。通过300美元级别的硬件组合,系统达到±1mm位置精度和≤0.5°姿态误差,满足Vision-Language-Action模型的多模态训练需求。文章涵盖硬件选型、数据采集技巧、模型训练实战经验,为机器人研究提供经济高效的解决方案。

r7s8t的博客 266

C# 两种方案实现调用 DeepSeek API

DeepSeek(深度求索) 最近可谓火爆的一塌糊涂,具体的介绍这里不再赘述,您可以各种搜索其信息,即使您不搜索,只要您拿起手机,各种关于 DeepSeek 的新闻、资讯也会扑面而来的推送到您面前。本人在闲暇之余也想了解一下其提供 API 的支持能力,也想试验一下 “嵌入式” 的应用体验。 打开官网,访问主页右上角的 API 开放平台,查看了一下 API 技术文档,果然不出所料,没有 C# 的调用示例,虽然语法调用都大同小异,但心中还是有些不爽,因此本文旨在提供相关的示例,仅供参考,希望对您有所帮助。

初九之潜龙勿用 2万+

手把手教你用ET-BERT预训练模型搞定加密流量分类(附完整代码)

本文详细介绍了如何使用ET-BERT预训练模型实现加密流量分类,包括环境配置、数据预处理、模型微调及优化策略。通过实战代码示例,帮助开发者快速掌握这一技术,提升网络安全领域的加密流量分析能力。

weixin_29166013的博客 494

C# 调用API接口

参考链接:https://blog.youkuaiyun.com/qq_35913274/article/details/79194046 get post 请求两种方式,我挑选了一种简单的方式 关于C#代码调用API接口获取到json数据的简单方法: using (var client = new WebClient()) { client.Encoding = Encoding.UTF8; string serviceA

qq_41918045的博客 1万+

14.4kW大功率母线变换器设计:LLC+矩阵变压器+GaN实战解析

在数据中心供电架构中,隔离母线变换器将高压直流母线转换为48V低压母线,是大功率供电链路的核心环节。随着功率密度与效率要求不断攀升,传统移相全桥与普通LLC方案已难以满足300A级输出需求。基于LLC/CLLC谐振拓扑,结合矩阵变压器与GaN功率器件,成为新一代高性能母线变换器的主流技术路线。矩阵变压器将大功率磁性元件拆分为多个小单元,配合原边串联副边并联结构,有效降低绕组损耗并提升功率密度;GaN器件则通过高频软开关进一步压减开关损耗。本文以一台14.4kW样机为例,完整梳理从拓扑选型、谐振参数计算、同步

weixin_28273593的博客 343

别急着做AI:FDE教你识别真需求,让AI真正落地

人工智能项目在落地过程中,经常出现业务方高喊“我们要做AI”,却说不清具体应用场景的现象。判断一个需求是否值得用AI实现,不能只看技术流行度,而要从问题出现频率、当前替代方案以及可量化业务价值三个维度展开验证。同时需要冷静比较规则引擎与大模型的边界:不是所有语义任务都要靠生成式模型,稳定、可解释且低成本的传统方案往往更具工程性价比。数据闭环也至关重要,缺乏历史样本与反馈回流路径的项目,很难在真实环境中持续优化。针对智能客服、合同审查或企业知识库等典型场景,可借助人机协同与最小代价的用户验证,逐步筛除伪需求,

weixin_42624889的博客 342

C#调用API

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:/Program Files/Microsoft Visual Studio .NET/Fram

民工 1700

告别unittest!用Pytest+Fixture重构你的Python测试代码(附实战案例)

本文详细介绍了如何从unittest迁移到Pytest框架,重点解析了Pytest的Fixture机制如何提升测试效率和代码简洁性。通过实战案例展示了Pytest在减少代码量、提升调试效率和资源管理方面的优势,帮助开发者重构Python测试代码。

weixin_26749245的博客 206

C#中API调用的多种方法

API( Application Programming Interface ),我想大家不会陌生

ocean_hhn的博客 7861

如何实现Docker镜像导入导出 ?

摘要: Docker镜像迁移与备份可通过两种方式实现:1)镜像操作(save/load)完整保存分层结构和元数据,适用于完整备份;2)容器操作(export/import)仅保存文件系统快照,适合创建轻量模板。关键区别在于前者保留历史记录和分层,后者生成单层镜像。save/load命令示例:docker save -o nginx.tar nginx:latest,export/import示例:docker export -o container.tar abc123 && docker

weixin_39291964的博客 875

基于Simulink的风电系统背靠背变流器解耦控制仿真

本文完成了基于 Simulink 的风电背靠背变流器解耦控制仿真,实现了:✅掌握 dq 解耦控制的数学本质✅构建 MSC + GSC 完整控制链✅验证其在动态、扰动下的卓越性能✅达成高解耦度、低 THD、稳母线三大目标。

xiaoheshang_123的博客 79

C#调用API的一些基础

<span style="font-family: function() { var id = (this._style >> 24) & 0xff; color: #800080; font-size: medium;">C#调用API的一些基础Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows A

熊小屁的专栏 743

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(一)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 2418

C#调用Windows API

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studi

Roby sky 796

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#调用Win32 api学习总结

转自:https://blog.youkuaiyun.com/bcbobo21cn/article/details/50930221 从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微软留给我们直接控制Windows的接口。 一. 基...

狂奔之林的博客 2552

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C#中调用Windows API的要点

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。如果为 true,则当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Ansi 值时,向方法名称中追加字母 A,当 DllImportAttribute.CharSet 字段设置为 CharSet 的 Unicode 值时,向方法的名称中追加字母 W。它是从托管代码调用非托管函数的默认约定。

biyusr的专栏 949

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c#调用API要点

在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下,希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话,在C:\Program Files\Microsoft Visual Studio .NET\Fr

u010254110的专栏 665
上一篇: c#做外挂
下一篇: C#如何快速高效地导出10万以上的大量数据?
wangfeng8317
博客等级 码龄20年 11粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值