程序集解析和合并程序集

时间:2012-12-07 14:11:13

标签: c# dll assemblies

当我遇到以下情况时,有人能告诉我装配解决的顺序吗?

在我的垃圾箱里,我有我的exe和2个dll:

  • 程序集A(版本1),B和C合并为X(所以4个程序集合为1)
  • 程序集A(版本2)

我所做的所有引用都没有包含UserSpecificVersion参数。

  • 现在,在我的exe中调用时,正在使用哪个A?
  • 另外,在程序集B中调用期间,正在使用哪个?

如果是另一种方式(首先是B,然后是我的exe),该怎么办?

有没有关于此的文件?

1 个答案:

答案 0 :(得分:0)

  

我所做的所有引用都没有包含UserSpecificVersion参数。

我假设您实际上是指参考装配的“特定版本”设置,并将其设置为False。这在运行时没有任何影响,仅在编译时。添加组件时,它记录了参考组件的[AssemblyVersion]。如果您,稍后,重新编译您的程序但它找到一个带有不同版本的引用程序集,那么它不会抱怨但是按原样使用新程序。这通常是有风险的,只有当你在丢失原始参考装配后试图跛行并且不知道新装置改变的程度时,你才会这样做。始终将此设置保留为默认值True,如果你挖了一个你无法摆脱的深洞,则只使用False。

在运行时,它始终坚持要找到具有正确显示名称的程序集和从参考程序集记录的[AssemblyVersion]。当你有两个具有相同名称和命名空间的程序集时,你通常会遇到麻烦,你往往需要 extern alias 来挖掘自己的漏洞。使用ILMerge确实可以解决方法,它会更改程序集的显示名称。然而,这仍然会让你有一些冲突的命名空间+类型名称,你不清楚你是如何绕过这个障碍的。

因此典型的结果是EXE将尝试使用重命名的程序集显示名称来查找A2,而B将尝试查找A1。我无法通过提供的信息100%保真地确定它。如果您有非典型案例,请使用Fuslogvw.exe获取程序集绑定的跟踪。请务必选择“记录所有绑定”选项。