调试模式与发布模式 - IsJITOptimizerDisabled 属性

3
我刚刚查看了关于这个主题的以前的问题,但是我得到了一些奇怪的结果。
首先,我遵循并使用了Scott Hanselman在他的博客中提出的方法:http://www.hanselman.com/blog/HowToProgrammaticallyDetectIfAnAssemblyIsCompiledInDebugOrReleaseMode.aspx 因此,使用IsJITOptimizerDisabled,我应该检查特定的DLL是在发布模式还是调试模式下编译的。
奇怪的是,我刚刚尝试了它,构建了一个简单的应用程序来检查那个属性,并通知被检查的程序集是在调试模式还是发布模式下。检查结果与我已经编译成两种模式的两个dll一切正常。
然后我把这个简单的应用程序传递给同事,并确认在他的工作站上结果符合预期,调试dll显示“调试”,发布显示“发布”(这两个dll包含在同一个压缩包中)。

然而,当他尝试在另一台服务器上(通过mstsc)使用简单的应用程序检查那些dll时,对于这两个dll,简单的应用程序显示“Debug”(即使使用ILDASM打开DLL时一切都正常,并且某些特定方法包含在“#if DEBUG”区域中不会出现在Relase dll中)。

现在,我疯了,这个问题背后是否有原因?我是不是太老了看不清发生了什么?反射是否在环境中有一些依赖关系?是否有一些服务包解决了类似的已知问题?

干杯,

Gianluca


你是比较了完全相同的二进制文件,还是在另一台机器上重新编译了它们? - Dirk Vollmar
同一个 DLL 已经被复制到简单应用程序中,没有重新编译!这就是我疯了的原因! :) - grava
2个回答

1

DebuggableAttribute 是一个属性,它不会被编译进可执行程序集中的 IL 代码中。它是在装载程序集时由运行时插入的。该属性的创建可能会受到环境设置的影响。

例如,系统上启用了分析器可能会创建影响调试标志的环境变量或注册表设置。MSDN 论坛上的一篇帖子 建议检查名为 COR_* 的环境变量或位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework(以及可能还有 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework)下的注册表设置。


1

在这种情况下,使用Assembly.LoadFrom()不是一个很好的选择。使用fuslogvw.exe查找为什么程序加载了错误的程序集。可能是GAC的问题。

无论如何,在这里应该调用LoadFile()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接