【问题标题】:Reference assembly version mismatch参考程序集版本不匹配
【发布时间】:2014-05-15 05:02:20
【问题描述】:

我正在尝试为 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 的自定义目录中创建 Assembly Bind Log 失败。

谁能解释一下,为什么它还在工作?

【问题讨论】:

  • 您是否将程序集安装到 GAC 或 NGEN 上?
  • 不,我既没有安装到 GAC 也没有安装到 NGEN 中。
  • 如果我只是从 ConsoleApplication 的 bin 中删除 ClassLibrary1.dll,那么我会在 Assembly Bind Log Viewer 中获得一个新的绑定失败日志条目。
  • 作为测试,在 v2 中将字符串更改为“no”。还可以尝试使用不同的 .NET 版本,我相信这可能是 .NET 4.5 中的新内容。最后,尝试相反,使用 v2 编译并引用 v1。 msdn.microsoft.com/en-us/library/2fc472t2(v=vs.110).aspx
  • 您必须小心不要重建控制台应用程序。如果您在一个解决方案中同时拥有这两个项目,它会。如果将其保存在单独的解决方案中,则 .dll 文件不会被复制到控制台应用程序的 bin\Debug 目录中。如果您记录所有绑定,您可以使用 Fuslogvw.exe 看到一些内容:)

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


【解决方案1】:

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

我也遇到过同样的事情,并试图查看 msbuild 日志:

msbuild /v:detailed /t:build

以下几行看起来很有趣:

统一依赖“Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”。 在“C:\src\BindingTest\Lib1\bin\Debug\Lib1.dll”中使用此版本而不是原始版本“7.0.0.0”,因为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多