[英]Is it possible to retrieve the file containing a class at runtime?
我想知道是否可以在運行時檢索包含某個類的.cs文件。
防爆。 我有“Type”代表我的類(公共類Foo),從那里,我想檢索其父文件的路徑(“c:\\ foo.cs”)。
謝謝
編輯:這樣做的目的是在ListView(以編程方式填充)中向用戶顯示某些類的名稱,例如,當他雙擊其中一個ListViewItem時,它會打開包含相關類的.cs文件。
如果您捆綁源代碼,那么肯定。 在這種情況下,您已經知道它在哪里。
但是,默認情況下,源代碼不包含在已編譯的程序中,因此您無法在運行時檢索它。
也許如果你擴展你正在嘗試做的事情,我們可能會提供幫助嗎?
是的,您可以使用源服務器,但您必須使用您的程序分發索引符號文件(PDB)。
至少可以說,設置源服務器實現並非易事。
該機制的基礎是將應用程序的所有源代碼發布到Web服務器,並使用將類型信息綁定到源代碼位置(即URI)的信息重寫您的PDB文件。 理論上,您可以在運行時使用此信息從Web服務器請求相應的源文件。
這是可能的,但我所知道的並沒有“神奇”的方式。 您必須為要支持此類型的每種類型添加方法。 它也只有在.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();
}
}
由於在程序集本身中沒有對源代碼的引用,因此只有在您可以訪問調試數據庫(.pdb)時才能使用它。 即便如此,仍然很難獲得這些信息。
編譯C#程序時,源代碼將轉換為CIL並放置在程序集中。 原始源文件未復制,因此Type對象無法檢索它。
要訪問源代碼,您需要將其包含在構建過程中並加載文件而不使用Type對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.