2010-11-24 3 views
1

Я хотел бы узнать, можно ли получить файл .cs, содержащий определенный класс во время выполнения.Возможно ли получить файл, содержащий класс во время выполнения?

Ex. У меня есть «Тип», который представляет мой класс (открытый класс Foo), и из этого я хотел бы получить путь к его родительскому файлу («c: \ foo.cs»).

Благодаря

Edit: Целью этого было бы показать название некоторых классов пользователя в ListView (заселенный программно), например, и когда он двойной щелчок на одном из ListViewItem, она открывает. cs-файл, содержащий данный класс.

+1

Я не понимаю, как это должно работать, если у вас нет источника кода во время выполнения. – 2010-11-24 18:59:00

+0

Тип может быть разбит на несколько файлов. – Bryan 2010-11-24 19:34:05

ответ

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(); 
    } 
} 
2

Если вы свяжете свой исходный код, то обязательно. В этом случае вы уже знаете, где это.

Однако исходный код НЕ прилагается по умолчанию к скомпилированной программе и, как таковой, вы не можете получить его во время выполнения.

Возможно, если вы расширите то, что вы пытаетесь сделать, мы сможем помочь?

0

Поскольку ссылка на исходный код в самой сборке отсутствует, это будет работать только в том случае, если у вас есть доступ к базам отладки (.pdb). Даже тогда, до сих пор будет очень трудно добраться до этой информации.

1

Да, вы можете использовать Source Server, хотя вам придется распространять файлы с индексированными символами (PDB) с вашей программой.

Настройка реализации исходного сервера нетривиальна, если не сказать больше.

Основой механизма является то, что весь исходный код для вашего приложения публикуется на веб-сервере, а ваши файлы PDB переписываются с информацией, которая связывает информацию о типе с местоположениями исходного кода (то есть URI). Теоретически вы можете использовать эту информацию во время выполнения, чтобы запросить соответствующий исходный файл с веб-сервера.

0

Когда вы скомпилируете свою программу на C#, исходный код преобразуется в CIL и помещается внутри сборки. Исходный исходный исходный файл не копируется, поэтому объект Type не может его получить.

Для доступа к исходному коду вам необходимо включить его в процесс сборки и загрузить файл без использования объекта «Тип».

Смежные вопросы