2010-08-23 62 views
3

我刚才看了一下关于主题的以前的问题,但我有一些奇怪的结果。调试模式与释放模式 - IsJITOptimizerDisabled属性

首先,我也跟着用,斯科特Hanselman的在旧的文章在他的博客中提出的方法:http://www.hanselman.com/blog/HowToProgrammaticallyDetectIfAnAssemblyIsCompiledInDebugOrReleaseMode.aspx

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

奇怪的是,我只是试了一下,构建了一个简单的应用程序,检查该属性,并通知被检查的程序集处于调试或发布模式。检查结果和一切都可以对两个我已经在两种模式下编译的DLL。

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

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

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

干杯,

詹卢卡

+0

你比较完全相同的二进制文件还是在另一台机器上重新编译? – 2010-08-23 14:27:24

+0

使用简单的应用程序复制了相同的DLL,无需重新编译!这是我疯了的原因! :) – grava 2010-08-23 14:39:53

回答

1

DebuggableAttribute是未编译成包含在可执行程序集IL代码的属性。它在加载程序集时由运行时插入。属性的创建可能受环境设置的影响。

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

1

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

Anyhoo,这里调用LoadFile()。