1

在调试一些依赖于知道当前执行程序集路径的行为时,我注意到如果我在 C# VS 2010 项目中执行以下行而不对构建输出路径进行任何调整,则 Assembly.GetExecutingAssembly 将返回大小写正确的路径.

例如,

string location = Assembly.GetExecutingAssembly().Location;

显示“C:\src\MyProject\MyProject\bin\Debug\MyProject.exe”

现在,如果我创建一个单独的目录来将程序集输出到,例如:C:\src\MyCamelCaseDir\,并将 Build -> Output path 更新为 C:\src\mycamelcasedir,上面的代码会生成字符串“C: \src\mycamcelcasedir\MyProject.exe”。

区别在于,显然

"..\\MyCamelCaseDir".equals("..\\mycamelcasedir") 

是错误的,即使操作系统不将路径视为区分大小写。

我认为在 Visual Studio 中以调试模式运行是导致此问题的原因......但我仍然有点困惑 - GetExecutingAssembly 不应该返回操作系统认为包含程序集、案例和所有内容的目录路径吗?

编辑:我认为我的问题表述得不好。我的问题的正确答案是发帖人指出 VS 只是将 Build Ouput Path 中的文本框加上项目名称连接起来。

我想问的问题是:为什么 Assembly.GetExecutingAssembly().Location 不以操作系统存储路径的方式返回区分大小写的路径?

我知道 Windows 不区分大小写,因为您可以在资源管理器窗口中键入 C:\foo\bar,这会将您带到 C:\Foo\Bar(如果有这样的目录)。

但我会认为执行程序集的位置在所有情况下都是相同的,无论是否调试。

4

2 回答 2

3

虽然文档在这一点上没有透露,但 GetExecutingAssembly().Location 的路径似乎是操作系统在加载程序集时使用的路径(对于可执行文件,这似乎是传递给 Process.Start() 或其等价物的路径,操作系统按原样使用,而不将其大小写等标准化为文件系统中记录的版本。),除了文件名部分,它取自程序集的实际名称。

您可以通过编译一个测试命令行应用程序并从命令提示符运行它来轻松地看到这一点:

using System;
using System.Reflection;

namespace TestLocation
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0}", Assembly.GetExecutingAssembly().Location);
        }
    }
}

产生:

C:\Users\avatar>C:\Working\TestLocation\bin\Debug\TestLocation.exe C:\Working\TestLocation\bin\Debug\TestLocation.exe

C:\Users\avatar>c:\working\testlocation\bin\debug\testlocation.exe c:\working\testlocation\bin\debug\TestLocation.exe

如果您输入一个短名称,即“testlocation”,您将获得大小写正确的版本,但在上面的第二种情况下,它已经有一个规范的文件名,所以只需按原样传递它 - 因此名称不是装箱。

简而言之:即使 NTFS 文件系统确实在内部提供了它,也不建议在 Windows 下依赖于文件规范中的大小写保留,除非您自己手动从文件系统中查找所有内容的大小写。您将从大多数 API 中获得的只是可用于访问文件的文件规范,而不一定是文件系统中记录的文件规范。

于 2013-03-24T20:17:59.423 回答
0

字符串比较不知道字符串的底层值是什么。正如您所指出的,Windows 中的默认路径不区分大小写,因此在比较时必须以这种方式对待它们。

即在你的情况下你应该使用

String.Equals("..\\MyCamelCaseDir", "..\\mycamelcasedir", 
    String.Comparison.OrdinalIgnoreCase) 

比较文件路径字符串。(或者您可以先规范化路径 -在 C# 中规范化目录名称)。

旁注:不同大小写的最可能原因来自您的完整可执行文件名称是由 VS 构造的,其中“输出路径”和“项目名称”的字符串连接。

于 2013-03-24T20:02:32.063 回答