2012-06-09 9 views
5

.csファイルへのパスをどのように見つけるか?C言語で.csファイルへのパスを探す方法

関数のプロトタイプ:

string FindPath(Type);

のような返し何か "C:プロジェクト\ \ ..... \ MyClass.cs"

+0

あなたがこれを必要とするのはなぜ?すべてのコードがアセンブリにコンパイルされているため、実行時に可能であるかどうかはわかりません。 – alexn

+0

アプリケーションを停止し(デバッグ+デバッグを停止)、プロジェクトを再構築します。 – adatapost

答えて

2

すべてのクラスはアセンブリにコンパイルされます(.exeまたは.dll)。私はあなたがクラスのソースファイルへのパスを得ることはできないと考えています。そのクラスは存在しないかもしれません(別のマシンに.exeファイルをコピーした場合)。

ただし、実行中の現在のアセンブリ(.exeファイル)へのパスを取得できます。この回答を確認してください:Get the Assembly path C#

string file = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; 
+1

この回答は削除またはコメントに変換する必要があります。 –

+0

@ChrisMarisic私はこれに同意しませんが、これは関連する情報と有効な解答であり、なぜこれが不可能であるのかを説明しています。 – ForceMagic

6

これはできません、そのような関係はありません。クラスは部分的なものかもしれないので、いくつかの異なるソースファイルから来ることさえできます。

+0

おそらくあなたは正しいです...ありがとう – satellite

+0

ファイル名と行番号をスタックトレースに表示するのに十分なデバッグ情報が格納されているので、デバッグビルドで可能かもしれません(http://msdn.microsoft .com/ja-us/library/system.diagnostics.stacktrace.aspx)。私はこの情報にアクセスする方法はわかりません。 –

+2

@TimS:デバッグ情報があるので、何とかそれを掘り起こすことができますが、クラスごとではなく、文ごとにソースファイルを取得することができます。 – Guffa

12

の.Net 4.5ではあなたは(MSDNから)CallerFilePath反射属性を使用することができます。

// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 

// Sample Output: 
// message: Something happened. 
// member name: DoProcessing 
// source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
// source line number: 31 

参照:http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callerfilepathattribute(v=vs.110).aspx

+0

これは 'public HomeController():base(TraceFileLocation())'の行に沿って何かを行うことでファイルの位置を追跡するのに使うことができます。インスタンスレベルでそれをやっているなら、パスを解析しているならば不要な作業をしないように静的なコレクションに '[CallerFilePath]'の値をキャッシュしたいかもしれません(実際に値を取得することが期待されますこの) –

関連する問題