1

現在実行中のアセンブリのパスを知ることに依存するいくつかの動作をデバッグする際に、ビルド出力パスを調整せずにC#VS 2010プロジェクトで次の行を実行すると、Assembly.GetExecutingAssemblyが大文字と小文字を区別する正しいパスを返すことに注意してください。 。

例えば、

string location = Assembly.GetExecutingAssembly().Location;

「C:\ src \ MyProject \ MyProject \ bin \ Debug\MyProject.exe」と表示されます

ここで、アセンブリを出力する別のディレクトリ(C:\ src \ MyCamelCaseDir \など)を作成し、[ビルド]-> [出力パス]をC:\ src \ mycamelcasedirに更新すると、上記のコードで文字列 "C: \ src \ mycamcelcasedir\MyProject.exe"。

区別は、明らかに

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

OSがパスを大文字と小文字を区別するものとして扱わない場合でも、はfalseです。

Visual Studioでデバッグモードで実行することがこの理由だと思います...しかし、私はまだ少し混乱しています-GetExecutingAssemblyは、オペレーティングシステムがアセンブリ、ケース、およびすべてを含むと考えるディレクトリパスを返すべきではありませんか?

編集:私の質問はうまく表現されていないと思います。私の質問に対する正解は、VSがBuildOuputPathのテキストボックスとプロジェクト名を連結しているだけだと書いているポスターです。

私が尋ねようとしていた質問は、Assembly.GetExecutingAssembly()。Locationで、オペレーティングシステムが格納している方法で大文字と小文字を区別してパスを返さないのはなぜかということでした。

エクスプローラーウィンドウにC:\ foo \ barと入力すると、C:\ Foo \ Bar(そのようなディレクトリがある場合)に移動できるという点で、Windowsでは大文字と小文字が区別されないことを知っています。

しかし、デバッグするかどうかに関係なく、実行中のアセンブリの場所はすべての場合で同じだと思いました。

4

2 に答える 2

3

この点に関するドキュメントは明らかにされていませんが、GetExecutingAssembly()。Locationからのパスは、アセンブリのロード時にオペレーティングシステムが使用したパスのようです(実行可能ファイルの場合、これはProcess.Start()または同等のものに渡されるパスのようです。 、OSは、大文字と小文字を区別せずに、ファイルシステムに記録されているバージョンにそのまま使用します。)アセンブリの実際の名前から取得されるファイル名の部分を除きます。

テストコマンドラインアプリをコンパイルし、コマンドプロンプトから実行することで、これが実際に動作していることを簡単に確認できます。

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」だけを入力すると、大文字と小文字が正しく設定されたバージョンが取得されますが、上記の2番目のケースでは、すでに正規のファイル名が使用されているため、そのまま渡します。したがって、名前はケース入り。

つまり、ファイルシステムからすべてのケースを手動で検索しない限り、NTFSファイルシステムが内部で提供している場合でも、Windowsでのファイル仕様のケース保存に依存しないことを強くお勧めします。ほとんどのAPIから取得するのは、ファイルに到達するために使用できるfilespecだけであり、必ずしもファイルシステムに記録されたままのfilespecではありません。

于 2013-03-24T20:17:59.423 に答える
0

文字列の比較では、文字列の基本的な値が何であるかを認識していません。Windowsのデフォルトのパスでは大文字と小文字が区別されないことを指摘しているので、比較するときはこのように扱う必要があります。

つまり、あなたの場合は使用する必要があります

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

ファイルパス文字列を比較します。(または、最初にパスを正規化できます-C#でディレクトリ名を正規化します)。

補足:大文字と小文字が異なる理由として最も可能性が高いのは、完全な実行可能ファイル名がVSによって「出力パス」と「プロジェクト名」の文字列連結で構成されているためです。

于 2013-03-24T20:02:32.063 に答える