关于PInvoke 和COM Interop.
1. 平台调用
利用平台调用这种服务,托管代码可以调用在动态链接库 (DLL)(如 Win32 API 中的 DLL)中实现的非托管函数。此服务将查找并调用导出的函数,然后根据需要跨越互用边界封送其参数(整数、字符串、数组、结构等)。
要封装平台功能,一种有效的方法是将常用的 DLL 函数包装在托管类中。虽然不必在每种情形下都这样做,但由于定义 DLL 函数可能会相当麻烦并且容易出错,所以提供类包装是一种很方便的方法。如果您使用 Visual Basic 或 C# 进行编程,则必须在一个类或 Visual Basic 模块中声明 DLL 函数。
在一个类中,为每个要调用的 DLL 函数定义静态方法。定义中可以包括一些附加信息,如在传递方法参数时使用的字符集或调用约定;如果省略这些信息,将选择默认设置。包装之后,就可以按照对其他任何静态函数调用方法的相同方式来对该函数调用方法。平台调用将自动处理底层的导出函数。
为平台调用设计托管类时,应考虑类和 DLL 函数之间的关系。例如,您可以:
您可以将该类及其方法命名为任意名称。
DLL 函数的标识包括以下元素:
例如,如果指定 User32.dll 中的 MessageBox 函数,需要标识该函数 (MessageBox) 及其位置(User32.dll、User32 或 user32)。Microsoft Windows 应用程序编程接口 (Win32 API) 可以包含每个字符和字符串处理函数的两个版本:单字节字符 ANSI 版本和双字节字符 Unicode 版本。如果不进行指定,<link tabindex="0" keywords="frlrfSystemRuntimeInteropServicesDllImportAttributeClassCharSetTopic"> 字段所表示的字符集将默认为 ANSI。某些函数可以有两个以上的版本。
MessageBoxA 是 MessageBox 函数的 ANSI 入口点;而 MessageBoxW 是 Unicode 版本。可以通过运行各种命令行工具,为特定 DLL(例如 user32.dll)列出函数名。例如,可以使用 dumpbin /exports user32.dll
或 link /dump /exports user32.dll
来获取函数名。
您可以在代码中将非托管函数重命名为任何所需的名称,但是要将该新名称映射到 DLL 中的初始入口点。
利用平台调用,可以通过调用 Win32 API 和其他 DLL 中的函数来控制操作系统中相当大的一部分。除了 Win32 API 之外,还有许多其他的 API 和 DLL 可通过平台调用来调用。
下表将说明 Win32 API 中几个常用的 DLL。
DLL
内容说明
GDI32.dll
|
用于设备输出的图形设备接口 (GDI) 函数,例如用于绘图和字体管理的函数。
|
Kernel32.dll
|
用于内存管理和资源处理的低级别操作系统函数。
|
User32.dll
|
用于消息处理、计时器、菜单和通信的 Windows 管理函数。
|
下表列出了在 Win32 API(在 Wtypes.h 中列出)和 C 样式函数中使用的数据类型。许多非托管库包含将这些数据类型作为参数传递并返回值的函数。第三列列出了在托管代码中使用的相应的 .NET Framework 内置值类型或类。某些情况下,您可以用大小相同的类型替换此表中列出的类型。
Wtypes.h 中的非托管类型
非托管 C 语言类型
托管类名
说明
HANDLE
|
void*
|
<link tabindex="0" keywords="frlrfSystemIntPtrClassTopic">
|
在 32 位 Windows 操作系统上为 32 位,在 64 位 Windows 操作系统上为 64 位。
|
BYTE
|
unsigned char
|
<link tabindex="0" keywords="frlrfSystemByteClassTopic">
|
8 位
|
SHORT
|
short
|
<link tabindex="0" keywords="frlrfSystemInt16ClassTopic">
|
16 位
|
WORD
|
unsigned short
|
<link tabindex="0" keywords="frlrfSystemUInt16ClassTopic">
|
16 位
|
INT
|
int
|
<link tabindex="0" keywords="frlrfSystemInt32ClassTopic">
|
32 位
|
UINT
|
unsigned int
|
<link tabindex="0" keywords="frlrfSystemUInt32ClassTopic">
|
32 位
|
LONG
|
long
|
<link tabindex="0" keywords="frlrfSystemInt32ClassTopic">
|
32 位
|
BOOL
|
long
|
<link tabindex="0" keywords="frlrfSystemSByteClassTopic">
|
32 位
|
DWORD
|
unsigned long
|
<link tabindex="0" keywords="frlrfSystemUInt32ClassTopic">
|
32 位
|
ULONG
|
unsigned long
|
<link tabindex="0" keywords="frlrfSystemUInt32ClassTopic">
|
32 位
|
CHAR
|
char
|
<link tabindex="0" keywords="frlrfSystemCharClassTopic">
|
用 ANSI 修饰。
|
LPSTR
|
char*
|
<link tabindex="0" keywords="frlrfSystemStringClassTopic"> 或 <link tabindex="0" keywords="frlrfSystemTextStringBuilderClassTopic">
|
用 ANSI 修饰。
|
LPCSTR
|
Const char*
|
<link tabindex="0" keywords="frlrfSystemStringClassTopic"> 或 <link tabindex="0" keywords="frlrfSystemTextStringBuilderClassTopic">
|
用 ANSI 修饰。
|
LPWSTR
|
wchar_t*
|
<link tabindex="0" keywords="frlrfSystemStringClassTopic"> 或 <link tabindex="0" keywords="frlrfSystemTextStringBuilderClassTopic">
|
用 Unicode 修饰。
|
LPCWSTR
|
Const wchar_t*
|
<link tabindex="0" keywords="frlrfSystemStringClassTopic"> 或 <link tabindex="0" keywords="frlrfSystemTextStringBuilderClassTopic">
|
用 Unicode 修饰。
|
FLOAT
|
Float
|
<link tabindex="0" keywords="frlrfSystemSingleClassTopic">
|
32 位
|
DOUBLE
|
Double
|
<link tabindex="0" keywords="frlrfSystemDoubleClassTopic">
|
64 位
|
分享到:
相关推荐
本主题将深入探讨PInvoke、C++ Interop和COM Interop这三种主要的.NET互操作方式。 1. **PInvoke(Platform Invoke)** PInvoke是.NET Framework提供的一个特性,用于调用非托管DLL中的函数。它通过在托管代码中...
《精通.NET互操作:pinvoke, c++ interop和COM interop》这本书深入探讨了.NET框架下不同语言和组件之间的交互技术。源代码包含了书中提到的示例,旨在帮助读者更好地理解和应用这些技术。以下是对这些关键技术的...
标题 "PInvoke Interop Assistant.rar" 暗示了这是一个关于C#与C++之间互操作(Interop)的工具包,特别关注P/Invoke技术。P/Invoke是.NET框架提供的一种机制,允许托管代码(C#)调用非托管代码(通常为C或C++编写...
Microsoft 推出的 P/Invoke Interop Assistant#C/C++ API 转 C# 工具 找资源不易,限定5个积分
PInvoke Interop Assistant是一款强大的工具,它为程序员提供了一个便捷的方式,将C/C++的原生代码转换为C#或VB.NET的平台调用(P/Invoke)代码。在.NET框架中,P/Invoke是允许托管代码(如C#或VB.NET)与非托管代码...
副标题: P/Invoke,C++ Interop和COM Interop 作者: 黄际洲 / 崔晓源 出版社: 人民邮电出版社 出版年: 2009-5 页数: 419 定价: 68.00元 装帧: 平装 ISBN: 9787115204349 内容简介 · · · · · · ...
它支持托管代码和非托管代码之间的方法签名的转换,而且直接生成相关的C#或者是VB的方法调用代码。这个签名的转换,不只是适用于Windows的方法签名,只要给定一个C头文件,就可以转换成为相关的C#的import方法签名
总之,"Interop Without PInvoke"技术通过C++/CLI在C#和C/C++静态库之间建立了一座桥梁,简化了类型转换,提高了性能,同时也避免了P/Invoke的一些缺点。在处理复杂的本地库集成时,这是一种值得考虑的高级互操作...
"Interop Without PInvoke - Consuming Native Libraries in C#.-DynamicLib"探讨了一种替代方法,即使用C#的动态编程功能来消费本地库,以实现更简洁且灵活的交互。 C#中的`System.Runtime.InteropServices....
然而,通过PInvoke(Platform Invoke)技术,我们可以调用Windows API函数来实现这些功能。本教程将深入探讨如何利用C#的PInvoke特性来显示系统自带动画资源。 首先,理解PInvoke的概念至关重要。PInvoke是.NET ...
4. **Com互操作**:除了PInvoke,.NET还提供了COM互操作(Interop)机制,使得C#可以调用COM组件。当处理COM对象时,C#会自动处理接口和方法的转换。 5. **安全性和异常处理**:PInvoke调用可能引发异常,如`...
这些技术主要包括PInvoke、C++ Interop以及COM互操作,它们是.NET Framework与非托管代码交互的关键手段。 1. **PInvoke(Platform Invoke)** PInvoke是.NET Framework提供的一种机制,允许.NET代码调用Windows ...
【】39726e13ca4b5de8ba86bb891513915b【】公共语言运行库(CLR)开发系列课程(1):Pinvoke简介【】公共语言运行库(CLR)开发系列课程(2):Pinvoke进阶【】公共语言运行库(CLR)开发系列课程(3):COMInterop基础【】公共...
压缩包中的"pinvoke-interop-assistant-master"可能是一个项目源码或工具,提供了自动转换C++/C数据类型的辅助功能。这样的工具通常会分析C++类型,并生成相应的C#或VB.NET代码,从而简化了P/Invoke过程,提高了开发...
Stugo.Interop Windows 和 Linux 上动态 P/Invoke 的帮助程序库。 为我的公司。 该库允许您在运行时为当前平台加载正确的非托管模块,并P / Invoke该库中的方法。 执照 版权所有(c)2012-2015 Stugo Ltd 特此...
10. **托管代码与非托管代码交互**:讲解如何通过PInvoke和COM Interop在托管代码和非托管代码之间建立桥梁。 11. **元数据和反射**:学习如何使用.NET元数据来获取类型信息,并利用反射动态创建对象和调用方法。 ...
可以将其视为 ,但是经过证明可以编译和正常工作,并且经常带有单元测试形式的示例用法。 一个独特的C#项目包装了每个本机库。 C#项目可能具有多个目标,以支持.NET Framework,.NET Core和.NET Standard的许多...
该项目包含各种.NET程序集,这些程序集包含Windows库中的P / Invoke函数,接口,枚举和结构。 每个程序集都与一个或几个紧密相关的库关联。 例如,Shlwapi.dll具有从shlwapi.lib导出的所有功能。 Kernel32.dll具有...
这可能涉及到计算机视觉和图像处理技术,如OpenCV库,它可以被C#通过PInvoke或.NET Interop服务调用来处理图像数据。 没有出现问题的描述,意味着程序的兼容性和稳定性都达到了预期,这在软件开发中是非常重要的。...
- .NET Interop:理解PInvoke和COM Interop的工作原理以及如何使用。 - .NET Framework:了解.NET Framework的类库和运行时环境,包括如何使用Assembly和Type对象来加载和交互非托管代码。 - Visual Studio IDE:...