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 字节。
希望对大家有所帮助!
我正面临一些奇怪的行为,试图在某些日志记录 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 字节。
希望对大家有所帮助!