.NET Framework 类如何引用本机 Windows DLL,而不会变得特定于位数

本文关键字:于位数 DLL Windows 何引用 Framework 本机 引用 NET | 更新日期: 2023-09-27 18:31:46

我读过许多问题和答案,表明如果我想将我的 C# 项目链接到本机库,我不能使用AnyCPU平台目标,但必须进行单独的 32 位和 64 位构建,每个构建都针对相应位数的本机 DLL 链接。

这让我想知道.NET Framework程序集本身是如何构建的,或者至少看起来是为AnyCPU而构建的。 也就是说,在添加对我的 GUI 应用程序的引用时,为什么我不必选择 32 位或 64 位版本的 System.Windows.Forms? 我认为这可能只是一些Visual Studio的魔力,可以解析到适当的GAC子目录(GAC_32或GAC_64),但我在GAC中搜索了System.Windows.Forms.dll并在以下位置找到了它:

C:''Windows''Microsoft.NET''assembly''GAC_MSIL''System.Windows.Forms''v4.0_4.0.0.0__b77a5c561934e089''System.Windows.Forms.dll

请注意"GAC_MSIL"。 那么,这个 DLL 如何设法包装本机 32 位 API,同时在 64 位应用程序中保持可链接性呢? 为什么我不能使用类似的策略来创建一个 C# DLL,该 DLL 链接到本机 32 位库,但在 64 位模式下仍可运行?

.NET Framework 类如何引用本机 Windows DLL,而不会变得特定于位数

选项 1:在 GAC 中,您可以注册 2 个版本,一个是具有完全相同名称的 32 位版本,一个是 64 位版本。Oracle DB Driver for .NET 使用此策略。

选项 2:对于您的程序集,这将是 AnyCPU 部署两个版本的本机 DLL,并在运行时选择正确的 DLL(SQLite 就是这样工作的)。事实证明,.NET Framework足够智能,可以通过P/Invoke加载正确版本的本机DLL(在C# DllImport中使用32位或64位dll)

我遇到了同样的问题,最终使用了Fody Costura。

DLL 文件将作为嵌入式资源提供,库负责位。

你可以在这里找到SQLite的例子

我遇到的问题是您的应用程序需要有权访问 Windows Temp 文件夹才能从资源创建程序集。如果你不需要它,你可以使用配置设置创建临时程序集来禁用它