当前位置: 首页 > news >正文

无锡网站建设方案服务小程序制作合同模板

无锡网站建设方案服务,小程序制作合同模板,seo代理,自己做免费的网站欢迎来到C#与C交互开发系列的第三篇。在这篇博客中#xff0c;我们将深入探讨P/Invoke#xff08;Platform Invocation Services#xff09;的基础知识。P/Invoke是C#调用非托管代码的一种机制#xff0c;能够让C#直接调用C编写的动态链接库#xff08;DLL#xff09;中的… 欢迎来到C#与C交互开发系列的第三篇。在这篇博客中我们将深入探讨P/InvokePlatform Invocation Services的基础知识。P/Invoke是C#调用非托管代码的一种机制能够让C#直接调用C编写的动态链接库DLL中的函数。在这篇文章中我们将介绍P/Invoke的基本概念、使用方法以及一些实际代码示例。 3.1 什么是P/Invoke P/InvokePlatform Invocation Services是一种在托管代码中调用非托管代码的服务。通过P/InvokeC#可以直接调用C编写的DLL中的函数从而实现跨语言的互操作性。P/Invoke主要用于调用Windows API函数和其他非托管代码库。 P/Invoke 的核心在于能够让托管代码和非托管代码协同工作使得开发者可以利用现有的非托管代码库而不必重写这些功能。P/Invoke 通过引入元数据和属性定义托管代码如何与非托管代码进行交互从而简化了开发过程。 3.2 P/Invoke 的基本使用方法 3.2.1 关键步骤 P/Invoke的使用涉及到几个关键步骤 声明外部函数在C#代码中使用[DllImport]属性声明要调用的C函数。这个声明包含DLL的名称和函数的调用约定。编译C代码将C代码编译为DLL以供C#程序调用。调用函数在C#代码中调用已声明的外部函数。 为了理解P/Invoke的基本使用方法我们来看一个简单的示例展示如何在C#中调用C函数。 Step 1: 编写C代码 首先我们创建一个简单的C库包含一个求和函数。 // MyCppLibrary.cpp extern C {__declspec(dllexport) int Add(int a, int b) {return a b;} }Step 2: 编译C代码 将上述C代码编译成动态链接库DLL。在Visual Studio中创建一个新的C项目并将其配置为DLL项目。编译后会生成MyCppLibrary.dll文件。 Step 3: 在C#中调用C函数 接下来我们在C#项目中调用这个C函数。创建一个新的C#控制台应用程序并添加如下代码 using System; using System.Runtime.InteropServices;class Program {// 声明C函数[DllImport(MyCppLibrary.dll, CallingConvention CallingConvention.Cdecl)]public static extern int Add(int a, int b);static void Main(){int result Add(3, 4);Console.WriteLine($3 4 {result});} }在这个示例中我们使用了DllImport属性来声明C函数并指定了DLL的名称和调用约定。然后在Main方法中调用了这个函数并输出结果。 3.2.2 DllImport的基本语法 using System.Runtime.InteropServices; class Program {[DllImport(user32.dll)]public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);static void Main(){MessageBox(IntPtr.Zero, Hello, World!, Hello Dialog, 0);} }在上面的示例中我们通过DllImport特性引入了user32.dll中的MessageBox函数并在Main方法中调用它。 3.2.3 DllImport的属性配置 DllImport 特性在 C# 中用于调用非托管代码时提供了多种属性配置选项用来精确控制调用的行为和参数。以下是DllImport特性常用的属性配置 EntryPoint 用法[DllImport(“library.dll”, EntryPoint “FunctionName”)]功能指定非托管函数在 DLL 中的名称如果与 C# 中的函数名不同可以使用该属性进行指定。 CallingConvention 用法[DllImport(“library.dll”, CallingConvention CallingConvention.Cdecl)]功能指定调用约定确保调用方和被调用方使用相同的调用约定如Cdecl、StdCall等。 CharSet 用法[DllImport(“library.dll”, CharSet CharSet.Unicode)]功能指定字符集确保正确地处理非托管函数中的字符串参数有CharSet.Ansi和CharSet.Unicode两个选项。 ExactSpelling 用法[DllImport(“library.dll”, ExactSpelling true)]功能指定是否精确匹配 DLL 中的函数名称。默认情况下C# 会尝试匹配与方法名相同的入口点。 SetLastError 用法[DllImport(“library.dll”, SetLastError true)]功能指示是否在调用失败时设置 Marshal.GetLastWin32Error用来获取操作系统返回的错误码。 PreserveSig 用法[DllImport(“library.dll”, PreserveSig false)]功能指定是否保留原始的签名。如果设置为 falseCOM 互操作将把 HRESULT 返回值转换为异常。 BestFitMapping 用法[DllImport(“library.dll”, BestFitMapping false)]功能指定是否启用最佳匹配映射规则来处理非托管函数中的 ANSI 字符串和 Unicode 字符串之间的转换。 ThrowOnUnmappableChar 用法[DllImport(“library.dll”, ThrowOnUnmappableChar true)]功能指定是否在遇到无法映射的字符时抛出异常。 除了以上列举的常见属性外DllImport 还支持其他一些配置选项例如处理非托管类型、结构体布局等这些选项可以根据具体需要来配置以确保与非托管代码的良好互操作性和性能。 [DllImport(user32.dll, EntryPoint MessageBox, CallingConvention CallingConvention.StdCall, CharSet CharSet.Auto, SetLastError true)] public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);3.3 数据类型的映射 在使用P/Invoke时正确地映射C#和C的数据类型非常重要。以下是一些常见的数据类型映射 C 类型C# 类型intintfloatfloatdoubledoublecharsbytechar*stringvoid*IntPtrboolbool (C11) 例如C中的int类型在C#中映射为int而C中的char*类型在C#中映射为string。 3.4 常见错误及调试技巧 在使用P/Invoke时常见错误包括DLL文件找不到、函数声明不正确、数据类型不匹配等。以下是一些调试技巧 检查DLL路径确保DLL文件放置在可访问的路径中通常是C#项目的输出目录或系统路径中。验证函数声明确保C#中声明的函数签名与C中定义的函数匹配包括参数类型和调用约定。使用调试工具使用Visual Studio等调试工具设置断点并检查变量值和内存地址帮助定位问题。 3.5 代码示例 为了进一步展示P/Invoke的使用方法我们来看一个更复杂的示例包含字符串和结构体的传递。 Step 1: 编写C代码 // MyCppLibrary.cpp #include cstringextern C {__declspec(dllexport) const char* ConcatStrings(const char* str1, const char* str2) {static char result[256];strcpy(result, str1);strcat(result, str2);return result;}struct Point {int x;int y;};__declspec(dllexport) int AddPoints(Point p1, Point p2) {return (p1.x p2.x) (p1.y p2.y);} }Step 2: 编译C代码 将上述C代码编译成动态链接库DLL。 Step 3: 在C#中调用C函数 using System; using System.Runtime.InteropServices;class Program {// 声明C函数[DllImport(MyCppLibrary.dll, CallingConvention CallingConvention.Cdecl)]public static extern IntPtr ConcatStrings(string str1, string str2);[StructLayout(LayoutKind.Sequential)]public struct Point{public int x;public int y;}[DllImport(MyCppLibrary.dll, CallingConvention CallingConvention.Cdecl)]public static extern int AddPoints(Point p1, Point p2);static void Main(){// 调用ConcatStrings函数IntPtr resultPtr ConcatStrings(Hello, , World!);string result Marshal.PtrToStringAnsi(resultPtr);Console.WriteLine(result);// 调用AddPoints函数Point p1 new Point { x 1, y 2 };Point p2 new Point { x 3, y 4 };int sum AddPoints(p1, p2);Console.WriteLine($Sum of points: {sum});} }在这个示例中我们展示了如何传递字符串和结构体。ConcatStrings函数返回一个C风格字符串我们在C#中使用Marshal.PtrToStringAnsi将其转换为托管字符串。AddPoints函数接受两个结构体参数我们在C#中定义了相应的结构体并传递给函数。 3.6 总结 在这篇博客中我们介绍了P/Invoke的基本概念、使用方法以及常见的数据类型映射。通过实际代码示例我们展示了如何在C#中调用C函数并处理字符串和结构体的传递。在下一篇博客中我们将进一步探讨使用C/CLI进行互操作的方法和技巧。
http://www.pierceye.com/news/974353/

