如何获取当前正在执行的DLL的位置?


93

我有一个配置文件,在我编写的dll执行过程中需要加载该文件。

我遇到的问题是,当应用程序运行时,我放置dll和配置文件的位置不是“当前位置”。

例如,我将dll和xml文件放在这里:

D:\ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

但是,如果我尝试像这样引用xml文件(在我的dll中):

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

然后。\ AggregatorItems.xml转换为:

C:\ windows \ system32 \ inetsrv \ AggregatorItems.xml

因此,我需要找到一种方法(希望)来知道当前正在执行的dll所在的位置。基本上我正在寻找:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

Answers:


137

你在找 System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

注意:

.Location属性返回当前运行的DLL文件的位置。

在某些情况下,DLL是在执行前进行影子复制的,并且该.Location属性将返回副本的路径。如果您想要原始DLL的路径,请改用Assembly.GetExecutingAssembly().CodeBase属性。

.CodeBase包含一个前缀(file:\),您可能需要将其删除。


8
唉! 那回来了C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano

23
啊! 但是Assembly.GetExecutingAssembly().CodeBase有!
瓦卡诺2011年

2
CodeBase给了我文件:\\ c:\ myassemblypath,这很奇怪
Matt

10
@Matt使用新的Uri(Assembly.GetExecutingAssembly()。CodeBase).LocalPath获得真实姓名
Larry

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell '18

36

正如已经指出的,反思是您的朋友。但是您需要使用正确的方法。

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

16

就我而言(处理我的程序集(作为文件)加载到Outlook中):

typeof(OneOfMyTypes).Assembly.CodeBase

请注意在上使用CodeBase(not LocationAssembly。其他人指出了定位组件的替代方法。



1

如果您正在使用asp.net应用程序,并且想在使用调试器时查找程序集,则通常将它们放在一些临时目录中。我写了这种方法来帮助解决这种情况。

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

有关更多详细信息,请参阅此博客文章http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

如果您无法更改源代码或重新部署,但是可以使用Process Explorer检查计算机上正在运行的进程。我在这里写了详细的说明。

它会列出系统上所有正在执行的dll,您可能需要确定正在运行的应用程序的进程ID,但这通常并不难。

我已经针对IIS中的dll编写了完整的说明-http: //nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -服务器/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.