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

时间:2016-01-25 19:21:06

标签: c# 32bit-64bit gac

我已经阅读了很多问题和答案,表明如果我想将C#项目与本机库相关联,我就不能使用AnyCPU平台目标,但必须制作单独的32位和64位构建,每个链接到适当位数的本机DLL。

这让我想知道.NET Framework程序集本身是如何构建的,或者至少看起来是为System.Windows.Forms构建的。也就是说,在添加对我的GUI应用程序的引用时,为什么我不必选择$month = 3; $newdate = date('Y-m-d', strtotime("+".$month." months", str_replace('/', '-', $this->input->post('date')))); 的32位或64位版本?我认为这可能只是一些Visual Studio魔法会解析到相应的GAC子目录(GAC_32或GAC_64),但是我在GAC中搜索了System.Windows.Forms.dll并找到了它:

C:\的Windows \ Microsoft.NET \组件\ GAC_MSIL \ System.Windows.Forms的\ v4.0_4.0.0.0__b77a5c561934e089 \ System.Windows.Forms.dll中

请注意“GAC_MSIL”。那么这个DLL如何设法包装本机32位API,但仍然可以在64位应用程序中链接?为什么我不能使用类似的策略来制作一个链接本机32位库但仍然可以在64位模式下运行的C#DLL?

2 个答案:

答案 0 :(得分:0)

选项1:在GAC中,您可以注册两个版本的程序集,一个32位,一个64位,名称完全相同。适用于.NET的Oracle DB Driver使用此策略。

选项2:使用您的程序集将AnyCPU部署两个版本的本机DLL并在运行时选择适当的DLL(SQLite就是这样)。事实证明,.NET Framework足够智能,可以通过P / Invoke(Using a 32bit or 64bit dll in C# DllImport

加载正确版本的本机DLL

答案 1 :(得分:0)

我遇到了同样的问题,最终使用了documentation

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

您可以找到SQLite Fody Costura

的示例

我遇到的问题是您的应用程序需要访问Windows Temp文件夹才能从ressource创建程序集。如果不需要它,可以使用配置设置here

禁用它