获取通过代码引用dll的项目名称

本文关键字:项目 dll 引用 代码 获取 | 更新日期: 2023-09-27 18:23:48

我正在用C#做一个类库项目。如何从我的类库中获取将调用该方法的项目的名称?

我尝试了反射:

System.Reflection.Assembly.GetExecutingAssembly()

GetCallingAssembly

但没有奏效。

获取通过代码引用dll的项目名称

我也在寻找这个。我可以从StackFrame中获得文件名,就像@Maheep的答案一样,但获得项目名称并不是很简单。

A。我只得到了一个简单的解决方案:

  1. 根据从StackFrame中找到的FileName(路径),对每个父文件夹进行迭代
  2. 使用*.csproj(C#)查找任何文件
  3. (可选)打开csproj文件以确保包含当前文件<Compile Include="Folder'File.cs" />
  4. csproj的文件名是项目名称

B。我通过使用预构建宏$(ProjectDir)找到了另一种选择,并在这里访问代码中的结果:从C#中的代码访问预构建宏(如$(SolutionDir)和$(DevEnvDir))有什么简单的方法?

如果我直接理解你的问题,这在代码中是不可能的。唯一的方法是对代码进行静态分析。

Resharper具有此功能-要查找特定类/方法/属性的使用位置,可以右键单击声明并选择"查找用法"。这是一个非常方便的功能:)

但只有调用方法的代码才能工作(在同一解决方案中)。当第三方使用你的图书馆时,它就不起作用了。

你到底想在这里实现什么?如果您的方法需要识别调用者,则应将其作为一项要求添加(即添加一个包含调用者标识的参数)。

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 :)
}

为此,您必须使用StackTrace类。StackTrace类具有GetFrame方法,该方法将为您提供调用方法的名称。这将返回具有属性DeclaringType的MethodBase类对象。使用此类型信息,您还可以获得程序集详细信息。

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中毫无例外地打印当前堆栈跟踪?还有一个问题。