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

Posted

技术标签:

【中文标题】如何获取当前正在执行的 DLL 的位置?【英文标题】:How to get the location of the DLL currently executing? 【发布时间】:2011-06-13 11:24:36 【问题描述】:

我有一个配置文件,作为我正在编写的 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")

【问题讨论】:

【参考方案1】:

您正在寻找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:\),您可能需要将其删除。

【讨论】:

唉!返回C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml 啊!但是Assembly.GetExecutingAssembly().CodeBase 有! CodeBase 给了我文件:\\c:\myassemblypath,这很奇怪 @Matt 使用 new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath 获取真实姓名 string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;【参考方案2】:

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

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.

【讨论】:

【参考方案3】:

在我的情况下(处理我的程序集 [作为文件] 加载到 Outlook 中):

typeof(OneOfMyTypes).Assembly.CodeBase

注意在Assembly 上使用CodeBase(不是Location)。其他人指出了定位程序集的替代方法。

【讨论】:

【参考方案4】:
System.Reflection.Assembly.GetExecutingAssembly().Location

【讨论】:

【参考方案5】:

如果您正在使用 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。我写了详细的说明here。

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

我已经为 IIS 中的 dll 写了一个完整的描述 - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

【讨论】:

以上是关于如何获取当前正在执行的 DLL 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取程序当前执行路径?

delphi如何获取DLL所在的目录

如何在android的地图中获取当前位置?

如何获取当前位置的天气

如何获取当前位置IOS设备

如何获取当前 GPS 位置? (最后不知道)