C# - 获取调用方法的程序集?

Dav*_*fer 35 .net c# reflection

在C#中有没有办法获得调用方法的程序集?(不是当前的方法.)

即我想要执行程序集,一个在调用堆栈中.

Ste*_*cya 49

试试这个

Assembly.GetCallingAssembly();
Run Code Online (Sandbox Code Playgroud)

  • 错误 - 这将为您提供调用方法的程序集,而不是当前方法.GetExecutingAssembly为您提供当前方法的程序集.Stecya是对的. (12认同)
  • 然后不要让它被内联:)`[MethodImplAttribute(MethodImplOptions.NoInlining)]` (9认同)
  • 内联可以使其不可靠 - 请参阅http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getcallingassembly.aspx中的备注部分. (7认同)
  • 还要注意尾调用.A**[尾调用](https://en.wikipedia.org/wiki/Tail_call)**例如`return Assembly.GetCallingAssembly();` - 也可能由编译器优化,因此返回意外的结果.只有通过避免使用return语句调用函数"内联",才能通过属性阻止尾调用优化. (2认同)

RQD*_*QDQ 9

这个怎么样:

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

var assembly = stackFrames[1].GetMethod().DeclaringType.Assembly;
Run Code Online (Sandbox Code Playgroud)

http://www.csharp-examples.net/reflection-callstack/的帮助下

  • 这将在 JIT 内联方法时中断。 (2认同)

Sam*_*ill 6

这是我使用的:

        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;
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 5

不,不可能可靠地了解谁在给您打电话。毫无疑问,有些人会建议进行堆栈遍历,但是由于JIT内联,这是不可靠的。根本没有办法可靠地获取正在调用您的方法的方法/程序集。

  • 正如Stecya先前向我指出的,Assembly.GetCallingAssembly()呢? (4认同)