我有一个在Visual Studio中运行良好的C#应用程序,但我已经从。csproj,并将作为安装程序的一部分添加到GAC中。
然而,当我运行应用程序时,当它调用其中一个引用(System.Text.Json
)时,我得到一个Exception:
“System.IO.FileLoadException:未能加载文件或程序集“System”。Runtime.CompilerServices.不安全,版本=4。0.4.1,Culture=neutral,PublicKeyToken= b 03 f5 f7 f11 d50 a3 a '或其依赖项之一。找到的程序集清单定义与程序集引用不匹配。(HRESULT中的异常:0x80131040)”
中的引用中有System.Runtime.CompilerServices.Unsafe version 6.0.0
。csproj,它看起来像是我的安装程序成功安装的。
我启用了Assembly Bind Failure Logging,看起来System.Memory
引用的是 www.example.com of System.Runtime.CompilerServices.Unsafe
.
有什么建议或建议可以帮助我解决冲突吗?
更新:
这是一个小的应用程序,提供了移动天文望远镜电动调焦的能力。供应商提供的工具在某些方面有所欠缺,而SDK非常易于使用。我的应用程序只是几个使用SDK API的表单,并保存/加载命名位置。我其实是想加个app配置包含以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</configuration>`
但它仍然失败,有相同的例外。
config与可执行文件在同一目录中,并且具有相同的名称(与。配置扩展而不是。EXE)。
解决了:看起来我把事情搞得太难了。Soleil建议使用bin文件夹中的所有内容,这似乎是可行的。我现在只需要正确地更新我的安装程序。
2条答案
按热度按时间xdyibdwo1#
由于您的应用程序在Visual Studio中运行良好,我建议您将安装包基于目标目录,即。,通常是
bin\Release\net48
,如果你的目标是net48。您的nuget包将在此过程中被复制。您还可以发布应用程序或创建ClickOnce包。如果您需要从二进制文件创建安装程序包,您可能还需要考虑NSIS。
定制烹饪在这里没有帮助。一般来说,您希望保持 devops 流程(这里您正在进行 deployment 的开始)尽可能简单,并且尽可能可自动化(可脚本化),因此在更新项目时,您的devops流程需要尽可能少的维护(这可以降低成本)。
任何net48程序集都是任何Windows的一部分(我相信是7和之后),所以你应该有一个非常小的包,你不应该在你的安装程序中包含这些二进制文件。
idfiyjo82#
问题中没有足够的信息来确定,但听起来可能需要绑定重定向。
一个应用程序(严格地说,是一个appdomain)只能加载一个程序集的一个版本。如果应用程序包含对某个程序集的多个引用(可能是已安装的其他包的依赖项),并且这些引用指向该程序集的不同版本,则需要重定向其中至少一个引用,以便使用公共版本。
你没有说这是哪种C#应用程序,但你可以尝试将以下内容添加到
app.config
文件(或其他文件,取决于应用程序类型)的<assemblyBinding>
元素中:正如注解中提到的,您不需要手动向GAC添加任何内容。如果您的应用程序更复杂,或者可能涉及多个应用程序域,我建议您在采用这种方法(即使它有效)之前进一步阅读以了解原始错误的原因。