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

时间:2010-08-23 13:39:37

标签: c# model compilation

我刚刚看过以前有关主题的问题,但我得到了一些奇怪的结果。

首先,我跟随并使用了Scott Hanselman在其博客中的一篇旧文章中提出的方法:http://www.hanselman.com/blog/HowToProgrammaticallyDetectIfAnAssemblyIsCompiledInDebugOrReleaseMode.aspx

因此,使用IsJITOptimizerDisabled我应该检查特定的DLL是否已在发布模式或调试模式下编译。

奇怪的是,我只是尝试了它,构建了一个简单的应用程序来检查该属性并通知被检查的程序集处于调试或处于释放模式。检查了结果以及我在两种模式下编译的两个dll都可以。

然后我将这个简单的应用程序传递给同事,确认在他的工作站中结果是预期的,Debug dll显示“Debug”,发布显示“Release”(这两个dll包含在同一个zip中简单的应用程序)。

但是,当他试图用另一台服务器(通过mstsc)检查那些dll时,这两个dll的简单应用程序显示“Debug”(即使用ILDASM打开DLL,一切似乎都很好,并且有些特定的方法)包含在“#if DEBUG”区域内的Relase dll中不存在。

现在,我生气了,这个问题背后有什么原因吗?我太老了,不知道发生了什么事吗?可能是某种依赖于环境的反思?是否有一些Service Pack解决了类似的已知问题?

干杯,

Gianluca

2 个答案:

答案 0 :(得分:1)

DebuggableAttribute是一个未编译到可执行程序集中包含的IL代码中的属性。加载程序集时,它将由运行时插入。环境设置可能会影响属性的创建。

例如,在系统上启用的分析器可能已创建影响调试标志的环境变量或注册表设置。 thread on the MSDN forums建议检查名为COR_*的环境变量或HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework下的注册表设置(以及可能HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework)。

答案 1 :(得分:1)

在这种特定情况下,使用Assembly.LoadFrom()不是一个好主意。使用fuslogvw.exe找出程序加载错误程序集的原因。 GAC,可能。

Anyhoo,LoadFile()在这里被调用。