【发布时间】:2012-02-09 09:20:13
【问题描述】:
我正在用 C# 制作一个类库项目。如何获取将从我的类库中调用方法的项目的名称?
我尝试了反射:
System.Reflection.Assembly.GetExecutingAssembly()
与
GetCallingAssembly
但是没有用。
【问题讨论】:
标签: c# .net reflection .net-2.0 system.diagnostics
我正在用 C# 制作一个类库项目。如何获取将从我的类库中调用方法的项目的名称?
我尝试了反射:
System.Reflection.Assembly.GetExecutingAssembly()
与
GetCallingAssembly
但是没有用。
【问题讨论】:
标签: c# .net reflection .net-2.0 system.diagnostics
我也在找这个。我可以从StackFrame 获得文件名,就像@Maheep 的答案一样,但要获得项目名称并不是很直接。
A.我刚刚得到了一个简单的解决方案:
StackFrame 找到的文件名(路径),迭代每个父文件夹。<Compile Include="Folder\File.cs" />
B.我通过使用预构建宏 $(ProjectDir) 找到了替代方法,并在此处访问代码中的结果:What's an easy way to access prebuild macros such as $(SolutionDir) and $(DevEnvDir) from code in C#?
【讨论】:
如果我直接理解您的问题,这在代码中是不可能的。做到这一点的唯一方法是对代码进行静态分析。
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 :)
}
【讨论】:
您必须为此使用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? 问题。
【讨论】: