我有一个项目,将模板存储在DLL和EXE旁边的\Templates文件夹中.

我希望在运行时确定该文件路径,但是使用一种在单元测试和生产中都有效的技术(我不想在NUnit中禁用卷影复制!)

Assembly.Location不好,因为在NUnit下运行时,它会返回卷影复制程序集的路径.

Environment.CommandLine的用途也很有限,因为在NUnit等人中,它将路径返回给NUnit,而不是我的项目.

Assembly.CodeBase看起来很有希望,但这是一条UNC路径:

file:///D:/projects/MyApp/MyApp/bin/debug/MyApp.exe

现在,我使用字符串操作将其转换为本地文件系统路径,但我怀疑有一种更干净的方法可以实现这一点.NET框架.有人知道推荐的方法吗?

(在这种情况下,如果UNC路径不是file:/// URL,则引发异常是绝对正确的)

推荐答案

你需要使用系统.乌里.本地路径:

string localPath = new Uri("file:///D:/projects/MyApp/MyApp/bin/debug/MyApp.exe").LocalPath;

因此,如果需要当前正在执行的程序集的原始位置:

string localPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;

LocalPath包括程序集的文件名,例如.,

D:\projects\MyApp\MyApp\bin\debug\MyApp.exe

如果需要程序集的目录,请使用System.伊奥.路径GetDirectoryName():

string localDirectory = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);

这将给你:

D:\projects\MyApp\MyApp\bin\debug

.net相关问答推荐

为什么Linq中的运算符逻辑不匹配结果,当值为0或在VB. NET中没有

如何使用AWS Lambda函数制作网络挂钩?

在`MAUI`应用中使用Android`MediaPlayer`的`prepare`方法只在发布模式下和在物理设备上崩溃

NET 6:控制器方法不可访问

查询 MongoDb 中嵌入式文档中的一个字段,该字段抛出调用运算符的左侧必须是对持久属性的直接访问

.net Maui 在单击按钮时访问 CollectionView 中的数据项

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

来自奥尔森时区的 .NET TimeZoneInfo

如何将浮点数向上舍入到 C# 中最近的 int?

Select 文件夹对话框 WPF

C#:内存不足异常

将双精度转换为带有 N 个小数的字符串,点作为小数分隔符,并且没有千位分隔符

实体框架 - 无法将 lambda 表达式转换为类型字符串,因为它不是委托类型

如何根据默认样式创建样式?

在 .NET 中填充整数列表

有没有办法从方法返回匿名类型?

ILookup 接口与 IDictionary

使用 C# 设置全局热键

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

根据条件从列表中删除项目