【问题标题】:Debug Mode vs. Release Mode - IsJITOptimizerDisabled Property调试模式与发布模式 - IsJITOptimizerDisabled 属性
【发布时间】:2011-04-02 15:54:47
【问题描述】:

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

首先,我遵循并使用了 Scott Hanselman 在他的博客中的一篇旧帖子中提出的方法:http://www.hanselman.com/blog/HowToProgrammaticallyDetectIfAnAssemblyIsCompiledInDebugOrReleaseMode.aspx

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

奇怪的是,我刚刚尝试过,构建了一个简单的应用程序来检查该属性并通知检查的程序集处于调试或发布模式。对照我已经在两种模式下编译的两个 dll 检查了结果和一切正常。

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

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

现在,我要疯了,这个问题背后有什么原因吗?我是不是太老了,看不到发生了什么?反射会以某种方式依赖于环境吗?是否有一些服务包可以解决类似的已知问题?

干杯,

詹卢卡

【问题讨论】:

  • 您是比较完全相同的二进制文件还是在另一台机器上重新编译?
  • 同一个DLL已经用简单的应用程序复制了,无需重新编译!这就是我要发疯的原因! :)

标签: c# model compilation


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Anyhoo,这里调用了 LoadFile()。

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多