簡體   English   中英

是否可以在運行時檢索包含類的文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM