平台启用服务

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

net平台启用服务(platform invocation Services,也称为PInvoke)允许受控代码与从dll导出的函数和结构一起工作。

(1)声明导出的dll函数

特性被用于为类型提供设计时刻的信息。通过反射,这些信息可以再运行时刻被查询,C#也是利用特性来能够向编译器藐视将要被调用的dll函数。如下所示:

[DllImport(params)]

accessmodifier static extern retValue dllFunction(paras);

dllImport具有以下几个参数:

a、CallingConvention 参数指示入口点的调用约定。如果未指定 CallingConvention,则使用默认值 CallingConvention.Winapi。

  

此成员可以含有以下值:

Winapi:此成员实际上不是调用约定,而是使用了默认平台调用约定。在windows上默认为stdCall,在wCE上默认为Cdecl

Cdcel:调用方清理堆栈,可以调用具有varargs的函数,可接受可变数目的参数的方法

StdCall:被调用方清理堆栈

ThisCall:第一个蚕食是this指针,它存储在寄存器ECX中,其他参数被推送在堆栈上,此调用约定多用于从非托管dll导出的类调用方法。

fastcall不支持此调用约定 

如: [DllImport("msvcrt.dll",CharSet=CharSet::Ansi,CallingConvention=CallingConvention::Cdecl)]
   static int printf( String^ format, int i, double d );
   [DllImport("msvcrt.dll",CharSet=CharSet::Ansi,CallingConvention=CallingConvention::Cdecl)]
   static int printf( String^ format, int i, String^ s );
 
b、CharSet 指示如何向方法奉送字符串参数,并控制名称重整。ExactSpelling 字段会影响 CharSet 字段在确定要调用的入口点名称时的行为。如果未指定 CharSet,则使用默认值 CharSet.Auto。

     此值具有如下成员:

   Ansi:以多字节字符串的形式封送字符串

  Unicode:以Unicode2字节形式奉送字符串

   Auto:针对目标操作系统适当地自动封送字符串,在windows NT,2000,xp和2003默认值为Unicode,在Windows 98和me上默认值为Ansi,使用语言可以重写此默认值。


c、EntryPoint 参数给出 dll 中入口点的名称。如果未指定 EntryPoint,则使用方法本身的名称。 指定入口点名称时,您可以提供一个字符串来指示包含入口点的 DLL 的名称,或者也可以按序号来标识入口点。序号以 # 符号为前缀,如 #1。


d、ExactSpelling 参数指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配。如果未指定 ExactSpelling,则使用默认值 false。


e、PreserveSig 指示是否直接转换具有 HRESULTretval 返回值的非托管方法,或是否自动将 HRESULTretval 返回值转换为异常。如果未指定 PreserveSig,则使用默认值 true。

