【问题标题】:Runtime Loading Azure.Search.Common.5.0.2 fails to load Microsoft.Rest.ClientRuntime运行时加载 Azure.Search.Common.5.0.2 无法加载 Microsoft.Rest.ClientRuntime
【发布时间】:2018-10-02 06:55:33
【问题描述】:

我正在尝试在运行时加载 Microsoft.Azure.Search.Common.5.0.2 的 dll。根据我在nuget page 上看到的内容,以及安装时nuget 下载的内容,这取决于 Microsoft.Rest.ClientRuntime.2.3.12 。但是,当我直接尝试使用以下内容加载 Azure.Search.Common dll 时:-

Assembly.LoadFrom(dllPath).GetTypes().Select(t => t.Namespace).Distinct().ToList<string>();

我得到以下加载程序异常:-

{"无法加载文件或程序集 'Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。系统找不到指定的文件。":"Microsoft .Rest.ClientRuntime,版本=2.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35"}

从 nuget 安装后,我正在加载 dll。具体来说,我正在加载以下dll:

Microsoft.Azure.Search.Common\Microsoft.Azure.Search.Common.5.0.2\lib\net452\Microsoft.Azure.Search.Common.dll

为了确定,我还检查了我的 csproj 和配置文件,以检查某些版本重定向,但情况似乎并非如此。

上下文:我想知道项目可能使用的所有可能的命名空间,因此我正在下载并加载所有 nuget 包以获取它们的命名空间等。

编辑:

我试图通过将 dll 加载到 ILSpy 中来进一步分析它。在加载 dll 时,ILSpy 还显示它引用了 Microsoft.Rest.ClientRuntime 的 2.0.0.0 版本。它也无法加载该引用并给出以下错误:-

// Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 // 程序集引用加载信息: // 在程序集引用加载过程中出现了一些问题,请参阅下文了解更多信息! // 错误:找不到参考:Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

// System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a (未解决) // Newtonsoft.Json, 版本=6.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed (未解决)// Microsoft.Rest.ClientRuntime.Azure,版本=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 // 组装 参考加载信息://过程中出现了一些问题 装配参考负载,请参阅下文了解更多信息! // 错误: 找不到参考:Microsoft.Rest.ClientRuntime.Azure, 版本=3.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35

【问题讨论】:

  • 在我看来,Microsoft.Azure.Search.Common.dll 正在尝试加载输出目录中缺少的 version 2.0Microsoft.Rest.ClientRuntime
  • 同意,看起来这是一个错误。 ILSpy 给出了类似的错误。

标签: c# dll .net-assembly azure-cognitive-search assembly-loading


【解决方案1】:

顺便说一句:

var ldAssmbly = Assembly.LoadFrom("Microsoft.Azure.Search.Common.dll");
var results = ldAssmbly.GetTypes().Select(t => t.Namespace).Distinct().ToList<string>();

诀窍是将所有依赖项复制到输出文件夹(就像我一样)。 Microsoft 以一种很酷的方式构建了 Assembly Loader,它可以扫描当前路径中的依赖项。充分利用这一点:)

它确实取决于 v2.0.0.0 - 以下来自 IL 清单

您能否检查您的 App.config - 安装 nuget 包时是否添加了程序集重定向?这可能是反射加载程序集时它不起作用的原因。

更新:- 是的 - 看起来很狡猾:-

nuget install 之后 - 它确实说依赖项是 v2.3.12 但是,添加的 dll 在 VisualStudio 中显示 v2.0.0。 dll文件属性说v2.3.12(来自AssemblyInfo版本属性)

但经过 IL 检查 - 它显然是 v2.0.0(这是 VisualStudio 显示的)

【讨论】:

  • 依赖v2.0.0.0但安装nuget安装v2.3.12,所以找不到引用的版本,抛出异常?
  • 标准做法是只在 AssemblyVersion 中设置主要版本号,而在 AssemblyFileVersion 中放置次要版本号和构建/补丁号。这允许使用兼容但不完全相同的程序集版本。例如,您可以将 Microsoft.Rest.ClientRuntime 升级到 2.3.14,而无需同时升级 Microsoft.Azure.Search。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 2020-01-04
  • 1970-01-01
  • 2017-05-07
  • 2015-02-06
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多