从CallerFilePathAttribute中查找程序集名称



我有一个类

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'中。

我有一个NLogging类,我们在其中记录所有活动。这个类包含一个方法

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方法的程序集名称。

如何从CallerFilePathAttribute中找到程序集名称?

对于调用者信息属性,这是不可能的。Roslyn 的积压工作中有一个关于更多呼叫者信息属性的功能请求

目前唯一的方法是使用反射:

//get assembly of caller
var assembly = new StackTrace().GetFrame(1, false).GetMethod().DeclaringType.Assembly;

这在.NET标准(.NET Core)中是不可能的。它应该在Netstandard 2.0 中

编辑:@Eilon是对的。这不是一个可靠的方法。添加[MethodImpl(MethodImplOptions.NoInlining)]有很大帮助,但不能保证

编辑2:另一种可靠的方法(更复杂)是编写/使用Fody插件。参见Fody网站

最新更新