【问题标题】:Wrong version of strong name Dll loading successfully强名Dll加载成功的错误版本
【发布时间】:2011-11-03 20:27:04
【问题描述】:

我在加载程序集时遇到了一个不寻常的问题。假设我们有引用 FooInfra.dll 版本 1.0.0.0 的 Foo.dll,它是强名称签名的。

我们正在使用外部可执行文件来加载 Foo.dll 并在其中调用 MyMethod()。由于某种原因,在特定模式下运行exe时,我们称之为模式A,即使意外部署了FooInfra.dll 2.0.0.0版本,MyMethod()也能成功运行。如果在“模式 B”下运行它,我们会得到预期的错误,即未找到正确的程序集。

我的问题:这怎么可能?我认为对于强命名程序集,必须使用正确的版本。我已经附加了 windbg 以确保它没有从模式 A 中的其他位置加载 FooInfra.dll,但它不是 - 它实际上是在加载版本 2.0.0.0。

是否有可能在模式 A 中,外部可执行文件显式加载 DLL,在 MyMethod 运行时绕过强名称检查,因为只加载程序集?

任何有关该问题的见解,或如何调试/诊断将不胜感激。谢谢!

【问题讨论】:

  • 对于自 .NET 3.5 SP1 起以完全信任方式运行的应用程序,将跳过强名称验证。

标签: c# dll assemblies strongname


【解决方案1】:

您没有具体说明每种情况下的负载有何不同。另外 - 而不是 windbg,我会使用 Fusion 来记录您的程序集加载。它将向您显示正在探测的路径,您可以查看它是否完全忽略了案例 2 中的强名称。

没有更多的技术细节,很难说。如果 foo 确实有对使用强名称的强命名程序集的引用(签入反射器),我希望它会失败,但它可能有文档,但是您在模式 A 中加载它会跳过检查(再次需要更多细节)

您有任何机会使用 -Vr 选项吗? http://www.lookout.net/2006/04/09/bypassing-strong-name-verification-for-a-net-assembly/

【讨论】:

  • 因为它是一个外部 exe,很遗憾我没有关于它是如何加载的额外信息。我将检查 fuslogvw 以了解它在每种情况下如何加载它。谢谢!
  • Fuslog 显示两种模式都无法加载 dll,但有另一个日志条目显示使用 Assembly.LoadFrom 进行显式加载。在 Assesmbly.LoadFrom 中设置断点,我看到在模式 A 中,加载了一个外部插件,该插件明确解决了程序集加载问题。感谢您的帮助!
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多