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