我已经在这个问题上绕了一天多了。我有一个使用sqlite-net-pcl
的WPF项目。
我已经准备好将此项目打包到MSI中进行分发(x64(。第一个问题是我需要直接为依赖项(SQLitePCLRaw.bundle_green
(添加nuget。我以前在nuget包中包含需要进入最终版本的内容文件时遇到过这种情况。一帆风顺
在这一点上,bin/x64/release
是好的并且运行良好。然而,当我构建一个安装程序并运行已安装的版本时,我会得到以下异常:
System.BadImageFormatException:无法加载文件或程序集"System.Runtime.CompilerServices.Unsafe,Version=4.0.4.1,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"或其依赖项之一。不应加载引用程序集以执行。它们只能在"仅反射"加载程序上下文中加载。(HRESULT出现异常:0x80131058(--->System.BadImageFormatException:无法加载引用程序集以执行。
在我的发布文件夹和应用程序安装文件夹之间进行文件比较时,我发现以下内容:
Binary Difference: System.Buffers.dll
Binary Difference: System.Numerics.Vectors.dll
Binary Difference: System.Runtime.CompilerServices.Unsafe.dll
Installer Only: netstandard.dll
Installer Only: System.Diagnostics.Tracing.dll
Installer Only: System.IO.Compression.dll
Installer Only: System.IO.Compression.FileSystem.dll
Installer Only: System.Net.Http.dll
在进一步检查并深入DLL后,我发现如果我用发布文件夹中的二进制文件覆盖System.Runtime.CompilerServices.Unsafe.dll
,一切都会正常工作。
更深入地研究并检查CompilerServices.Unsafe
的安装程序版本,我意识到安装程序正在获取DLL的dotnet核心版本。
我已经将其隔离到一个带有新安装程序项目的控制台应用程序中,并且只将content
和output
添加到安装程序中。
为什么安装程序坚持依赖项是dotnet核心版本?
我想找到一个真正的解决方案,但与此同时,我在这个线程中发现了一些确认和一个肮脏的解决方法:https://developercommunity.visualstudio.com/content/problem/810090/visual-studio-installer-projects-extensions-incorr.html
解决方案选项1:除了添加包含包引用的项目的"主要输出"外,还为该项目添加"本地复制的项"。这将导致程序集的lib版本覆盖ref版本,从而为您提供所需的行为。然而,您也会收到关于添加重复文件的警告,因为正如我所说,lib版本将覆盖ref版本。这也可能带来额外的文件,如xml文档文件,这些文件在运行时应该没有影响,但可能会增加安装程序的大小。这些也可以单独从安装项目中排除。