Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VS 2010生成输出路径覆盖Assembly.GetExecutionGassembly案例?_C#_Visual Studio - Fatal编程技术网

C# VS 2010生成输出路径覆盖Assembly.GetExecutionGassembly案例?

C# 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” 现在,如果我创建一个单独的目录将程序集

在调试依赖于了解当前执行程序集路径的某些行为时,我注意到,如果我在C#VS 2010项目中执行以下行而未对生成输出路径进行任何调整,assembly.GetExecutionGassembly将返回一个大小写正确的路径

e、 g

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-谢谢,但是找到解决方法不是我要描述的问题。它是-人们应该能够依靠汇编库以正确的方式表示路径吗?这正是我想要理解的。非常感谢。