VS 2010构建输出路径覆盖程序集.GetExecutingAssembly情况

本文关键字:程序集 GetExecutingAssembly 情况 覆盖 路径 2010 构建 输出 VS | 更新日期: 2023-09-27 18:05:30

在调试一些依赖于知道当前执行程序集路径的行为时,我注意到,如果我在c# VS 2010项目中执行以下行,而没有对构建输出路径进行调整,那么程序集将被调用。GetExecutingAssembly返回一个大小写正确的路径。

string location = Assembly.GetExecutingAssembly().Location;

显示"C: ' src ' MyProject ' MyProject ' bin '调试' MyProject.exe"

现在,如果我创建一个单独的目录来输出程序集,例如:C:'src'MyCamelCaseDir',并将Build ->输出路径更新为C:'src'MyCamelCaseDir,上面的代码产生字符串"C:'src'MyCamelCaseDir' MyProject.exe"。

区别显然是

"..''MyCamelCaseDir".equals("..''mycamelcasedir") 

为false,即使操作系统不将路径视为区分大小写。

我认为在Visual Studio中以调试模式运行是这样做的原因…但我仍然有点困惑- GetExecutingAssembly不应该返回的目录路径操作系统认为包含程序集,大小写和所有?

编辑:我觉得我的问题措辞不太好。我的问题的正确答案是海报谁注意到VS只是连接文本框在构建输出路径加上项目名称。

我想问的问题是:为什么Assembly.GetExecutingAssembly()。位置,返回操作系统存储路径的大小写敏感方式?

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

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

VS 2010构建输出路径覆盖程序集.GetExecutingAssembly情况

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

你可以通过编译一个测试命令行应用程序并在命令提示符下运行它来轻松地看到这一点:
using System;
using System.Reflection;
namespace TestLocation
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0}", Assembly.GetExecutingAssembly().Location);
        }
    }
}

生产:

C: ' '用户头像> C: ' ' TestLocation ' bin ' ' TestLocation.exe调试工作C: ' '工作TestLocation ' bin '调试' TestLocation.exe

C: ' '用户头像> C: ' ' testlocation ' bin ' ' testlocation.exe调试工作c: ' '工作testlocation ' bin '调试' TestLocation.exe

如果你输入一个简短的名字,例如,"testlocation",你会得到正确的大小写版本,但是在上面的第二个例子中,它已经有一个规范的文件名,所以只是按原样传递它-因此名称没有大小写。

简而言之:在Windows下,即使NTFS文件系统内部提供了大小写保存功能,也不要依赖于文件系统中的大小写保存功能,除非你自己手动从文件系统中查找所有内容的大小写。您将从大多数api获得的只是一个可用于访问文件的文件pec,而不一定是文件系统中记录的文件pec。

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

。在您的情况下,您应该使用

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

比较文件路径字符串。(或者你可以先规范化路径——c#中的规范化目录名)。

旁注:最有可能的原因是不同的大小写来自于你的完整的可执行文件名是由VS用"输出路径"answers"项目名称"的字符串连接而成的。