2014-11-03 67 views
4

我剛剛開始使用GAC,我試圖在應該使用GAC時不應該使用它。這是我的情況:何時使用GAC?

我開發的軟件主要是加載項到另一個商業產品,以便產品將我的產品加載到它的代碼中。我已經開發了幾個程序集供我的所有應用程序使用(例如,我的許可證模塊)。這些庫的.dll文件被安裝到主應用程序目錄,以便父程序從那裏加載它們。

問題是,當用戶安裝了我的兩個軟件標題時,可能會有衝突,因爲父程序只加載它發現的程序集的第一個副本,而不管版本。因此,如果他們的軟件版本1.0中包含License1.0.dll,而軟件B版本2.5中包含許可證2.0,它與License1.0.dll具有不同的方法和/或參數,它只會加載1.0,然後引發異常軟件B,因爲它無法找到正確的許可證方法。

在最初的研究中,GAC似乎是爲了解決這個問題的答案,並且好幾個網站似乎都這樣說,但是我也發現this subject和答案中的鏈接似乎在說沒有不使用GAC爲此。

我很困惑。有人可以直接指導我是否應該考慮使用GAC嗎?

+1

我想你會遇到更多使用GAC的問題。聽起來像應用程序應配置爲指向正確的版本DLL,通過配置文件中的程序集重定向或通過在編譯時設置引用上的特定路徑。我不確定並且非常有興趣看到答案是什麼。 – TyCobb 2014-11-03 23:43:15

+0

不幸的是,我無法控制父應用程序,但從我的理解是加載.NET程序集的單個應用程序的標準行爲。 I.E.如果我有3個獨立的應用程序運行它將加載到單獨的域,並沒有問題,但由於我的3個應用程序加載在單個應用程序(和它的域)下,它只加載它的一個副本。再次,我在這方面相當新,所以我可能是錯的,但這是我的理解...... – sfaust 2014-11-03 23:57:35

+0

呃,考慮到主機似乎負責部署,這不是由你來做出這種改變。敏感的問題,相當令人懷疑的是,任何人都會鬆開手指,讓您輕鬆執行許可證。您所能做的就是讓他們輕鬆回到GAC解決此問題。這很簡單,只要確保它名字很有名。你可能應該考慮編寫一個安裝程序。 – 2014-11-04 00:11:06

回答

1

我不會推薦使用GAC,因爲你依賴於註冊dll,而且我經常遇到問題。無論如何,你可以手動加載你喜歡的程序集。我有一個64位或32位的父應用程序,我必須加載相應的SQLite x64或x86 dll。 引用程序集有副本地虛假。這是運行時將查找解析引用的第一個地方。如果有什麼,那麼它會檢查GAC。該DLL未註冊有這樣AssemblyResolve事件將發生在那裏我可以說,我要加載的內容:

AppDomain.CurrentDomain.AssemblyResolve += ResoveAssembly; 


private static Assembly ResoveAssembly(object sender, ResolveEventArgs e) 
{ 
    string fullPath = Assembly.GetExecutingAssembly().Location; 
    string path = Path.GetDirectoryName(fullPath); 

    if (e.Name.StartsWith("System.Data.SQLite")) 
    { 
     return Assembly.LoadFrom(Path.Combine(path, Environment.Is64BitProcess 
                ? "x64\\System.Data.SQLite.DLL" 
                : "x86\\System.Data.SQLite.DLL"));} 
     return null; 
    } 
} 

如果有人想知道爲什麼我做的是:據我所知,新的SQLite的NuGet包現在處理這個問題。但是,當我們想要使用它時,它是不可用的。

+0

我在某些情況下使用了程序集解析。然而在這種情況下,我需要一個程序來加載dll文件的1.0版,另一個加載版本2.0,並且它們都在父應用程序(相同的域)下運行。這可能嗎? – sfaust 2014-11-06 17:17:46

+0

我從來沒有嘗試過使用程序集解析。當父應用使用不同的版本時,我知道我有問題。我不太清楚,但你試過,如果它的組裝綁定像[這裏](http://stackoverflow.com/questions/2460542/using-different-versions-of-the-same-assembly-in-the -same文件夾)? – KCT 2014-11-11 07:58:21

+0

有趣,但你把配置放在哪裏?由於我不控制父應用程序,我沒有訪問其配置,只是我的dll文件... – sfaust 2014-11-11 16:47:26