C# 从CallerFilePathAttribute查找程序集名称
我有一节课C# 从CallerFilePathAttribute查找程序集名称,c#,.net,nlog,C#,.net,Nlog,我有一节课 public class DataLayerFromOutside { public string DataLayerMethod(string dataLayerMethodParameter) { NLogging.Info("FromMethod"); return "Hi"; } } 此类位于SampleClassLibrary中。 我有一个从中调用此方法的控制器 [LogActionFilter] public cl
public class DataLayerFromOutside
{
public string DataLayerMethod(string dataLayerMethodParameter)
{
NLogging.Info("FromMethod");
return "Hi";
}
}
此类位于SampleClassLibrary
中。
我有一个从中调用此方法的控制器
[LogActionFilter]
public class SampleController : ApiController
{
// GET api/sample
public string Get()
{
DataLayerFromOutside businessLayer = new DataLayerFromOutside();
NLogging.Info("Info ");
return businessLayer.DataLayerMethod("Hi");
}
此控制器位于另一个dll'TestLoggingEntryAndExit'
中
我有一个nloging
类,我们在其中记录所有活动。这个类包含一个方法
public static void Info(string message, Exception exception = null, [CallerFilePathAttribute] string callerPath = "", [CallerMemberName] string callerMember = "", [CallerLineNumber] int callerLine = 0)
{
Log(LogLevel.Info, message,null, exception, callerPath, callerMember, callerLine);
}
我想找到调用此Info方法的程序集名称
[LogActionFilter]
public class SampleController : ApiController
{
// GET api/sample
public string Get()
{
DataLayerFromOutside businessLayer = new DataLayerFromOutside();
NLogging.Info("Info ");
return businessLayer.DataLayerMethod("Hi");
}
如何从
CallerFilePathAttribute
中找到程序集名称 这在调用方信息属性中是不可能的。有
目前唯一的方法是使用反射:
//获取调用程序的程序集
var assembly=new StackTrace().GetFrame(1,false).GetMethod().DeclaringType.assembly;
这在.NET标准(.NET内核)中还不可能实现。它应该在netstandard2.0中
编辑:@Eilon是对的。这不是一个可靠的方法。添加[MethodImpl(MethodImplOptions.noinline)]
帮助很大,但不能保证
编辑2:另一种可靠的方法(更复杂的方法)是编写/使用Fody插件。请参见在一般情况下,无法从CallerFilePathAttribute获取程序集名称。它只是编译时文件的完整路径。它甚至可能在路径中的任何位置都不包含程序集的名称。您必须使用类似StackTrace的类来获取调用方的程序集名称。使用StackFrame不可靠,因为某些调用堆栈可以在系统外进行优化,所以请小心。了解调用者程序集的唯一可靠方法是让他们实际传入(如果您相信他们会正确地传递!)。当然,由于其他限制,这并不总是一个选项。