2013-07-03 149 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。