我正在尝试为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的自定义目录中创建程序集绑定日志失败。
任何人都可以解释,为什么它仍然有用?
答案 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