2009-09-22 72 views
11

我在C#中有幾個.NET應用程序,以及一個用於訪問數據庫的API。我想把API的所有版本的數據庫,並讓他們挑的最高版本和版本號,但他們建有主要和次要號碼堅持。基本上當我參考API 1.2.3.4我想參考閱讀1.2.*.*,以便應用程序剛剛拿起1.2.3.5我看到我可以用XML配置文件來做到這一點。我寧願讓它遵守。類似於發佈策略,但不包含額外的文件。我可以解決這個問題。另一個問題是我看到的所有解決方案都將一個版本重定向到另一個特定版本,而不僅限於任何新版本。如何使用程序集綁定重定向來忽略修訂版本號和內部版本號

我如何做到這一點?

有人能指出我的發行商政策的信息來源?

回答

5

AppDomain.AssemblyResolve事件應該有所幫助。

25

由於使用AppDomain.AssemblyResolve事件leppie's suggestion,我能夠解決類似的問題。這裏是我的代碼如下所示:

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

我試圖做到這一點在ASP.NET應用程序的情況下。我可以在哪裏連接到AppDomain.CurrentDomain.AssemblyResolve事件?在應用程序事件級別(即global.asax)? – 2011-02-24 03:58:08

+0

我想你應該能夠從任何地方的'AssemblyResolve'註冊事件。 'LoadStuff()'方法沒有什麼特別之處。如果您決定在每次加載程序集時註冊事件,請記住在完成後取消註冊。 – 2011-02-24 17:05:23

+0

超棒的男人。正是我在找什麼 – Jupaol 2013-01-17 18:05:32