我有一个(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,所以我认为这是一个常见的问题。
提前谢谢你,
发布于 2015-02-27 17:58:07
有人解决这个问题了吗?
是的,微软有。他们需要解决与完全相同的问题。它有一个托管程序集( System.Data.SqlServerCe.dll ),充当托管程序的适配器,以及一组实现实际数据库引擎的本地DLL。它们绑定到本机DLL入口点的方式不是我曾经推荐的方法,我将根据您使用pinvoke的假设来工作。我建议您使用this technique来确保客户端程序能够运行AnyCPU。
重复该帖子的本质,您希望在初始化方法或静态构造函数中执行此代码:
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生成事件的:
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中,中。祝你好运。
发布于 2015-02-17 20:00:31
一旦引用了针对特定bitness的包,就会陷入困境。您可能能够获得足够多的间接编译,但是您将在运行时得到一个BadImageFormatException。
您可以做的是创建一个AnyCPU程序集,该程序集包含与您所拥有的特定程序中的具体实现相匹配的接口。然后,所有的AnyCPU程序集都应该只引用接口。
在要驱动应用程序的EXE中,必须选择64位还是32位。在这个EXE程序集中,您可以酌情引用原始的32或64位程序集(或nuget包)。
要使用此解决方案,像Autofac、StructureMap或Unity这样的依赖注入框架将有助于减少管理为类提供具体实现的痛苦。
https://stackoverflow.com/questions/28569979
复制相似问题