2010-04-22 71 views
1

我創建了一個將被多個應用程序使用的dll,並創建了一個安裝程序包,將其安裝到程序文件中,並將其添加到全局程序集緩存中。關於dll繼承的問題

該dll本身使用log4net,並需要一個xml文件的日誌定義。

因此在運行安裝程序時,下列文件被複制到安裝目錄下的程序文件中: 是我公司開發 主要的DLL - 該Log4Net.dll - 在Log4Net.xml文件

我現在遇到問題。我創建了一個用於實驗的測試控制檯應用程序。我已經添加了我的dll作爲參考,並將「本地副本」標誌設置爲false。

但是,當我編譯測試控制檯exe時,我注意到它已將log4net.dll和log4net.xml文件複製到bin目錄。當運行測試控制檯時,它看起來只有在log4net.dll與exe相同的目錄下才能工作。這是因爲測試控制檯應用程序不使用log4net,而只是作爲參考添加的dll。

是否有某種方式讓它使用log4net.dll & xml文件將被安裝到程序文件,而不是任何需要複製到本地副本的應用程序?將使用我的DLL的應用程序將不會使用log4net,只有他們所引用的dll使用它。

非常感謝

回答

2
  1. 不要安裝到全局程序集緩存!即使你的圖書館的DLL由多個應用程序使用,每個應該有它自己的本地副本。否則,你將陷入一個痛苦的世界,以節省幾KB的磁盤空間。
  2. 始終在本地複製所需的dll。如果您確定應用程序不需要它,您可以稍後刪除unnessesary dll,或者不要將它們包含在安裝程序中。但是如果你的應用程序會調用任何引用,那麼它將在運行時崩潰。所以最好的選擇是把它們留在那裏(畢竟它們是由於某個原因而引用的)。
  3. 不,這是不可能的(至少不是沒有太大的影響)從磁盤上的任意位置.Net加載dll。它應該是這樣的(如果你想知道爲什麼,查找DLL地獄)。
+0

不幸的是,必須依賴任何dll的本地副本不是一個選項 - 這是由於項目的需求,因爲客戶希望獨立的exe可以運行。這就是爲什麼我已將我的dll添加到GAC。 – Adam 2010-04-22 01:08:49

+1

這是一隻豬的口紅。它不是*獨立的exe文件,它需要GAC中的程序集和某個配置它的xml文件。擁有「獨立EXE」的唯一要求不需要安裝程序。那是一頭不會飛的豬。 – 2010-04-22 01:32:42

+0

它需要獨立運行,以便能夠從主機上的任何目錄運行。客戶端需要一個乾淨的目錄,裏面裝滿了可以運行的exe文件,而不是一個充滿exe的目錄,並支持DLL的/ xml文件。 實際上,我幾乎可以通過將log4net.dll添加到GAC中,除了現在我遇到了一個不拾取xml文件的問題。但是,這是一個進步。 我同意你的看法,認爲它可能不是最好的解決方案,但不幸的是,它不是我的設計,而且我僅限於我們客戶想要的框架。非常感謝 – Adam 2010-04-22 01:48:01

0

我懷疑你的問題是配置。如果您希望它從GAC工作,則必須使用完全限定名稱。按照文檔在http://logging.apache.org/log4net/release/faq.html

「當從GAC加載的程序集的完全限定程序集名稱,包括版本,區域性和公鑰必須指定這是在標準語法的支持的System.Type .GetType請參閱下一個關於如何獲取程序集版本和公鑰的FAQ。「

+0

感謝您的更新,但我很困惑我將如何改變我的appender。這裏是我的appender標籤: 然後我用appender-ref引用它。即: 在任何時候,我都不會使用GAC中類的名稱。 – Adam 2010-04-22 01:13:39

+0

我只是拉了文檔中的內容。它表示,如果您將log4net放入GAC中,則必須在配置中使用全名。我知道如果您通過反射創建對象實例,除非您的類型名稱包含版本和公鑰,否則不能從GAC創建實例。 – 2010-04-22 12:55:30

0

我設法通過將Log4net.dll添加到GAC來解決此問題。它現在將運行而不需要本地複製dll。

但它確實需要本地XML文件副本才能正確記錄。