【发布时间】: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