Получить имя проекта, откуда ссылка на DLL через код - PullRequest
2 голосов
/ 09 февраля 2012

Я делаю проект библиотеки классов на C #.Как получить имя проекта, который будет вызывать метод из моей библиотеки классов?

Я пробовал с Reflection:

System.Reflection.Assembly.GetExecutingAssembly()

и с

GetCallingAssembly

, ноэто не сработало.

Ответы [ 3 ]

1 голос
/ 10 апреля 2013

Я тоже это ищу. Имя файла, которое я могу получить из StackFrame точно так же, как ответ @Maheep, но получить имя проекта не совсем просто.

A. Я только что получил простое решение:

  1. На основе FileName (путь), найденного из StackFrame, выполнить итерацию для каждой родительской папки.
  2. Найти любой файл с * .csproj (C #)
  3. При желании откройте файл csproj, чтобы убедиться, что текущий файл <Compile Include="Folder\File.cs" /> включен
  4. Имя файла csproj - это имя проекта

B. Я нашел альтернативу с помощью макроса предварительной сборки $(ProjectDir) и получил доступ к результату в коде здесь: Какой простой способ получить доступ к макросам предварительной сборки, таким как $ (SolutionDir) и $ (DevEnvDir) из кода в C #?

0 голосов
/ 09 февраля 2012

Вы должны будете использовать StackTrace Class для этого.В классе StackTrace есть метод GetFrame, который даст вам имя вызывающего метода.Это вернет класс MethodBase объект, который имеет свойство DeclaringType.Используя эту информацию о типе, вы также можете получить детали сборки.

private void YouCalledMethod()
{
    StackTrace stackTrace = new StackTrace();
    StackFrame stackFrame = stackTrace.GetFrame(1);
    Assembly assembly = stackFrame.GetMethod().DeclaringType.Assembly;
    //use this assembly object for your requirement.
}

Посмотрите на это Как напечатать текущую трассировку стека в .NET без каких-либо исключений? вопрос также.

0 голосов
/ 09 февраля 2012

Если я понимаю ваш вопрос напрямую, это невозможно сделать в коде.Единственный способ сделать это - статический анализ кода.

Resharper имеет такую ​​возможность - чтобы узнать, где используется определенный класс / метод / свойство, вы можете щелкнуть правой кнопкойдекларации и выберите « Find Usages ».Это очень удобная функция:)

Но это известно только из кода, вызывающего ваш метод (в том же решении).Это не будет работать, когда третьи лица будут использовать вашу библиотеку.

Чего именно вы здесь добиваетесь?Если ваш метод должен идентифицировать вызывающих абонентов, вы должны добавить это как требование (т.е. добавить параметр, содержащий идентификационные данные вызывающего абонента).

public void MyMethod()
{
    // I need name of caller project, but how?
}

public void MyMethod(String callerProject)
{
    // People who call this method know the name of their own project :)
}
...