Как определить имя файла кодового файла из скомпилированного приложения во время выполнения - PullRequest
1 голос
/ 12 февраля 2011

Допустим, у меня есть приложение с двумя файлами. Console.cs и Business.cs

Console.cs имеет программу Main класс.

Business.cs имеет три класса с именами Customer, Order и Orderline.

Есть ли в C # возможность во время выполнения определить (возможно, с отражением), что бизнес-объекты находятся в файле с именем Business.cs?

Ответы [ 4 ]

1 голос
/ 12 февраля 2011

Компилятор C # не передает эту информацию в DLL, поэтому он недоступен для отражения. Однако, как вы знаете из отладки, отладчик может сопоставлять скомпилированные местоположения с местоположениями исходного кода. Это делается через файлы PDB. Таким образом, для вас может быть теоретически возможной отправка файлов PDB и вызов API неуправляемого отладчика или хранилища диагностических символов (см. Общая справка> Справочник по неуправляемому API в MSDN), чтобы определить, где был определен данный метод. Однако вы не можете сделать это для класса, потому что класс можно распределить по нескольким файлам с использованием частичных классов.

1 голос
/ 12 февраля 2011

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

Однако, если вам нужно , чтобы сделать это, для других целей, например, для статического анализа вашего программного обеспечения, вы, вероятно, ошиблись и должны подумать о другом решении.

Если вы поместите классы в пространство имен Business, вы можете использовать отражение, чтобы найти, происходит ли объект из этого пространства имен:

namespace Business {
    class Customer {}
    class Order {}
    class OrderLine {}
}

var myObject = new Customer();
Console.WriteLine(myObject.GetType().Namespace); // writes "Business"
0 голосов
/ 12 февраля 2011

*. Файлы PDB (файлы информации отладки) должны иметь эту информацию.В противном случае я не вижу способа получить его, поскольку файлы кода - это просто абстракция, о которой скомпилированный код не должен заботиться.

0 голосов
/ 12 февраля 2011

Я полагаю, что ближайший вы получите typeof(Customer).Assembly.Location. Однако это даст вам только DLL, а не расположение исходного кода (что имеет смысл, поскольку исходный код обычно не включается в двоичные файлы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...