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

时间:2011-01-21 22:52:56

标签: c# .net dll file-io

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

4 个答案:

答案 0 :(得分:103)

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

答案 1 :(得分:30)

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

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.

答案 2 :(得分:14)

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

typeof(OneOfMyTypes).Assembly.CodeBase

请注意CodeBase上使用Location(不是Assembly)。其他人已经指出了定位组件的替代方法。

答案 3 :(得分:4)

System.Reflection.Assembly.GetExecutingAssembly().Location