参考汇编版本不匹配

时间:2014-04-03 11:36:14

标签: .net .net-assembly assembly-resolution fusion-log-viewer

我正在尝试为Fusion Log Viewer做一个演示,希望在自定义目录中查看程序集绑定日志。

我刚刚创建了一个小型演示应用程序,如下所示:

一个小类库项目,只包含一个方法GetString()并将程序集版本设置为1.0.0.0

namespace ClassLibrary1
{
    public class Class1
    {
        public static string GetString()
        {
            return "yes";
        }
    }
}
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

一个小型控制台应用程序项目,引用上述库并具有以下代码:

引用ClassLibrary1.dll版本1.0.0.0

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(ClassLibrary1.Class1.GetString());
            Console.ReadLine();
        }
    }
}

我构建此控制台应用程序并关闭visual studio,然后运行可执行文件。它打印出“是”'如预期的那样。

然后,我按如下方式升级ClassLibrary1的AssemblyInfo,将其版本号更改为2.0.0.0:

[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]

使用此版本2.0替换控制台应用程序内的库,并再次运行可执行文件后,它仍然有效并打印“是”'。

当引用的DLL不存在时,为什么它仍然有效?期望应该是在Fusion Log Viewer的自定义目录中创建程序集绑定日志失败。

任何人都可以解释,为什么它仍然有用?

1 个答案:

答案 0 :(得分:0)

...在这里复制我的答案基本上是同一个问题:Assembly Loading Version Mismatch: Why is it loading? ...

我面对同样的事情并试图查看msbuild日志:

msbuild /v:detailed /t:build

以下几行看起来很有趣:

  

Unified Dependency" Newtonsoft.Json,Version = 8.0.0.0,Culture = neutral,   公钥= 30ad4fe6b2a6aeed&#34 ;.         使用此版本而不是原始版本" 7.0.0.0"在" C:\ src \ BindingTest \ Lib1 \ bin \ Debug \ Lib1.dll"因为AutoUnify是   '真'

此外,如果在构建之后检出生成的app.config文件,您可能会看到app.config最初没有的自动绑定重定向。

所以我们观察到的行为与" automatic assembly unification"和" automatic binding redirection" msbuild进程。

以下是documentation关于AutoUnify参数的说明:

  

如果为true,则生成的依赖关系图将自动视为   如果有一个app.Config文件传入AppConfigFile   参数。此虚拟App.Config文件具有bindingRedirect条目   对于每个冲突的程序集集,使得最高版本   选择装配。这样做的结果是永远不会有   关于冲突组件的警告,因为每次冲突都会发生   已经解决了。

     

如果为true,则每次不同的重新映射都将导致高优先级   评论显示旧版本和新版本以及AutoUnify是否属实。

最后,如果你想观察"失败"你可以用以下参数调用msbuild:

msbuild /v:d /t:build /p:AutoUnifyAssemblyReferences=false;AutoGenerateBindingRedirects=false