首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anycpu nuget包需要32位或64位包

Anycpu nuget包需要32位或64位包
EN

Stack Overflow用户
提问于 2015-02-17 19:53:13
回答 2查看 3.9K关注 0票数 6

我有一个(anycpu) nuget包"my_shared_library“,它必须引用一个nuget包"non_anycpu_dependency”,它要么是32位,要么是64位(这是数据库访问dll)。

我希望32位和64位应用程序都能够使用"my_shared_library“。

如何让32位和64位程序同时使用"my_shared_library"?

我想我要么必须有两个版本的"my_shared_library“,或者在运行时有一些方法来选择正确的32位/64位的基于运行时位的"non_anycpi_dependency”的nuget包。

有人解决这个问题了吗?由于大多数数据库dll都不是anycpu,所以我认为这是一个常见的问题。

提前谢谢你,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-27 17:58:07

有人解决这个问题了吗?

是的,微软有。他们需要解决与完全相同的问题。它有一个托管程序集( System.Data.SqlServerCe.dll ),充当托管程序的适配器,以及一组实现实际数据库引擎的本地DLL。它们绑定到本机DLL入口点的方式不是我曾经推荐的方法,我将根据您使用pinvoke的假设来工作。我建议您使用this technique来确保客户端程序能够运行AnyCPU。

重复该帖子的本质,您希望在初始化方法或静态构造函数中执行此代码:

代码语言:javascript
复制
public static void SetupDatabaseBinaries() {
    var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
    path = Path.Combine(path, IntPtr.Size == 8 ? "amd64" : "x86");
    bool ok = SetDllDirectory(path);
    if (!ok) throw new System.ComponentModel.Win32Exception();
}

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetDllDirectory(string path);

唯一重要的步骤是让用户的项目将本机DLL复制到项目的amd64 64/x86目录中。这需要一个后构建步骤,就像Compact所做的那样。你会想下载Nuget软件包,看看他们是如何做到的,这并不简单。运行VS提升,创建虚拟控制台模式项目,并检索包。安装后,使用Project + Properties、Build events选项卡并注意它是如何添加此post生成事件的:

代码语言:javascript
复制
if not exist "$(TargetDir)x86" md "$(TargetDir)x86"
xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86"
if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64"
xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64"

除了创建x86和amd64子目录并将DLL复制到它们中之外,它没有做任何其他事情。棘手的部分是让您的Nuget包添加此构建事件。看看这个包文件夹,看看它的神奇之处。您可能希望尽可能地遵循这个示例,以避免错误。查看packages\Microsoft.SqlServer.Compact.4.0.8876.1\tools目录,它包含两个执行此操作的PowerShell脚本文件。Install.ps1在安装结束时运行。创建构建后步骤的函数在VS.psm1中,中。祝你好运。

票数 12
EN

Stack Overflow用户

发布于 2015-02-17 20:00:31

一旦引用了针对特定bitness的包,就会陷入困境。您可能能够获得足够多的间接编译,但是您将在运行时得到一个BadImageFormatException

您可以做的是创建一个AnyCPU程序集,该程序集包含与您所拥有的特定程序中的具体实现相匹配的接口。然后,所有的AnyCPU程序集都应该只引用接口。

在要驱动应用程序的EXE中,必须选择64位还是32位。在这个EXE程序集中,您可以酌情引用原始的32或64位程序集(或nuget包)。

要使用此解决方案,像Autofac、StructureMap或Unity这样的依赖注入框架将有助于减少管理为类提供具体实现的痛苦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28569979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档