是否可以在运行时检索包含类的文件?

时间:2010-11-24 18:57:09

标签: c# class path

我想知道是否可以在运行时检索包含某个类的.cs文件。

实施例。我有“Type”代表我的类(公共类Foo),从那里,我想检索其父文件的路径(“c:\ foo.cs”)。

由于

编辑:这样做的目的是在ListView(以编程方式填充)中向用户显示某些类的名称,例如当他双击其中一个ListViewItem时,它会打开包含该类的.cs文件问题。

5 个答案:

答案 0 :(得分:2)

如果您捆绑了源代码,那么请确定。在这种情况下,您已经知道它在哪里。

但是,默认情况下,源代码不包含在已编译的程序中,因此您无法在运行时检索它。

也许如果你扩展你想要做的事情,我们可以提供帮助吗?

答案 1 :(得分:1)

是的,您可以使用Source Server,但您必须在程序中分发索引符号文件(PDB)。

至少可以说,设置源服务器实现并非易事。

该机制的基础是您的应用程序的所有源代码都发布到Web服务器,并且您的PDB文件将使用将类型信息与源代码的位置(即URI)相关联的信息重写。理论上,您可以在运行时使用此信息从Web服务器请求相应的源文件。

答案 2 :(得分: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();
    }
}

答案 3 :(得分:0)

答案 4 :(得分:0)

编译C#程序时,源代码会被转换为CIL并放在程序集中。原始源文件不会被复制,因此Type对象无法检索它。

要访问源代码,您需要将其包含在构建过​​程中并加载文件而不使用Type对象。