2

我正在尝试为 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 的自定义目录中创建程序集绑定日志失败。

谁能解释一下,为什么它仍然有效?

4

1 回答 1

0

...在这里复制我对基本相同问题的答案:程序集加载版本不匹配:为什么要加载?...

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

msbuild /v:detailed /t:build

以下几行看起来很有趣:

统一依赖“Newtonsoft.Json,版本=8.0.0.0,文化=中性,PublicKeyToken=30ad4fe6b2a6aeed”。在“C:\src\BindingTest\Lib1\bin\Debug\Lib1.dll”中使用此版本而不是原始版本“7.0.0.0”,因为 AutoUnify 为“真”。

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

所以我们观察到的行为与“自动组装统一”和“自动绑定重定向”msbuild 进程有关。

以下是有关参数的文档说明:AutoUnify

当为 true 时,生成的依赖关系图会自动被视为有一个 App.Config 文件传递​​给 AppConfigFile 参数。此虚拟 App.Config 文件对于每个冲突的程序集集都有一个 bindingRedirect 条目,以便选择最高版本的程序集。这样做的结果是永远不会有关于冲突程序集的警告,因为每个冲突都将得到解决。

当为真时,每个不同的重新映射将导致显示新旧版本的高优先级注释,并且 AutoUnify 为真。

最后,如果您想观察“失败”,您可以使用以下参数调用 msbuild:

msbuild /v:d /t:build /p:AutoUnifyAssemblyReferences=false;AutoGenerateBindingRedirects=false
于 2017-05-12T17:42:49.197 回答