C# VS 2010生成输出路径覆盖Assembly.GetExecutionGassembly案例?
在调试依赖于了解当前执行程序集路径的某些行为时,我注意到,如果我在C#VS 2010项目中执行以下行而未对生成输出路径进行任何调整,assembly.GetExecutionGassembly将返回一个大小写正确的路径 e、 gC# VS 2010生成输出路径覆盖Assembly.GetExecutionGassembly案例?,c#,visual-studio,C#,Visual Studio,在调试依赖于了解当前执行程序集路径的某些行为时,我注意到,如果我在C#VS 2010项目中执行以下行而未对生成输出路径进行任何调整,assembly.GetExecutionGassembly将返回一个大小写正确的路径 e、 g string location = Assembly.GetExecutingAssembly().Location; 显示“C:\src\MyProject\MyProject\bin\Debug\MyProject.exe” 现在,如果我创建一个单独的目录将程序集
string location = Assembly.GetExecutingAssembly().Location;
显示“C:\src\MyProject\MyProject\bin\Debug\MyProject.exe”
现在,如果我创建一个单独的目录将程序集输出到,例如:
C:\src\MyCamelCaseDir\,并将生成->输出路径更新为C:\src\MyCamelCaseDir,上面的代码生成字符串“C:\src\MyCamelCaseDir\MyProject.exe”
显然,区别在于
"..\\MyCamelCaseDir".equals("..\\mycamelcasedir")
为false,即使操作系统不将路径视为区分大小写
我假设在VisualStudio中以调试模式运行是导致此问题的原因。。。但我还是有点困惑——GetExecutiveGassembly不应该返回操作系统认为包含程序集、大小写和所有内容的目录路径吗
编辑:
我认为我的问题措辞不恰当。我的问题的正确答案是海报,他指出VS只是将Build-output Path和project-name中的文本框连接起来
我想问的问题是:为什么Assembly.getExecutionGassembly().Location不以操作系统存储路径的方式返回区分大小写的路径
我知道Windows不区分大小写,因为您可以在资源管理器窗口中键入C:\foo\bar,这将带您进入C:\foo\bar(如果有这样的目录)
但我认为执行程序集的位置在所有情况下都是相同的,不管是否调试。字符串比较不知道字符串的基本值是什么。正如您所指出的,默认情况下,Windows中的路径不区分大小写,所以在比较时必须这样对待它们 即,在您的情况下,您应该使用
String.Equals("..\\MyCamelCaseDir", "..\\mycamelcasedir",
String.Comparison.OrdinalIgnoreCase)
比较文件路径字符串。(或者可以先规范化路径-)
旁注:不同大小写的最可能原因是,您的完整可执行文件名是由VS通过字符串“output path”和“project name”串联而成的.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”,您将获得正确的大小写版本,但在上面的第二种情况下,它已经有一个规范的文件名,因此只需按原样传递它-因此名称没有大小写
简言之:在Windows下,即使NTFS文件系统在内部提供了大小写保留,也最好不要依赖文件规范中的大小写保留,除非您自己手动查找文件系统中所有内容的大小写。大多数API提供的只是一个可用于访问文件的文件规范,而不一定是文件规范中记录的文件规范。“C:\\src\\MyCamelCaseDir*\\Debug*”。等于(“C:\\src\\MyCamelCaseDir*\\Debug*”。好吧,我的示例很混乱-现在编辑。但问题不是我的目录路径不正确,而是它被计算为小写,只是因为我在输出路径中将路径作为小写。只需使用不区分大小写的字符串比较。进一步考虑。从文件系统中删除该目录,然后重新构建,应该按照您期望的情况创建。但是应该使用不区分大小写的字符串比较,其他任何东西都需要它。Tony-谢谢,但是找到解决方法不是我要描述的问题。它是-人们应该能够依靠汇编库以正确的方式表示路径吗?这正是我想要理解的。非常感谢。