// Use the DllImportAttribute to import the SHAutoComplete function.
    // Set the PreserveSig to false to specify exception errors.
    [DllImportAttribute("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true, PreserveSig = false)]
    public static extern void SHAutoComplete(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);

    // Use the DllImportAttribute to import the SHAutoComplete function.
    // Use the default value of the PreserveSig field to specify HRESULT errors.
    [DllImportAttribute("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true)]
    public static extern int SHAutoCompleteHRESULT(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);


f、SetLastError 参数指示方法是否保留 Win32"上一错误"。如果未指定 SetLastError,则使用默认值 false。

g、BestFitMapping 将Unicode字符转为ANSI字符时,启用或禁用最佳映射行为。 
此外,用 DllImport 属性修饰的方法必须具有 extern 修饰符。

 

(2)回调函数

C#程序不仅可以调用一个dll函数,而且dll函数也可以在回调场景中调用C#方法。定义dll函数及委托——调用dll函数——实例化委托来实现的。

 

(3)汇集和PInvoke

每次调用一个dll函数时,net必须吧参数汇集到被调用函数,并且把值返回给进行调用的net程序。net已经为每一种net类型定义了一个默认的本地类型。

但是,可以使用MarshallAs特性覆盖默认的net汇集行为。

例如:

[DllImport("user32.dll")]

static extern int MessageBox(int hwnd,[MarshallAs(UnmanagedType.LPWStr)string msg,[MarshallAs(UnmanagedType.LPWStr)string caption);

 

 

 

推荐官方开源 PInvoke 库 包含大量 win32 封装 在调用 win32 库的时候,小伙伴会遇到的问题是不知道对应的 win32 函数应该如何写。或者在网上抄了的代码的实现都有些诡异,想要自己封装发现工作量太大。好消息是官方将 PInvoke 库在 dotnet 基金会完全开源,包含了大量的 Win32 库,如 gdi32.dll 和 kernel32.dll 和 user32.dll 等 使用官方的库的优势是什么呢?第一个就是减少从网上复制粘... 阅读详情

相关推荐

C#与C++互操作

C#调用C++ C#通过PInvoke调用WIN32 API C++、C#基本数据类型的异同 基本值类型的数据封送 字符串的数据封送 指针的数据封送 函数指针的数据封送 结构体的数据封送 完整代码 注意事项 C#通过C++/CLI调用C++的DLL C++调用C#. C++中通过C++/CLI调用.NET编写的DLL 托管代码和非托管代码的交互技术有3种:平台调用(PIn...

写作帮助思考 7873

手把手教你PInvoke

当你写久了应用层代码,是不是需要来玩一下硬件呀? 这个时候你就会接触到一些美妙的dll,比如user32.dll,kernal32.dll 当然这些是非托管的代码,我们在.net中无法直接使用,所以我们会需要使用PInvoke进行调用 于是你会使用DllImport特性标记一个方法,引入非托管函数 比如 我们希望弹出一个消息框,就会使用下面这个函数,添加DllImport特性,表明从哪个dll引...

黄腾霄的博客 4078

宇视VM平台:从零部署到核心服务启用的实战指南

本文详细介绍了宇视VM平台的从零部署到核心服务启用的完整流程,包括环境准备、软件安装、关键配置和服务验证等关键步骤。通过实战经验分享,帮助用户快速掌握VM平台部署技巧,确保视频监控系统稳定运行。特别针对软件安装过程中的常见问题提供了解决方案。

weixin_32175665的博客 188

C#和C/C++交互---Pinvoke

在开发unity的时候,要想在C#里调用C++的方法,我一般采用PInvoke的方式。在C++里,需要在需要被导出的函数前添加“extern C”,这样抱住函数定义的名字和导出的名字一致,否则如果按照默认方式导出,函数名将很混乱导致我们的程序无法找到入口。

qq_35064654的博客 925

C# PInvoke(DllImport使用) 进阶教程(一)

前言-引用截图 编写目的 我们曾经熟悉的WindowsAPI,我们曾经花费了大量精力写的代码,难道我们就要轻易放弃吗不过当下微软已经把向下兼容性放在很重要的位置. C#程序员使用已有的代码来作为自己程序的一部分是很普通的事情.所以NET为了解决使用已有代码的问题作了很多方面的工作.比如说对于已有的C++  代码你可以使用C++托管扩展(ma...

weixin_30511107的博客 412

微信平台服务器要求,公众号服务器配置需要启用

公众号服务器配置需要启用吗 内容精选换一换用户无法查询到弹性云服务器私网IP地址信息。本问题请按照以下思路进行排查处理。查看DHCP是否为启用状态检查是否存在dhclient进程检查弹性云服务器日志检查子网的DHCP是否为启用状态(默认“启用”状态)。进入子网详情页面,查看DHCP是否为“启用”状态,若DHCP开关为关闭状态请参考3手动配置静态IP。执行如下命令,检查是否存在dh网站的访问与云服务...

weixin_36085895的博客 1093

TDengine 实战指南:启用 taosAdapter 的 6041 端口 RESTful 服务,打通跨平台数据连接

本文详细介绍了如何启用TDengine的taosAdapter 6041端口RESTful服务,实现跨平台数据连接。通过实战演示Python和Java的集成方法,提供性能优化与安全加固建议,帮助开发者高效解决异构环境下的数据互通问题。文章重点解析了REST连接的优势与配置技巧,适用于物联网和大数据应用场景。

weixin_42561476的博客 426

Tomcat等代理服务器运行时启用HTTPS | MSCode微服务平台框架代码源码

Tomcat等代理服务器运行时启用HTTPS。 MSCode微服务平台框架mscodecloud.com 代码示例 server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto @Configuration(proxyBeanMethods = false) ...

iframework的博客 268

如何在hisi平台里面启用httpd-web服务

海思平台系统如3516A/D , 3519V101 都会自带httpd web服务器, 只需要在系统中启动httpd 进程即可。 如下是我在3516D里面 httpd -p 8080 -h /var/app/www & -p 8080 为指定 8080 端口号,由于我程序里面已经使用了80端口作为服务端。因此在这我另外指定端口号。不然,会导致冲突,其中一个进程起不了 ...

kenny的专栏 1866

NaViL-9B快速部署:基于CSDN GPU平台的7860端口服务启用教程

本文介绍了如何在星图GPU平台上自动化部署NaViL-9B镜像,快速搭建多模态大语言模型服务。该镜像支持文本问答和图片理解功能,适用于电商客服、内容审核等场景,通过简单的Web界面或API即可实现图文交互。

weixin_28793831的博客 88

在 ABAP 平台启用 SAML 2.0 服务提供者:从零到可用的系统级实践指南

摘要:本文详细介绍了在ABAP平台启用SAML 2.0服务提供者(SP)的完整过程,包括基本原理、标准操作步骤和注意事项。主要内容涵盖:启用SAML 2.0支持的必要性、最小可行配置步骤、关键组件(PSE/SSF/元数据)解析、必须激活的ICF服务、实施检查清单及后续配置建议。文章还结合Microsoft Entra ID和SAP IAS等实际集成案例,提供常见问题排查指南,帮助开发人员顺利完成企业级SAML身份认证集成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 289

我校CSDN高校俱乐部启用微信服务平台服务我校师生

随着科技的发展,微信已经走入许多人的手机,成为一种新型的通讯工具。本着科技兴社的原则,烟台南山学院CSDN高校俱乐部成为我校首个使用微信,服务我校师生的社团。初期效果明显,得到广大师生的好评。我们会继续努力,本着服务的态度走到同学们当中去。(宣传外联部供稿,秘书处责编)   感谢本社网站新闻中心的同学们,为社团所做的努力。     关注烟台南山学院CSDN高校俱乐部官方微信,即时收取活动

烟台南山学院CSDN高校俱乐部 853

如何在服务器上登录微信平台,怎么启用微信公众平台的基本设置的服务器设置...

启用微信公众平台的基本设置的服务器设置该怎么做呢,那么怎么启用微信公众平台的基本设置的服务器设置的呢?下面是学习啦小编收集整理的怎么启用微信公众平台的基本设置的服务器设置,希望对大家有帮助~~启用微信公众平台的基本设置的服务器设置工具/原料微信公众号服务器(空间也可以)域名方法/步骤https://mp.weixin.qq.com 首先复制链接登录微信公众平台进入后台后,在左边导航选择开发/基本设...

weixin_39595430的博客 742

微信公众平台同时启用服务器配置与自定义菜单,方法:

1、禁用服务器配置 2、再修改菜单 3、再启用服务器配置 4、点击“+添加功能插件”页面找自定义菜单 5、启用 注意:第4,5步一定不要忽略

心尘无尽的博客 1764

Tomcat等代理服务器运行时启用HTTPS | MSCode微服务平台框架代码源码

Tomcat等代理服务器运行时启用HTTPS。 MSCode微服务平台框架mscodecloud.com 代码示例 server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto ...

qq_40246695的博客 235

微信公众平台服务器配置启用说明

在微信公众平台机型服务器配置的时候,下图中的服务必须先在服务端跑起来,后台接口使用java开发。

蜗牛的高铁 642

微信公众平台如果想同时启用服务器配置与自定义菜单,可以这样做:

如果想同时启用服务器配置与自定义菜单,可以这样做: 需要修改菜单的时候 本文结合百度知道@secretid 用户的回答和我的实践,转载需要标明。 1、禁用服务器配置 2、再修改菜单 3、再启用服务器配置 4、点击“+添加功能插件”页面找自定义菜单(这一步非常重要) 5、启用(这一步非常重要) 第4,5步一直被忽视 ...

GOOD LUCK 1万+

启用Spring项目的HTTP压缩 | MSCode微服务平台框架代码源码

启用Spring项目的HTTP压缩。 MSCode微服务平台框架mscodecloud.com 代码示例 server.compression.enabled=true text/html text/xml text/plain text/css text/javascript application/javascript ...

iframework的博客 399

微信开发一【启用公众平台服务器配置】

为什么80%的码农都做不了架构师?>>> ...

weixin_34250709的博客 120
上一篇: .net 获取文件格式
下一篇: COM调用
mayue406
博客等级 码龄19年 7粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值