爬坑经历C#调用C++的DLL遇到的问题(LoadLibrary)
事情经过:.net core和.net framework两个项目一直用的LoadLibraryA这个方法来加载Dll的,然后莫名其妙的有用户反馈功能异常。
之前的写法:
使用LoadLibraryA
改后的写法:
使用LoadLibrary
个人总结:本人之前对宽字符和多字符的概念,以及LoadLibrary,LoadLibraryA,LoadLibraryW 不是很清楚,导致调用的代码写的有误。
知识总结:
-
LoadLibrary 和 LoadLibraryA 实际上是同一个函数,只是在 ANSI(LoadLibraryA)和 Unicode(LoadLibraryW)版本之间的一个别名。Windows 根据你的宏定义自动选择使用哪一个。
-
默认情况下,Windows 的字符编码是 Unicode,因此 LoadLibrary 默认是调用 LoadLibraryW,即宽字符版本。
-
如果你的 DLL 路径名仅包含 ASCII 字符,你可以安全地使用 LoadLibraryA。否则,你应该使用 LoadLibrary,它将根据你的宏定义转到正确的函数。
如果你确实需要调用这些 API,可以在 C# 中这样使用:
using System.Runtime.InteropServices;
public class Win32Native {
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr LoadLibrary(string libname);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);
}
在这个例子中,CharSet = CharSet.Auto
指示运行时自动选择使用 LoadLibraryA 或 LoadLibraryW。
4.在.NET Core和.NET Framework中,字符串默认使用Unicode编码。字符串类型(string)的每个字符默认使用16位(2字节)的Unicode字符编码。所以我们可以说默认情况下是宽字符编码方式。
这个行为与创建的项目类型(例如WPF,ASP.NET,控制台应用程序等)无关,这是C#语言和.NET运行时的特性。它并不使用C 中的宽字符和多字节字符的概念。
5…在.NET Core或.NET Framework中,如果你需要加载并使用C 的DLL文件,你会需要使用到P/Invoke(Platform Invocation Services)来调用非托管代码。对于LoadLibrary函数,你可以按照以下方式来使用:
using System.Runtime.InteropServices;
public class Win32Native {
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr LoadLibrary(string libname);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);
}
这里,DllImport
是.NET用来声明将要调用的非托管DLL的方法。CharSet = CharSet.Unicode
告诉运行时你期望的是Unicode版本的函数(即LoadLibraryW),这是因为.NET默认使用Unicode字符编码。
因此,在.NET环境中,你应该直接使用LoadLibrary,并且设定CharSet = CharSet.Unicode
,而不是使用LoadLibraryA或LoadLibraryW。
6.宽字符编码和多字节编码是字符编码的两种类型,主要在处理字符时使用。这两种编码方法主要用于处理多语言环境,因为不同的语言可能需要不同数量的字节来表示一个字符。
宽字符编码:宽字符编码是一种固定长度的字符编码方案。在这种方案中,每个字符都使用相同数量的字节表示。例如,UTF-16和UTF-32是宽字符编码,其中每个字符分别使用2字节和4字节。这种编码方案的优点是易于处理和解析,因为每个字符的长度都是固定的。但是,这也可能导致空间浪费,因为一些字符可能并不需要那么多的字节就能表示。多字节编码:多字节编码是一种变长的字符编码方案。在这种方案中,字符可以由一个或多个字节表示。例如,UTF-8就是一种多字节编码,其中一个字符可以由1到4个字节表示。这种编码方案的优点是空间效率,因为它可以使用最小的必要字节数来表示一个字符。然而,处理和解析这种编码的字符可能会更复杂,因为每个字符的长度是变化的。在多语言编程环境中,UTF-8编码通常是首选的编码方案,因为它兼容ASCII,并且能够有效地处理各种语言的字符。
文章如有不对,欢迎大神指正!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfkakh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13