C#-Get调用方法';什么是装配?
在C#中是否有方法获取调用方法的程序集?(不是当前的方法。) i、 我想要执行的程序集,在调用堆栈的上面。试试这个C#-Get调用方法';什么是装配?,c#,.net,reflection,C#,.net,Reflection,在C#中是否有方法获取调用方法的程序集?(不是当前的方法。) i、 我想要执行的程序集,在调用堆栈的上面。试试这个 Assembly.GetCallingAssembly(); 这个怎么样: StackTrace stackTrace = new StackTrace(); // get call stack var assembly = stackTrace.GetFrame(0).GetMethod().DeclaringType.Assembly; 在的帮助下,不
Assembly.GetCallingAssembly();
这个怎么样:
StackTrace stackTrace = new StackTrace(); // get call stack
var assembly = stackTrace.GetFrame(0).GetMethod().DeclaringType.Assembly;
在的帮助下,不可能可靠地了解是谁在呼叫您。一些人无疑会建议堆栈遍历,但由于JIT内联,这是不可靠的。无法可靠地获取调用您的方法的方法/程序集 这就是我使用的:
var stackFrames = new StackTrace().GetFrames();
if(stackFrames==null) return null;
var executingAssembly = Assembly.GetExecutingAssembly();
foreach (var frame in stackFrames)
{
var assembly = frame.GetMethod().DeclaringType.Assembly;
if (assembly != executingAssembly)
{
return assembly;
}
}
return null;
编写此代码是为了获取调用程序集的AssemblyInfo.cs属性——因此使用“GetAssembly(int stackTraceLevel)”方法执行所需操作 所有这些都在我的博客上 享受
//
///从AssemblyInfo.cs文件中获取上一个程序集的值
///
///
///AssemblyInfoCalling assembly=新建AssemblyInfoCalling();
///字符串company1=assembly.Company;
///字符串product1=assembly.Product;
///字符串版权1=程序集。版权;
///字符串trademark1=assembly.Trademark;
///字符串title1=assembly.Title;
///string description1=程序集。说明;
///字符串配置1=assembly.Configuration;
///字符串fileversion1=assembly.FileVersion;
///version1=程序集。版本;
///字符串versionFull1=assembly.VersionFull;
///字符串versionMajor1=assembly.VersionMajor;
///字符串versionMinor1=assembly.VersionMinor;
///字符串versionBuild1=assembly.VersionBuild;
///字符串versionRevision1=assembly.VersionRevision;
///
公共类调用
{
///
///初始化类的新实例。
///
///获取正确程序集所需的跟踪级别
///-需要根据您在项目中放置这些类的位置进行调整。
公共程序集信息调用(int-traceLevel=4)
{
//----------------------------------------------------------------------
//默认值为“3”,作为返回堆栈跟踪以获取
//“调用”程序集的正确程序集
//----------------------------------------------------------------------
StackTraceLevel=traceLevel;
}
//----------------------------------------------------------------------
//标准程序集属性
//----------------------------------------------------------------------
公共字符串公司{get{return GetCallingAssemblyAttribute(a=>a.Company);}
公共字符串产品{get{return GetCallingAssemblyAttribute(a=>a.Product);}
公共字符串版权{get{return GetCallingAssemblyAttribute(a=>a.Copyright);}
公共字符串商标{get{return GetCallingAssemblyAttribute(a=>a.Trademark);}
公共字符串标题{get{return GetCallingAssemblyAttribute(a=>a.Title);}
公共字符串描述{get{return GetCallingAssemblyAttribute(a=>a.Description);}
公共字符串配置{get{return GetCallingAssemblyAttribute(a=>a.Description);}
公共字符串文件版本{get{return GetCallingAssemblyAttribute(a=>a.Version);}
//----------------------------------------------------------------------
//版本属性
//----------------------------------------------------------------------
公共静态版本
{
得到
{
//----------------------------------------------------------------------
//获取程序集,如果为null,则返回空
//----------------------------------------------------------------------
Assembly Assembly=GetAssembly(StackTraceLevel);
返回assembly==null?新版本():assembly.GetName().Version;
}
}
公共字符串VersionFull{get{return Version.ToString();}}
公共字符串VersionMajor{get{return Version.Major.ToString();}
公共字符串VersionMinor{get{返回Version.Minor.ToString();}
公共字符串VersionBuild{get{返回Version.Build.ToString();}
公共字符串VersionRevision{get{返回Version.Revision.ToString();}
//----------------------------------------------------------------------
//设置我们在堆栈跟踪中查找的深度-允许自定义更改
//----------------------------------------------------------------------
公共静态int StackTraceLevel{get;set;}
//----------------------------------------------------------------------
//自定义属性
//----------------------------------------------------------------------
公共字符串位置
{
得到
{
尝试
{
返回GetCallingAssemblyAttribute(a=>a.Value);
}
捕获(NullReferenceException)
{
返回字符串。空;
}
}
}
///
///获取调用程序集属性。
///
///
///价值。
///返回GetCallingAssemblyAttributesAssemblyCompanyAttribute(a=>a.Company);
///
私有字符串GetCallingAssemblyAttribute(Func值),其中T:Attribute
{
//----------------------------------------------------------------------
//获取程序集,如果为null,则返回空
//----------------------------------------------------------------------
Assembly Assembly=GetAssembly(StackTraceLevel);
if(assembly==null)返回字符串.Empty;
//----------------------------------------------------------------------
//获取属性值
//----------------------------------------------------------------------
T attribute=(T)attribute.GetCustomAttribute(assembly,typeof(T));
返回值.Invoke(属性);
}
///
///遍历堆栈并获取程序集
///
///堆栈跟踪级别。
///
普里瓦
/// <summary>
/// Gets the values from the AssemblyInfo.cs file for the previous assembly
/// </summary>
/// <example>
/// AssemblyInfoCalling assembly = new AssemblyInfoCalling();
/// string company1 = assembly.Company;
/// string product1 = assembly.Product;
/// string copyright1 = assembly.Copyright;
/// string trademark1 = assembly.Trademark;
/// string title1 = assembly.Title;
/// string description1 = assembly.Description;
/// string configuration1 = assembly.Configuration;
/// string fileversion1 = assembly.FileVersion;
/// Version version1 = assembly.Version;
/// string versionFull1 = assembly.VersionFull;
/// string versionMajor1 = assembly.VersionMajor;
/// string versionMinor1 = assembly.VersionMinor;
/// string versionBuild1 = assembly.VersionBuild;
/// string versionRevision1 = assembly.VersionRevision;
/// </example>
public class AssemblyInfoCalling
{
/// <summary>
/// Initializes a new instance of the <see cref="AssemblyInfoCalling"/> class.
/// </summary>
/// <param name="traceLevel">The trace level needed to get correct assembly
/// - will need to adjust based on where you put these classes in your project(s).</param>
public AssemblyInfoCalling(int traceLevel = 4)
{
//----------------------------------------------------------------------
// Default to "3" as the number of levels back in the stack trace to get the
// correct assembly for "calling" assembly
//----------------------------------------------------------------------
StackTraceLevel = traceLevel;
}
//----------------------------------------------------------------------
// Standard assembly attributes
//----------------------------------------------------------------------
public string Company { get { return GetCallingAssemblyAttribute<AssemblyCompanyAttribute>(a => a.Company); } }
public string Product { get { return GetCallingAssemblyAttribute<AssemblyProductAttribute>(a => a.Product); } }
public string Copyright { get { return GetCallingAssemblyAttribute<AssemblyCopyrightAttribute>(a => a.Copyright); } }
public string Trademark { get { return GetCallingAssemblyAttribute<AssemblyTrademarkAttribute>(a => a.Trademark); } }
public string Title { get { return GetCallingAssemblyAttribute<AssemblyTitleAttribute>(a => a.Title); } }
public string Description { get { return GetCallingAssemblyAttribute<AssemblyDescriptionAttribute>(a => a.Description); } }
public string Configuration { get { return GetCallingAssemblyAttribute<AssemblyDescriptionAttribute>(a => a.Description); } }
public string FileVersion { get { return GetCallingAssemblyAttribute<AssemblyFileVersionAttribute>(a => a.Version); } }
//----------------------------------------------------------------------
// Version attributes
//----------------------------------------------------------------------
public static Version Version
{
get
{
//----------------------------------------------------------------------
// Get the assembly, return empty if null
//----------------------------------------------------------------------
Assembly assembly = GetAssembly(StackTraceLevel);
return assembly == null ? new Version() : assembly.GetName().Version;
}
}
public string VersionFull { get { return Version.ToString(); } }
public string VersionMajor { get { return Version.Major.ToString(); } }
public string VersionMinor { get { return Version.Minor.ToString(); } }
public string VersionBuild { get { return Version.Build.ToString(); } }
public string VersionRevision { get { return Version.Revision.ToString(); } }
//----------------------------------------------------------------------
// Set how deep in the stack trace we're looking - allows for customized changes
//----------------------------------------------------------------------
public static int StackTraceLevel { get; set; }
//----------------------------------------------------------------------
// Custom Attributes
//----------------------------------------------------------------------
public string Location
{
get
{
try
{
return GetCallingAssemblyAttribute<AssemblyLocationAttribute>(a => a.Value);
}
catch (NullReferenceException)
{
return string.Empty;
}
}
}
/// <summary>
/// Gets the calling assembly attribute.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value.</param>
/// <example>return GetCallingAssemblyAttribute<AssemblyCompanyAttribute>(a => a.Company);</example>
/// <returns></returns>
private string GetCallingAssemblyAttribute<T>(Func<T, string> value) where T : Attribute
{
//----------------------------------------------------------------------
// Get the assembly, return empty if null
//----------------------------------------------------------------------
Assembly assembly = GetAssembly(StackTraceLevel);
if (assembly == null) return string.Empty;
//----------------------------------------------------------------------
// Get the attribute value
//----------------------------------------------------------------------
T attribute = (T) Attribute.GetCustomAttribute(assembly, typeof (T));
return value.Invoke(attribute);
}
/// <summary>
/// Go through the stack and gets the assembly
/// </summary>
/// <param name="stackTraceLevel">The stack trace level.</param>
/// <returns></returns>
private static Assembly GetAssembly(int stackTraceLevel)
{
//----------------------------------------------------------------------
// Get the stack frame, returning null if none
//----------------------------------------------------------------------
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
if (stackFrames == null) return null;
//----------------------------------------------------------------------
// Get the declaring type from the associated stack frame, returning null if nonw
//----------------------------------------------------------------------
var declaringType = stackFrames[stackTraceLevel].GetMethod().DeclaringType;
if (declaringType == null) return null;
//----------------------------------------------------------------------
// Return the assembly
//----------------------------------------------------------------------
var assembly = declaringType.Assembly;
return assembly;
}
}