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