如何使用程序集绑定重定向来忽略修订版本和内部版本号

时间:2009-09-22 13:57:56

标签: .net assemblies reference

我在C#中有几个.NET应用程序,以及一个用于访问数据库的API。我想将所有版本的API放在数据库中,让他们选择最高版本和内部版本号,但要坚持使用它们构建的主要和次要编号。基本上,当我引用API 1.2.3.4时,我希望引用读取1.2.*.*,以便应用程序选择1.2.3.5我看到我可以使用XML配置文件执行此操作。我宁愿让它遵守。类似于发布策略,但没有额外的文件。我可以满足于此。另一个问题是我看到的所有解决方案都将一个版本重定向到另一个特定版本,而不仅仅是更新版本。

我该怎么做?

有人能指出我是发布商政策的信息来源吗?

2 个答案:

答案 0 :(得分:27)

感谢leppie's suggestion使用AppDomain.AssemblyResolve事件,我能够解决类似的问题。这是我的代码的样子:

    public void LoadStuff(string assemblyFile)
    {
        AppDomain.CurrentDomain.AssemblyResolve += 
            new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        var assembly = Assembly.LoadFrom(assemblyFile);

        // Now load a bunch of types from the assembly...
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var name = new AssemblyName(args.Name);
        if (name.Name == "FooLibrary")
        {
            return typeof(FooClass).Assembly;
        }
        return null;
    }

这完全忽略了版本号,并将已加载的库替换为名为“FooLibrary”的任何库引用。如果您想要更具限制性,可以使用AssemblyName类的其他属性。 FooClass可以是FooLibrary程序集中的任何类。

答案 1 :(得分:5)

AppDomain.AssemblyResolve事件应有所帮助。