0

我已经在这个上面转了一天多。我有一个使用sqlite-net-pcl.

我准备将这个项目打包成一个 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”或其依赖项之一。不应加载引用程序集以供执行。它们只能在 Reflection-only loader 上下文中加载。(来自 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 核心版本。

我已将其隔离为带有全新安装程序项目的单个控制台应用程序,并且仅将contentand添加output到安装程序中。

为什么安装程序坚持依赖是 dotnet 核心版本?

4

1 回答 1

1

我想找到一个真正的解决方案,但同时我在这个线程中找到了一些确认和一个肮脏的解决方法:https ://developercommunity.visualstudio.com/content/problem/810090/visual-studio-installer-projects-扩展-incorr.html

解决方法选项 1:除了添加包含包引用的项目的“主要输出”之外,还为该项目添加“本地复制的项目”。这将导致程序集的 lib 版本覆盖 ref 版本,从而为您提供所需的行为。但是,您还会收到有关添加重复文件的警告,因为正如我所说,lib 版本将覆盖 ref 版本。这也可能会引入其他文件,例如 xml doc 文件,这些文件在运行时应该没有影响,但可能会增加安装程序的大小。这些也可以从设置项目中单独排除。

于 2020-08-27T06:41:20.857 回答