相关文章:

  • 建筑网站视频大全做外汇网站卖判刑多少年
  • 手机网站菜单网页怎么做东莞网站优化方案
  • 公众号免费素材网站wordpress无法开始安装
  • 建设银行互联网网站首页网站备案 视频
  • 免费优化网站建设做app和网站哪个比较好用
  • 韩国最牛的设计网站大全网站设计的尺寸
  • 一家专门做特卖的网站类似非小号的网站怎么做
  • 怎么建一个网站出口外贸交易平台
  • iapp用网站做软件代码徐州网络推广公司排名
  • 设计之路 网站wordpress自定义字段火车头
  • 用什么服务器做盗版小说网站吗邓州十九张麻将微信群app开发公司
  • 高端网站设计找哪个公司WordPress 移动文件夹
  • 做网站的资料新媒体网站建设十大的经典成功案例
  • 西安移动网站建设丹东做网站的
  • 石家庄网站建设优化建湖做网站哪家最好
  • 外贸电商做俄罗斯市场网站电子商务网站建设的步骤一般为(
  • 济南网站建设联 系小七太仓网页制作招聘
  • 大同网站建设公司建大网站
  • 网站开发 图片存放流量大的推广平台有哪些
  • 创意网站推荐深圳网站建设公司哪里有
  • 网站在百度无法验证码怎么办啊广州免费核酸检测地点查询
  • 山东网站建设公司哪家好怎么用html做个人的网页
  • 嘉兴网站排名优化价格石家庄站全景图
  • 辽宁鲲鹏建设集团网站网站建设分几种类型
  • 响应式网站开发有哪些框架建立网站的关键是定位
  • 郑州 网站建设的公司建设网站要钱么
  • 网站推广方案深圳企业网站建设服务
  • 企业网站首页设计解析网站开发服务费凭证做什么科目
  • 黄山网站网站建设网站自建设需要买什么时候开始
  • 国外seo网站海尔网站建设水平