我想知道是否可以在运行时检索包含某个类的.cs文件。
实施例。我有“Type”代表我的类(公共类Foo),从那里,我想检索其父文件的路径(“c:\ foo.cs”)。
由于
编辑:这样做的目的是在ListView(以编程方式填充)中向用户显示某些类的名称,例如当他双击其中一个ListViewItem时,它会打开包含该类的.cs文件问题。
答案 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对象。