CSharp - 我怎么获得安装的程序路径?

  显示原文与译文双语对照的内容

是否可以获取当前代码所在的程序集的路径? 我不希望调用程序集的路径,只包含包含代码的程序集。

基本上我的单元测试 需要读取一些相对于dll的xml测试文件。 我希望总是正确解析路径,无论测试dll是从 TestDriven.NET, GUI运行还是其他的。

的编辑: 人们似乎在误解我在问什么。

我的测试库位于

c: projectsmyapplicationdaotestsbindebugdaotests 。dll

我想获得这个路径:

projectsmyapplicationdaotestsbindebug:

当我从 MbUnit Gui运行时,这三个建议使我失败了:

  • Environment.CurrentDirectory 提供了 :program FilesMbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location 给 c: documents和 SettingsgeorgeLocal SettingsTemp 。daotests 。dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location 前面的相同。

时间:

我在单元测试中经常使用以下属性定义了以下属性。


public static string AssemblyDirectory
{
 get
 {
 string codeBase = Assembly.GetExecutingAssembly().CodeBase;
 UriBuilder uri = new UriBuilder(codeBase);
 string path = Uri.UnescapeDataString(uri.Path);
 return Path.GetDirectoryName(path);
 }
}

Assembly.Location 属性有时使用nunit( 程序集从临时文件夹运行) 时给你一些有趣的结果,所以我喜欢用 CodeBase 在uri的格式给你路径,然后 UriBuild.UnescapeDataString 删除 File:// 开始, GetDirectoryName 变化正常 Windows 格式。

这里操作是否有用?


//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

john的回答相同,但稍微少一点的扩展方法。


public static string GetCurrentExecutingDirectory(this Assembly assembly)
{
 string filePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;
 return Path.GetDirectoryName(filePath); 
}

使用代码库和UNC网络共享时的唯一解决方案是:


System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

它也适用于普通 uri 。

下面是一个 VB.Net 代码的端口。 VB不区分大小写,所以他的几个变量名与类型名称冲突。 感谢你的代码 John !


Public Shared ReadOnly Property AssemblyDirectory() As String
 Get
 Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
 Dim uriBuilder As New UriBuilder(codeBase)
 Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
 Return Path.GetDirectoryName(assemblyPath)
 End Get
End Property

...