2013-07-03 86 views
0

有誰知道如何在C#Visual Studio中創建相對引用,該鏈接將鏈接來自路徑windows\assembly\GAC的DLL?
我的問題是,在我的電腦上,DLL位於GAC_MSIL\somePath\myDll.dll,但在另一臺計算機上,它在GAC\somePath\myDll.dll
是否可以編寫一個引用(例如:%GAC%\somePath\myDll.dll),它將查找我的GAC文件夾的路徑並引用它。位於變量GAC文件夾路徑中的參考DLL

+0

這只是不是GAC是如何工作的。如果程序集是.NET 1.x程序集,則該程序集位於GAC子目錄中。 GAC_MSIL是.NET 2+程序集的子目錄。你永遠不會將自己作爲GAC文件夾引用,這是CLR找回程序集的工作。這是一個真正的問題還是隻是好奇? –

回答

2

你只要引用它就是這樣。添加引用時,它會記住完整的程序集名稱,包括程序集名稱,版本和公鑰標記(用於強命名程序集)。在運行時,當您的應用程序嘗試加載該程序集時,加載器將首先檢查GAC,如果找到匹配項,它將從GAC加載。如果它不能找到GAC大會,將進一步走(如搜索私人bin文件夾等),你可以在這裏找到更多的細節:

http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

+0

感謝您發表此帖,很高興看到它的工作原理。最後我發現我正在編譯dll v.14,並且在第二個服務器上我有dll v.12,這就是爲什麼GAC沒有鏈接到它。 –

1

你只需要將DLL添加到你的項目引用。該程序將自動使用來自用戶GAC的正確DLL。這正是GAC(全局應用程序緩存)的用途。

如果在用戶機器上找不到該DLL,則需要先將其安裝到GAC中。這裏是如何做到這一點的例子(一個Excel DLL):

System.EnterpriseServices.Internal.Publish p = new System.EnterpriseServices.Internal.Publish(); 
FolderBrowserDialog fb = new FolderBrowserDialog(); 
fb.ShowDialog(); 
string pathToDll = fb.SelectedPath; 
string excel = t + @"\" + "Microsoft.Office.Interop.Excel.dll"; 

if (!File.Exists(excel)) 
{ 

    using (FileStream fs = new FileStream(excel, FileMode.CreateNew)) 
    { 
     fs.Write(Properties.Resources.microsoft_office_interop_excel_11, 0, Properties.Resources.microsoft_office_interop_excel_11.Length); 
     fs.Close(); 
    } 
} 

Console.WriteLine("Register GAC..."); 
p.GacInstall(excel); 

的DLL在此示例應用程序資源,並首次寫入到磁盤的再註冊到GAC。