2008-12-26 140 views

回答

31

我認爲你有點讓人困惑。註冊一個DLL從未被需要爲了使用它。

使用dll只需要加載它(給定一個已知的位置或如果庫在系統路徑中)並獲取您想要使用的函數的地址。

註冊DLL時分發COM或ActiveX對象,需要添加某些條目到Windows註冊表。爲了使用COM服務(例如),您需要引用一個GUID —即唯一標識符—,它允許您獲取實現該服務的dll的句柄(或提供對其的訪問)。有時你可以引用一個完全合格的名字並獲得相同的結果。

爲了所有這些工作需要註冊的DLL。這個「註冊」過程只是在註冊表中創建了幾個條目,但主要是這兩個條目:一個將GUID與dll的位置相關聯(以便您可以通過GUID引用它,而不知道它確切位於何處),另一個將全名與GUID關聯起來。但是,這只是針對COM或ActiveX對象。

當您在.NET中開發應用程序時,項目中引用的庫會在需要時自動加載,而無需擔心查找或加載它們。爲此,框架檢查引用庫的兩個位置。

  • 第一個位置是應用程序路徑。
  • 第二個位置是GAC。

GAC(全局程序集緩存)允許您有效註冊一個在整個系統中使用的dll,並作爲舊註冊機制的演變。

所以基本上你只需要把DLL中的應用程序相同的文件夾。

+1

這是不正確的。如果該程序集名稱很強,它將首先檢查GAC。如果名稱不是很強,那麼系統將首先檢查GAC,然後按照以下過程找到程序集http://msdn.microsoft.com/en-us/library/15hyw9x3.aspx – Spence 2009-10-15 05:18:52

+0

arg,如果它名稱不強,系統不會檢查GAC,不要打字錯誤。 – Spence 2009-10-15 05:19:46

3

它通常足以將dll拖放到目標機器上的應用程序文件夾中。

如果該DLL必須可用於其他應用程序,那麼你可能要考慮GAC

5

您需要將其「拖放」到需要它的應用程序所在的目錄中。

如果存在多個應用程序,或者您希望將文件「刪除」到應用程序目錄以外的某個位置,通常需要調整PATH變量或在全局程序集緩存(GAC)中註冊程序集。

0

應用程序可以使用.NET DLL,只需將它與應用程序在同一個文件夾中。

但是,如果您希望其他第三方應用程序找到DLL並使用它,它們還必須將其包含在其分發中。這可能不合意。

另一種方法是將DLL註冊在GAC(全局程序集緩存)中。

3

如果您想access the assembly via com+。一個例子就是使用一個.NET程序集中定義的類型,來自非.NET應用程序,例如VB6 winforms應用程序。

如果您計劃從另一個.NET應用程序訪問程序集,則不必執行任何操作。如果您的程序集名稱很強大,那麼將其放入GAC可能是個好主意。否則,只需將其放在將引用它的應用程序的目錄中即可。

3

當Windows平臺出現在場景中時,.NET的最大賣點之一是,默認情況下,.NET程序集DLL不必註冊,只需將應用程序私有地使用即可它們與EXE文件位於同一個文件夾中。這是一個很大的進步,因爲它使開發人員能夠避免DLL/COM地獄的磨合。

共享DLL/COM模塊被證明是Windows最大的設計錯誤之一,因爲它導致用戶安裝的應用程序不穩定。安裝一個新的應用程序很可能會破壞一直運行良好的應用程序 - 因爲新應用程序引入了更新版本的共享DLL/COM模塊。 (事實證明,開發人員如果要正確管理細粒度版本依賴關係,負擔過重。)

使用Maven等構建存儲庫系統管理模塊版本是一回事。 Maven非常擅長處理它的功能。

然而,在終端用戶運行環境中分佈在數百萬用戶羣中的這個問題完全是另一回事。

的.NET GAC絕不足夠解決這個古老的Windows問題。

私下消費DLL組件繼續無限優選的。這是一個不容小覷的方式,因爲現在磁盤空間非常便宜(這些日子大約100美元可以在Fry的驅動器上運行一個TB)。與其他產品共用裝配沒有什麼可以獲得的 - 但是當糟糕的用戶遇到問題時,公司聲譽就會鬆動。

2

其實沒有必要在.NET目標機器上註冊的DLL。

如果您在應用程序中引用.dll,請單擊項目中引用的引用.dll,查看屬性並將Isolated設置爲TRUE。

這會自動將此.dll包含在您的項目中,並且您的應用程序將使用項目中包含的.dll副本,而無需將其註冊到目標系統上。

要查看該工作實例看這裏:

http://code.msdn.microsoft.com/SEHE

有問題的.dll文件將需要在您構建應用程序使其正常工作,在系統上註冊。但是,一旦構建項目,就不需要在部署應用程序或程序的任何系統上註冊相關的.dll文件。

使用此方法的另一個好處是,即使將來,另一個.dll在相關目標系統上使用相同名稱註冊,您的項目仍將繼續使用您部署的.dll。這是非常方便的地方。dll有許多版本,你希望保持一定的穩定性,就像使用你測試過的那個版本一樣,但是其他所有的應用程序都會使用註冊的.dll,除非它們也使用isolated = true方法。

上面的例子就是其中的一種情況,Skype4COM有很多版本,它是Skype API .dll,可以經常更改。

此方法允許上述示例使用項目進行測試的API .dll,每次用戶安裝新版本的Skype時,可能會安裝此.dll的修改版本。

此外,有些Skype客戶端不會安裝此.dll,例如Skype客戶端的商業版本較小,並且不包含此.dll,因此在這種情況下,項目不會失敗因爲它包含在項目中,因此.dll缺失並且未被註冊爲isolation = true。

相關問題