问题标签 [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.

0 投票
0 回答
101 浏览

visual-studio - 不同版本的程序集之间的冲突:适用于 Windows 但不适用于 Mac

我正在尝试构建一个 Xamarin Android 项目。该项目在 Windows 上使用 Visual Studio 构建得非常好,但我试图获得完全相同的代码库以使用Visual Studio for Mac 编译并不断收到以下错误。

Windows 上的 Visual Studio 必须自动执行绑定重定向。

我目前有通过 NuGet 安装的版本,这是我想要的版本3.2.0.0Compare-NET-Objects即使在搜索了整个代码库之后,它仍然需要版本3.8.0.0,但它在任何文件的任何地方都不存在。

这是packages.config 中的条目:

我还尝试为版本 0.0.0.0-4.52.0.0 添加程序集绑定重定向以在app.config中使用版本 3.02.0.0,但它也没有帮助。

我的其他包或项目有一段时间没有更新,但我注意到 targetFramework="monoandroid60" 曾经是 packages.config 中目标框架的值,并且将其更改回该值也无济于事。

0 投票
2 回答
5689 浏览

c# - 查找未使用/不必要的 assemblyBinding 重定向

似乎我们的web.config中有很多绑定重定向,我要么:

  1. 看起来没必要
  2. 用于我在我们的解决方案中没有看到任何地方引用的程序集

这只是绑定重定向的某些部分的示例:

我认为在某些时候 Visual Studio 决定自动添加很多。

有没有办法验证是否需要任何绑定重定向或自动验证/删除它们?

0 投票
1 回答
777 浏览

visual-studio - 来自类库的程序集绑定重定向

我有一个 GitHub 项目(Test Automation Essentials),它引用了一些 Visual Studio 特定的程序集(Microsoft.VisualStudio.TestTools.UITest.Extension它是 CodedUI 的一部分;但这对于这个问题并不重要)。该项目作为包含我的类库的 NuGet 包发布。

我希望我的项目支持不同版本的 Visual Studio,总而言之,这个程序集在 Visual Studio 的版本之间没有任何明显的差异,所以我预计不会出现任何兼容性问题(无论如何它应该是向后兼容的)。

但是,如果我在 Visual Studio 的一个版本(例如 2015)中编译我的项目,当我尝试从较新版本的 Visual Studio(例如 2017)中的项目中引用 NuGet 包时,当托管项目运行时,我会得到以下信息例外:

注意:我的库使用Specific Version=False.

我发现我可以通过将以下元素添加到应用程序来解决此问题app.config

注意:在这种特殊情况下,可执行文件通常QTAgent32_40.exe本身就是 Visual Studio 的一部分,因此我必须将元素添加到项目文件中,QTAgent32_40.exe.config而不是实际添加到项目app.config文件中。QTAgent32_40.exe.config已经有许多类似dependentAssembly的元素,但由于某种原因不是这个特定的组件。

问题:

我不希望我的客户自己添加此设置。如果我可以为我的类库设置这样的设置,我会很高兴,这样任何引用我的库的人都会自动获得这个 Assembly Redirect 设置。但是,我没有找到一种方法来做到这一点......

有谁知道我该怎么做?

0 投票
0 回答
291 浏览

azure - Azure 函数中的 Ninject 和程序集绑定

我有一个依赖于其他程序集的 Azure 函数,而其他程序集又依赖于 Ninject 进行依赖注入。在运行时,Ninject 似乎无法解析某些 custom 的依赖关系Ninject.Activation.Provider<T>,从而导致System.IO.FileNotFoundException.

堆栈跟踪的 Ninject 部分是:

在 Ninject.Activation.Provider`1.Create(IContext context) at Ninject.Activation.Context.ResolveInternal(Object scope) at Ninject.Activation.Context.Resolve() at Ninject.KernelBase.<>c__DisplayClass15.b__f(IBinding binding)在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 源) 在 Ninject.Planning.Targets.Target`1.GetValue(Type service,IContext parent)在 Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) 在 Ninject.Activation.Providers.StandardProvider.GetValue(IContext context,ITarget 目标) 在 Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.b__2(ITarget 目标) 在 System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 在 System.Linq.Buffer`1..ctor(IEnumerable`1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at Ninject.Activation.Providers.StandardProvider.Create(IContext context) at Ninject.Activation.Context.ResolveInternal(O…< /p>

未解决的依赖项是 to System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35(或其依赖项之一)。它通过 NuGet 包含在项目中。

然而,这个有问题的程序集确实存在于磁盘上 Azure Function 的 bin 文件夹中,并且构建本身很好。因此,我的理论是 Ninject 在实例化 custom 时做了一些特殊的事情Provider<T>

也许 Ninject 期望将依赖项收集在另一个位置,相对于函数执行的位置或其他什么?也许根本不是 Ninject 应该受到指责的,而是在我不知道的 Azure 环境中如何解决依赖关系方面的一些特殊情况?

我希望你们中的某个人可以通过阐明这里发生的事情来帮助我,或者建议采取明智的故障排除措施,因为我已经把所有的空白都画了几天了。

如果是这种情况,我可以影响负责自定义的人员如何Provider<T>在他们的代码中解决问题,因此可能的解决方案包括这个场所。

预先感谢您!

0 投票
0 回答
227 浏览

c# - 如何将仅存在于内存中的执行程序集加载到新的 AppDomain 中?

我需要创建新的 AppDomain 并将执行程序集传递给它,而无需访问程序集文件本身。我曾尝试使用二进制序列化程序来传输加载的程序集,但无法通过仅存在于内存中的程序集来完成。

问题是新的 AppDomain 抛出程序集加载异常,因为当前目录中没有这样的文件。

更新:即使我找到了获取实际程序集字节数组的方法,将其保存到磁盘并强制将其加载到新的 AppDomain - 存在转换错误 - 我无法将其从代理类型转换为实际的类或接口.

示例项目: https ://drive.google.com/open?id=16z9nr8W5D8HjkBABgOCe5MIZKJSpFOul

更新 2:下面的示例在从硬盘驱动器上的程序集执行时有效 - 无需搜索程序集文件,并且程序集FullName在方法上就足够了CreateInstanceFromAndUnwrap。从字节数组加载包含此代码的程序集时,会发生所有错误。用法:

0 投票
1 回答
5222 浏览

c# - 如何调试 PerfMon.dll 中的 0xc0000409 错误?/ 组装绑定

问题描述

我正在尝试在客户的服务器(Win 2012R2)上调试问题,我们的 .NET Web 应用程序之一托管在他们的 IIS(版本 8.5.9600.16384)中。最近,我们的一位技术支持人员更改了应用程序的 Web.config 文件中的一个小内部设置,据他们说,系统没有进行任何其他更改或操作。该应用程序也没有更新,并且之前一直运行没有任何问题。

由于该更改,配置站点的 AppPool 无法再启动。根据系统事件日志,有几次尝试启动,每次都会导致工作进程崩溃,直到池的快速失败保护完全停止启动进程。

此外,由于我在客户的服务器上,因此我只有有限的调试选项。

发现

WAS 在系统事件日志中报告:

为应用程序池“[我们的池]”提供服务的进程与 Windows 进程激活服务发生了致命的通信错误。进程 ID 为“5664”。数据字段包含错误号。

由于为该应用程序池提供服务的进程中的一系列故障,应用程序池“[我们的池]”被自动禁用。

查看相应的应用程序错误日志会发现以下内容:

错误应用程序名称:w3wp.exe,版本:8.5.9600.16384,时间戳:0x52157ba0 错误模块名称:PerfMon.dll,版本:8.0.10977.0,时间戳:0x59cfb424 异常代码:0xc0000409 错误偏移:0x000f8c7b 错误进程 id:0x1620 错​​误应用程序启动时间:0x01d423ff75bef49f 错误应用程序路径:C:\Windows\SysWOW64\inetsrv\w3wp.exe 错误模块路径:C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll 报告 ID :b56327b3-8ff2-11e8-80d5-005056a52299 错误包全名:错误包相关应用程序 ID:

在搜索这个问题时,我主要关注 PerfMon.dll 问题和提供的错误代码 0xc0000409,这显然与注册表项损坏或堆栈缓冲区溢出有关,但在这两种情况下,我都无法弄清楚是什么原因可能是。

我还尝试了此处描述的故障转储分析 https://blogs.msdn.microsoft.com/parvez/2016/08/06/iis-application-pool-crash-and-debug-diag/

但最终它似乎只是回到原始问题的往返,因为这是在转储中发现的唯一错误:

来自 Microsoft Corp. 的 C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll 中 PerfMon!DllGetClassObject+966fb 的汇编指令导致线程 2 出现未知异常 (0xc0000409)

这基本上是我已经从事件日志中得到的。

我在这里的主要问题不仅是可能是什么原因和这个问题的潜在解决方案,而且首先是如何正确找到原因/解决方案。

更新

使用 Fusion Logs,我能够找到System.Web.DynamicDataSystem.Web.ExtensionsSystem.ServiceModel.web的三个绑定错误。

操作失败。绑定结果:hr = 0x80004005。未指定的错误

程序集管理器从以下位置加载: >C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 在可执行文件 C:\Windows\SysWOW64\inetsrv\w3wp.exe 下运行 --- 详细的错误日志如下。

=== 预绑定状态信息 === LOG: DisplayName = System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (完全指定) LOG: Appbase = [app root path] LOG:初始 PrivatePath = [应用根 bin 目录] LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a LOG: Cache Base = C:\Windows\Microsoft. NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a 日志:AppName = b83a4ee 调用程序集:(未知)。

由于依赖程序集与条件 APTCA 共享模式不匹配而拒绝代码共享

搜索这方面的任何信息,我只能找到一个与 MVC3/MVC4 相关的旧错误,这需要更改配置。不过,这与这个问题无关。这也可能意味着原始错误与 PerfMon 完全无关,原始错误只是一个奇怪的副作用。

0 投票
1 回答
302 浏览

json.net - 解决 NewtonSoft.Json 的冲突版本要求

我已经阅读了几篇关于程序集绑定问题的帖子,并尝试了许多建议的解决方案,但都没有运气。

我有一个相对较旧的 asp.net 网络表单网站。它依赖于 .Net Framework 4.6 分析程序集,而后者又依赖于 NewtonSoft.Json。该 Analytics 程序集是我们自己的程序集之一,是使用 NewtonSoft.Json v7.0.1 构建的。这是驻留在网站的 bin 文件夹中的程序集版本。

我有一个较新的网站,一个 Angular SPA,它依赖于 .Net Framework WebApi 服务。这些服务依赖于调用单独的日志服务的日志助手组件。日志帮助程序组件依赖于 Microsoft.AspNet.WebApi.Client 进行服务调用,它依赖于 System.Net.Http.Formatting,它依赖于 NewtonSoft.Json v6.0.4。

当我尝试在网站中使用新的日志记录助手组件时,在运行时,日志记录失败,说它无法加载 NewtonSoft.Json 的 v6.0.0.0 或其依赖项之一。

如果我将 v7.0 文件放在网站 bin 文件夹中,则网站将失败,因为 Analytics 程序集无法加载 NewtonSoft.Json 的 v7.0.0.0 或其依赖项之一。

理想情况下,我想让 Microsoft.AspNet.WebApi.Client 和 System.Net.Http.Formatting 与新版本的 NewtonSoft.Json 很好地配合使用,但我对这些程序集的播放方式没有太多控制。我已经尝试使用 NewtonSoft.Json v6.0.4 重建我的 Analytics 组件,但是当它被构建和部署时,不知何故,它仍然最终在 Web 服务器上寻找 v7.0.0.0。

我觉得我被困在一块岩石和一个坚硬的地方之间。我可以让我的分析工作或我的日志记录工作,但我不能同时工作。关于 a) 寻求解决方案的方向 - 让我的 Analytics 组件接受旧版本或让我的 Logging 组件与新版本一起使用以及 b) 如何完成其​​中任何一种方法的任何建议?

