Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从CallerFilePathAttribute查找程序集名称_C#_.net_Nlog - Fatal编程技术网

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不可靠,因为某些调用堆栈可以在系统外进行优化,所以请小心。了解调用者程序集的唯一可靠方法是让他们实际传入(如果您相信他们会正确地传递!)。当然,由于其他限制,这并不总是一个选项。