最近看了一下.NET程序集重定向方面的资料,并写了一个小程序测试了一下。
发现了两个问题:
1,在Visual Studio 2015 DEBUG模式下启动程序之后,生成的exe文件被修改了。
这种情况只有在生成解决方案之后第一次从VS启动程序时才会发生。
2,把程序集所在的文件用另外一个所包含的程序集版本不同的文件替换之后,再从DEBUG模式下启动,exe中的manifest清单中竟然记录得是最后最后那个程序集的版本号。
也就是说,exe引用的是最后一次替换的那个程序集的版本号,而不是最初的那个文件中所包含的程序集版本号。
补充:
1,实现的语言是C#。
2,三个程序集都是强命名的。
3,.NET 版本是4.6
4,应用程序配置文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Toolkit" publicKeyToken="ba4d601feaaddbdb" culture="neutral"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.1.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
请问是什么原因造成这两个问题的?
签名一个exe必然需要把签名信息写进去,当然要修改。签名是编译后的操作,而不是编译的一部分。
关键问题在于,AssemblyRedirection.exe这个程序集的依赖性被修改了。原来以来的是Toolkit.dll 1.0.0.0这个版本,在VS 2015里面DEBUG 启动之后,AssemblyRedirection.exe却引用的是Toolkit.dll 2.0.0.0这个版本。