更新 1 - 我尝试过的一些事情超出了我上面描述的内容:在我的日志记录助手组件 .csproj 项目文件中,我尝试从我的 NewtonSoft.Json 参考中删除版本信息。我使用 NewtonSoft.Json v7.0 文件将它部署到网站中,但它仍然失败,说它无法加载 v6.0。我尝试使用程序集绑定日志查看器 fuslogvw.exe。也许我没有正确使用它,但我可以重现我的程序集绑定错误,并且在程序集绑定日志查看器中什么也没看到。

更新 2 - 我尝试在我的日志帮助程序组件中添加一个程序集绑定重定向,将其从 6.0.0.0 重定向到 7.0.0.0,但是当我构建组件并将其放入网站 bin 文件夹中时,该文件夹现在具有 NewtonSoft.Json 7.0文件,记录器仍然无法说它可以加载 v6.0.0.0。难道就没有办法了吗?

更新 3 - 下面是来自日志帮助程序组件的 packages.config。我相信 packages.config 中的所有内容都是基于我添加的 Microsoft.AspNet.WebApi.Client 包。根据 NuGet 上的包信息,它应该适用于 NewtonSoft.Json >= 6.0.4,但它总是无法查找 6.0.0.0。

0 投票
0 回答
168 浏览

c# - Azure DevOps (VSTS) 在运行测试时找不到 Moq DLL

