问题标签 [assemblybinding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何隔离第 3 方 .NET 库的传递程序集依赖项?
环境
对于我们的应用程序和实用程序,我们尝试将我们对所有工具的所有(开源)库依赖项标准化为相同版本;我们不断构建所有工具以确保一切正常。
问题
碰巧我们必须使用封闭源代码的第 3 方 .NET 库程序集。其中一些程序集对开源组件有自己的传递依赖。如果我们碰巧使用相同的开源组件,很可能我们使用的版本与封闭源依赖项不同,因此我们会发生冲突。
问题示例
只是一个例子!
我们的程序集our_abc.dll
使用了一个封闭源代码的第三方程序集their_xyz.dll
,它引用Newtonsoft.Json.dll
了与我们不同的版本。
在这种情况下,在 our_abc 和 their_xyz 之间的“API 表面”上不使用 json 类型,这种情况似乎很常见。
解决方案?
所以,我们想要实现的是我们的代码只使用它需要的版本的开源程序集,而我们引用的封闭源第 3 方程序集应该只使用他们的版本。
理想情况下,这应该通过尽可能少的配置文件恶作剧来实现。对于相当多的部署,使用 GAC 似乎相当笨拙。
我已经阅读过assemblyBinding
,但我不确定它是否适合这项工作,因为似乎我们需要手动维护所有应用程序的 app.config 文件中的所有传递依赖项才能正常工作:
链接中的解决方案使其看起来如下所示。鉴于这种依赖情况:
...我知道我可以准备一个app.config
文件,tool.exe
指定在哪里查找 2 ( n
) 个不同版本的传递依赖项。
但是,从可维护性 POV 来看,如果我可以将信息与their_xyz
“包”捆绑在一起会更好,这样tool.exe
就不必知道它的传递依赖关系。这有可能吗?
c# - 无法加载文件或程序集'System.Threading.Tasks.Extensions,版本 = 4.2.0.0
我最近安装了 CsvHelper ( https://joshclose.github.io/CsvHelper/ ),当我尝试使用该库时出现以下错误:
无法加载文件或程序集“System.Threading.Tasks.Extensions,Version=4.2.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)
在我的 app.config 我有绑定重定向:
同样在我的项目中,我参考了
\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll
它的版本是 4.2.0.1 我不知道为什么它仍然试图加载库的 4.2.0.0。
我的项目正在运行.net 4.7.2
.net - 链接配置未生效
我有一个 .dll.config 我想在其中放置一个linkedConfiguration
:
other.config 看起来像:
当我运行引用 dll 的应用程序时,不支持程序集绑定重定向。来自 fuslogvw:
如果我将上面的运行时节点复制到 .dll.config 中,则重定向是有效的:
关于我做错了什么的任何想法?linkedConfiguration 是否不像我认为的那样工作或有任何常见的陷阱?我怎样才能获得有关问题所在的更多信息?
nuget - 编译时更改了程序集绑定重定向
我有一项服务,它通过 NuGet 包引用同一解决方案中的少数其他库和一些库。
我有一个库Microsoft.ApplicationInsights.Log4NetAppender
和另一个Microsoft.ApplicationInsights.ServiceFabricNative
似乎不同意Microsoft.ApplicationInsights
.
所以在我的 app.config 我有以下内容:
但是当我编译后查看 service.exe.config 文件包含的内容时,我发现:
这很奇怪,因为解决方案中没有其他库引用该版本。
这会导致引发异常并表示无法加载此类库的版本 2.12.0.21496 的问题。
我错过了什么?尽管我做了所有尝试,但还是任意数字?
注意:这些是在服务结构解决方案中引用其他库的服务
c# - RabbitMQ 连接工厂在我的应用程序箱中找不到 System.Threading.Tasks.Extensions
我有以下代码
上面的最后一行抱怨以下错误
FileLoadException:无法加载文件或程序集“System.Threading.Tasks.Extensions,Version=4.2.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)
我检查了 Fusion Log,它显示以下内容
我打开了bin
在 IL Disassembler 中找到的 DLL 并检查了清单,发现以下内容
System.Threading.Tasks.Extensions.DLL 是 4.2.0.1 以上依赖于已经在 bin 中的 System.Runtime.CompilerServices.Unsafe 4.0.4.1。
所以 4.2.0.0 与 4.2.0.1 不匹配,所以我决定添加以下绑定重定向
我仍然收到相同的运行时错误抱怨,它没有找到扩展 4.2.0.0。我错过了什么?
c# - FileLoadException 与 Newtonsoft.Json 试图在 4.5.1 WebForms 中使用 MapHttpRoute
我在我的 4.5.1 WebForms 应用程序中添加了一个 2.1 Web API 控制器类。之后,我的 packages.config 看起来像:
我的 Web.config 如下所示:
我按照本教程中的说明进行操作:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/using-web-api-with -aspnet-web-forms
我将以下内容添加到Application_Start
:
但是,当我运行并尝试运行此行时,我收到以下错误:
我尝试删除 web.config 中的绑定重定向信息并收到相同的错误。
更新
最初,我的库 dll 引用了 Newtonsoft 的 11.0.2。我将它们更新到 12.0.2 以试图使没有的工作正常进行。所以我把我所有的项目(包括网站)都放回了 11.0.2 仍然有同样的问题。但我想指出,我在一个 Webforms 项目中进行了测试,但没有引用我的库 dll,该库 dll 已经对 Newtonsoft 有 12.0.3 引用并且它有效。因此,我有一些引用 Newtonsoft 的依赖 dll,但我不知道它可能是什么。
所有参考 11.0.2 和网站运行时(如果我注释掉对 的调用MapHttpRoute
),AppDomain.CurrentDomain.GetAssemblies()
正确显示:
{Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed}
融合日志
server - 从 Task Runner App 执行应用程序时“无法加载文件或程序集”
我们有一个使用 DLL 的 .NET 应用程序。DLL 在 GAC 中注册。我们有一个任务运行器应用程序(来自 BroadCom 的 ESP)来执行我们的应用程序。
- 目标服务器上的 ESP 服务设置为使用“允许服务与桌面交互”的本地系统帐户
- AD 帐户通过 ESP 作业配置传递给服务以执行应用程序
- 该AD账号是管理员,批量登录,服务登录
当我通过我自己的个人 AD 帐户运行作业时,RDP'd 进入服务器,它是成功的。当我通过 AD 服务帐户运行作业时,RDP'd 进入服务器,它是成功的。当我使用相同的 AD 帐户通过 ESP 运行作业时,我得到“无法加载文件或程序集”。
我们联系了供应商并发送了日志——ESP 正在成功执行应用程序,但是当 .NET 应用程序通过 ESP 运行时,它找不到 DLL。
这不是烫发问题,因为我可以使用该帐户登录并手动执行,没问题。
我怀疑这是一个环境/服务器配置问题,但我们已经为此努力了一个月,但我没有线索。任何帮助将非常感激。