当前位置:  开发笔记 > 编程语言 > 正文

在.NET中编译与版本无关的DLL

如何解决《在.NET中编译与版本无关的DLL》经验,为你挑选了1个好方法。

当.NET程序集解析程序无法在运行时找到引用的程序集时(在这种情况下,它无法找到应用程序链接的特定包装DLL版本),其默认行为是失败并且实质上使应用程序崩溃.但是,可以通过挂钩AppDomain.AssemblyResolve事件来覆盖此行为.无论何时找不到引用的程序集,都会触发此事件,并且它使您有机会替换另一个程序集来代替缺少的程序集(前提是它们是兼容的).因此,例如,您可以替换自己加载的旧版本的包装器DLL.

我发现这样做的最好方法是在挂钩事件的应用程序的主类上添加一个静态构造函数,例如:

using System.Reflection;

static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e)
    {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "Office11Wrapper")
        {
            // Put code here to load whatever version of the assembly you actually have

            return Assembly.LoadFile("Office11Wrapper.DLL");
        }
        else
        {
            return null;
        }
    }
}

通过将它放在主应用程序类的静态构造函数中,可以保证在任何代码尝试访问包装器DLL中的任何内容之前运行它,确保挂钩提前到位.

您还可以使用策略文件进行版本重定向,但这往往更复杂.



1> Eric Rosenbe..:

当.NET程序集解析程序无法在运行时找到引用的程序集时(在这种情况下,它无法找到应用程序链接的特定包装DLL版本),其默认行为是失败并且实质上使应用程序崩溃.但是,可以通过挂钩AppDomain.AssemblyResolve事件来覆盖此行为.无论何时找不到引用的程序集,都会触发此事件,并且它使您有机会替换另一个程序集来代替缺少的程序集(前提是它们是兼容的).因此,例如,您可以替换自己加载的旧版本的包装器DLL.

我发现这样做的最好方法是在挂钩事件的应用程序的主类上添加一个静态构造函数,例如:

using System.Reflection;

static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e)
    {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "Office11Wrapper")
        {
            // Put code here to load whatever version of the assembly you actually have

            return Assembly.LoadFile("Office11Wrapper.DLL");
        }
        else
        {
            return null;
        }
    }
}

通过将它放在主应用程序类的静态构造函数中,可以保证在任何代码尝试访问包装器DLL中的任何内容之前运行它,确保挂钩提前到位.

您还可以使用策略文件进行版本重定向,但这往往更复杂.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有