我不断收到此错误:

System.IO.FileNotFoundException:System.IO.FileNotFoundException:无法加载文件或程序集'Moq,版本=4.2.1507.118,Culture=neutral,PublicKeyToken=69f491c39445e920'或其依赖项之一。系统找不到指定的文件。警告:程序集绑定日志记录已关闭。

它在我的项目中编译得很好,我所有的 Moq Nuget 包都设置为版本 4.2.1507.118。我没有针对 Moq 的任何绑定重定向。

顺便说一句,有没有办法为 VSTS 托管代理打开程序集绑定日志记录?

日志文件
这是我的构建步骤日志输出
这是我的测试步骤日志输出

0 投票
0 回答
87 浏览

web-config - 如何在不同的项目中使用不同的 NuGet 包版本?

我想使用同一个 nuget 包的两个不同版本。但我想在我的解决方案中的单独项目中使用这些。我原以为这不是问题,但看起来(虽然 NuGet 工具乐于在不同的项目中安装不同的版本)运行时不乐于引用它们。

解释一下,我的解决方案中有项目 A 和 B。项目 A 想使用 Acme nuget 包版本 1.0.0,项目 B 想使用 Acme nuget 包版本 2.0.0。

我得到的错误是这样的:

当然,项目 A 引用了类库项目 B - 我相信这本质上是导致问题的原因。

