Release模式下的装配反射问题

Assembly reflection problem in Release mode

我正面临一些奇怪的行为,试图在某些日志记录 class 中获取父程序集(仅当它在 Release 模式下编译时)。

调试模式下,这非常有效:

StackFrame[] frames = new StackTrace().GetFrames();
var assemblies = (from f in frames
                  select f.GetMethod().ReflectedType.Assembly)
                  Distinct()
                  .Last();

示例: 程序集 A => 程序集 B => 方法

当我在调试模式下 运行 上面的脚本时,我得到 assembly A(如预期的那样)但是当它在发布模式下 运行s 我得到: mscorlib 代替。 但最奇怪的是,如果检查整个程序集堆栈 ,则没有一个程序集 A 的引用。这怎么可能?会发生什么?

PS: 程序集 A 是一个 webapp 项目。

我创建了一个名为 consoleA 的示例控制台应用程序和一个名为 classB 的 class 库。

它 return ConsoleA 在这两种情况下。 我认为你的问题是你的 A 应用程序是一个网络应用程序,当它有另一个服务 运行 时,在本例中是 IIS,它 return 托管你的 运行ning 服务应用程序(程序集 A)。

我能够解决这个问题。我认为这个问题与发布模式下的编译器行为有关。我认为它与方法内联有关(即使我不确定)。

我发现这个条件是为了禁止 JIT 能够内联方法(来自 here):

  • 大于 32 字节 IL 的方法将不会被内联。
  • 虚函数不是内联的。
  • 具有复杂流控制的方法将不会被内联。复杂流控是除if/then/else以外的任何流控;在这种情况下,switch 或 while。
  • 包含异常处理块的方法未被内联,但抛出异常的方法仍然是内联的候选者。
  • 如果方法的任何形式参数是结构,则不会内联该方法。

我尝试了上述所有建议,但唯一对我有用的是向我的方法添加一个参数(可选)以使其大于 32 字节。

希望对大家有所帮助!