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

发布于 2025-01-04 06:33:27 字数 224 浏览 2 评论 0原文

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

我尝试使用 Reflection:

System.Reflection.Assembly.GetExecutingAssembly()

和 with

GetCallingAssembly

但它不起作用。

I'm making a class library project in C#. How to get the name of the project which will call the method from my class library?

I tried with Reflection:

System.Reflection.Assembly.GetExecutingAssembly()

and with

GetCallingAssembly

but it didn't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

九八野马 2025-01-11 06:33:27

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

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

  1. 根据从 StackFrame 找到的文件名(路径),迭代每个父文件夹。
  2. 查找任何带有 *.csproj 的文件 (C#)
  3. 可选择打开 csproj 文件以确保包含当前文件
  4. csproj 的文件名为项目名称

B。我通过使用预构建宏 $(ProjectDir) 找到了替代方案,并在此处的代码中访问结果:访问预构建宏的简单方法是什么例如 C# 代码中的 $(SolutionDir) 和 $(DevEnvDir)?

I am looking for this also. File name I can get from StackFrame just like the answer by @Maheep but to get project name is not really straight forward.

A. I just got a simple solution:

  1. Based on the FileName (path) found from StackFrame, iterate for each parent folder.
  2. Find any file with *.csproj (C#)
  3. Optionally open csproj file to ensure the current file <Compile Include="Folder\File.cs" /> is included
  4. The file name of csproj is the project name

B. I found alternative by using pre-build macro $(ProjectDir) and access the result in code here: What's an easy way to access prebuild macros such as $(SolutionDir) and $(DevEnvDir) from code in C#?

聽兲甴掵 2025-01-11 06:33:27

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

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

If I understand your question directly, this is not possible to do in code. The only way to do this is with static analysis of the code.

Resharper has this ability - To find out where a particular class/method/property is used, you can right click on the declaration and select "Find Usages". This is a very handy feature :)

But that only works of the code calling your method is known (in the same solution). It wont work when third parties consume your library.

What exactly are you trying to achieve here? If your method needs to identify callers, you should add this as a requirement (ie add a parameter containing the caller identity).

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 :)
}
荒芜了季节 2025-01-11 06:33:27

为此,您必须使用 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 中的堆栈跟踪没有任何例外吗? 问题也是如此。

You will have to use StackTrace Class for this. StackTrace class has GetFrame method which will give you calling method name. This will return MethodBase class object which has property DeclaringType. Using this type information you can get assembly details as well.

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

Look at this How to print the current Stack Trace in .NET without any exception? question also.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文