【问题标题】:Get name of project from where dll is referenced via code获取通过代码引用 dll 的项目名称
【发布时间】:2012-02-09 09:20:13
【问题描述】:

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

我尝试了反射:

System.Reflection.Assembly.GetExecutingAssembly()

GetCallingAssembly

但是没有用。

【问题讨论】:

    标签: c# .net reflection .net-2.0 system.diagnostics


    【解决方案1】:

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

    A.我刚刚得到了一个简单的解决方案:

    1. 根据从StackFrame 找到的文件名(路径),迭代每个父文件夹。
    2. 使用 *.csproj (C#) 查找任何文件
    3. 可选择打开 csproj 文件以确保包含当前文件 <Compile Include="Folder\File.cs" />
    4. csproj的文件名就是工程名

    B.我通过使用预构建宏 $(ProjectDir) 找到了替代方法,并在此处访问代码中的结果:What's an easy way to access prebuild macros such as $(SolutionDir) and $(DevEnvDir) from code in C#?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • @Meheep 是的,您可以检查堆栈跟踪以找到调用“this”方法的方法的名称。在不知道 OP 试图实现什么的情况下,很难知道这是否能解决他的问题。我仍然认为,如果他的方法需要调用者身份,它应该将该要求作为参数放在方法签名的前面:)
      • 名称是 OP 要求的。
      • @Maheep 他说 project 的名称 - 这不会在堆栈跟踪中。我们需要知道 OP 想要做什么......
      【解决方案3】:

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

      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.
      }
      

      也看看这个How to print the current Stack Trace in .NET without any exception? 问题。

      【讨论】:

      • 是的,这将获得程序集名称 - 这不一定与 project 名称相同。 OP 需要提供更多关于他想要做什么的信息。
      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2013-03-25
      相关资源
      最近更新 更多