如何说服我的解决方案允许每个项目使用他们想要的 nuget 版本?

0 投票
3 回答
2246 浏览

c# - Visual Studio 正在寻找没有 publicKeyToken 的旧 Nuget 包

我的项目中有一个 Nuget 包,该包以前未签名并且没有强名称。

我已经发布了一个新版本的包,现在已经签名了。

当我将我的 Nuget 包的新版本添加到我的解决方案中时,项目中任何引用来自 Nuget 包的程序集的位置都会导致以下构建错误:

错误 CS0012 类型“JsonWebToken”在未引用的程序集中定义。您必须添加对程序集“TSC.Business.DataContracts,Version=2.10.6.0,Culture=neutral,PublicKeyToken=null”的引用。

正如你所看到的,编译器仍然期待一个没有 PublicKeyToken 的程序集版本。

我需要尝试确定为什么编译器仍然期望这个包的 publicKeyToken 为空。

我尝试过的事情 - 都没有运气:

  • 通过从 packages.json、包目录、csproj 文件、bin 路径中删除旧版本并运行完全清理来完全卸载旧的 Nuget 包。

  • 在 packages.json 中验证新版本的 publicKeyToken 是否正确 - 它是

  • 清除我的临时 ASP.Net 文件

  • 哎呀,甚至安装VS2019并检查那里是否存在问题-确实如此

有谁知道编译器还能在哪里寻找这个空的 publicKeyToken?