2012-01-10 60 views
0

我將特定版本設置爲False以將一堆DLL作爲對C#控制檯項目的引用。我知道這是一個編譯時檢查。引用DLL - 在運行時允許以前的版本

那麼如何在運行時允許先前版本的DLL?

謝謝!

+0

[AssemblyVersion]數字可以深入瞭解團隊如何協同工作。如果主要版本號超過3,或者您擁有非常隨機的版本號或修訂版號,則會出現版本號無法修復的通信問題。 – 2012-01-11 00:18:03

回答

5

MSDN - Assembly Versioning

運行時區分正常和強名稱程序集的版本的目的之間。版本檢查僅在使用強名稱的程序集時發生。

如果有一個強命名程序集,您可以重定向引用。見MSDN - Redirecting Assembly Versions。您可以使用AppDomain.AssemblyResolve。這裏有一個例子:

AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) => 
{ 
    var fullName = new AssemblyName(eventArgs.Name); 
    // should check that the assembly is the one we support old versions for 

    var wantedDLL = fullName.Name + ".dll"; 

    // locate the DLL here... your path will vary 
    var found = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, wantedDLL)); 
    return found; 
}; 

另外,如果你知道確切的舊版本號,您可以用Assembly.Load(AssemblyName)超負荷加載它。

var fullName = new AssemblyName(eventArgs.Name) 
       { 
        Version = new Version(1, 0, 0, 0) 
       }; 
return Assembly.Load(fullName); 

你也應該小心這裏的錯誤。拋出異常可能導致奇怪的行爲,並且如果程序集未能被加載,則該方法將無限遞歸導致StackOverflowException

+0

我試過了一個重定向,但是看起來並不像我想要的那樣工作。 Id必須說重定向7.1.100到7.0.150,但其他機器只有7.1.100 - 我只想讓以前的版本工作。 – user1141921 2012-01-10 23:04:16

+0

啊,我明白了。在那種情況下,我認爲你唯一能做的就是用'AssemblyResolve'手工找到它。我會添加一個例子。 – porges 2012-01-10 23:27:57

+0

非常感謝 - 我會給這個鏡頭! – user1141921 2012-01-11 08:28:51

相關問題