2010-11-24 5 views
1

実行時に特定のクラスを含む.csファイルを取得できるかどうかを知りたいと思います。実行時にクラスを含むファイルを取得することは可能ですか?

Ex。私は自分のクラス(パブリッククラスFoo)を表す "Type"を持っているので、その親ファイル( "c:\ foo.cs")へのパスを取得したいと思います。

おかげ

編集:これの目的は、例えば、(プログラムによって読み込ま)リストビューでユーザーにいくつかのクラスの名前を表示するようになり、彼がのListViewItemの1のクリックを倍増するとき、それが開きます。問題のクラスを含むcsファイル。

+1

あなたがソースを持っていない場合、私はこれが動作するようになっているか理解していません実行時のコード。 –

+0

タイプを複数のファイルに分割することができます。 – Bryan

+0

あなたがこの情報を入手したい理由を教えてもらえると助かりますか? – Bryan

答えて

1

可能ですが、私が知っている '魔法'の方法はありません。これをサポートするすべてのタイプにメソッドを追加する必要があります。また、.pdbファイルが利用可能な場合にのみ機能します。 _GetSourceFileNameは、それなしでnullを返します。

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     DumpFilenameForType(typeof(A)); 
     DumpFilenameForType(typeof(B)); 

     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      System.Console.Write("Press any key to continue . . . "); 
      System.Console.ReadKey(); 
     } 
    } 

    static void DumpFilenameForType(Type t) 
    { 
     MethodInfo mi = t.GetMethod("_GetSourceFileName", BindingFlags.Static | BindingFlags.NonPublic); 
     if (mi != null) 
      Console.WriteLine("Type '{0}' is located in '{1}'", t.FullName, mi.Invoke(null, null)); 
     else 
      Console.WriteLine("Type '{0}' does not provide method _GetSourceFileName", t.FullName); 
    } 
} 

//他のいくつかのファイル

public class A 
{ 
    static string _GetSourceFileName() 
    { 
     return new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); 
    } 
} 

//さらに別の他のファイル

public class B 
{ 
    static string _GetSourceFileName() 
    { 
     return new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); 
    } 
} 
+0

ありがとう!それは私が探していたものとまったく同じです! – SuperOli

2

ソースコードをバンドルする場合は、必ず入力してください。この場合、あなたはすでにそれがどこにあるかを知っています。

しかし、ソースコードはコンパイルされたプログラムではデフォルトでは含まれていないため、実行時には取得できません。

おそらくあなたがしようとしていることを広げると、助けになるかもしれません。

0

アセンブリコード自体にソースコードへの参照がないため、これはデバッグデータベース(.pdb)にもアクセスできる場合にのみ機能します。それでも、この情報を得ることは非常に難しいでしょう。

1

はい、プログラムでインデックス付きシンボルファイル(PDB)を配布する必要がありますが、Source Serverを使用できます。

ソースサーバーの実装をセットアップすることは、それほど簡単ではありません。

このメカニズムの基本は、アプリケーションのすべてのソースコードがWebサーバーに公開され、PDBファイルがソースコードの場所(つまりURI)にタイプ情報を結びつける情報で書き直されていることです。理論的には、実行時にこの情報を使用して、Webサーバーから適切なソースファイルを要求することができます。

0

C#プログラムをコンパイルすると、ソースコードがCILに変換され、アセンブリ内に配置されます。元の生のソースファイルはコピーされないので、Typeオブジェクトはそれを取得できません。

ソースコードにアクセスするには、そのファイルをビルドプロセスに組み込み、Typeオブジェクトを使用せずにファイルをロードする必要があります。

関連する問題