如何获取当前正在执行的DLL的位置?
我有一个配置文件,我需要加载作为执行我写一个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")
您正在寻找System.Reflection.Assembly.GetExecutingAssembly()
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");
编辑:
显然Location
属性在某些条件下不能正常工作(使用NUnit,TFS实例化的DLL,Outlook?测试) - 在这种情况下,您可以使用CodeBase
属性。
正如已经指出的那样,反射是你的朋友。 但是你需要使用正确的方法;
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.
在我的情况下(处理我的程序集加载[作为文件]到Outlook中):
typeof(OneOfMyTypes).Assembly.CodeBase
注意,这里使用的CodeBase
(不是Location
上) Assembly
。 其他人已经指出了定位组件的其他方法。
上一篇: How to get the location of the DLL currently executing?