45

コンピューターにアプリケーションがインストールされています。DEBUG モードでコンパイルされたかどうかを確認するにはどうすればよいですか?

.NET Reflectorを使用しようとしましたが、具体的なものは何も表示されません。ここに私が見るものがあります:

// Assembly APPLICATION_NAME, Version 8.0.0.15072
Location: C:\APPLICATION_FOLDER\APPLICATION_NAME.exe
Name: APPLICATION_NAME, Version=8.0.0.15072, Culture=neutral, PublicKeyToken=null
Type: Windows Application
4

5 に答える 5

29

これはずっと前にブログに書いたもので、まだ有効かどうかはわかりませんが、コードは次のようなものです...

private void testfile(string file)
{
    if(isAssemblyDebugBuild(file))
    {
        MessageBox.Show(String.Format("{0} seems to be a debug build",file));
    }
    else
    {
        MessageBox.Show(String.Format("{0} seems to be a release build",file));
    }
}    

private bool isAssemblyDebugBuild(string filename)
{
    return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));    
}    

private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb)
{
    bool retVal = false;
    foreach(object att in assemb.GetCustomAttributes(false))
    {
        if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute"))
        {
            retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled;
        }
    }
    return retVal;
}
于 2008-10-11T20:53:32.773 に答える
26

ZombieSheep の答えは正しくありません。

この重複した質問に対する私の答えは次のとおりです。.NET アプリケーションが DEBUG モードまたは RELEASE モードでコンパイルされたかどうかを確認する方法は?

非常に注意してください。アセンブリ マニフェストの「アセンブリ属性」を調べて「デバッグ可能」属性が存在するかどうかを確認しても、アセンブリが JIT 最適化されていないことを意味するわけではありません。アセンブリは JIT で最適化されている可能性がありますが、[高度なビルド] 設定の下のアセンブリ出力が「完全」または「pdb のみ」の情報を含むように設定されています。この場合、「Debuggable」属性が存在します。

詳細については、以下の私の投稿を参照してください: アセンブリがデバッグまたはリリースあるかどうかを確認する方法と、DLL がデバッグまたはリリース ビルドであるかどうかを識別する方法 (.NET)

Jeff Key のアプリケーションは、DebuggableAttribute が存在するかどうかに基づいて「デバッグ」ビルドを識別するため、正しく動作しません。Release モードでコンパイルし、DebugOutput を「none」以外に選択した場合、DebuggableAttribute が存在します。

また、「デバッグ」と「リリース」の意味を正確に定義する必要があります...

  • アプリケーションがコード最適化で構成されているということですか?
  • Visual Studio/JIT Debugger をアタッチできるということですか?
  • DebugOutputを生成するということですか?
  • DEBUG定数を定義しているということですか?System.Diagnostics.Conditional()属性を使用してメソッドを条件付きでコンパイルできることに注意してください。
于 2011-03-15T18:42:29.853 に答える
8

あなたは実際に正しい道を進んでいます。リフレクターの [逆アセンブラー] ウィンドウを見ると、デバッグ モードでビルドされている場合は次の行が表示されます。

[assembly: Debuggable(...)]
于 2008-10-11T20:59:21.483 に答える
2

これは、ZombieSheep によって提案されたソリューションの VB.Net バージョンです。

Public Shared Function IsDebug(Assem As [Assembly]) As Boolean
    For Each attrib In Assem.GetCustomAttributes(False)
        If TypeOf attrib Is System.Diagnostics.DebuggableAttribute Then
            Return DirectCast(attrib, System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled
        End If
    Next

    Return False
End Function

Public Shared Function IsThisAssemblyDebug() As Boolean
    Return IsDebug([Assembly].GetCallingAssembly)
End Function

更新
このソリューションは私にとってはうまくいきますが、Dave Black が指摘したように、別のアプローチが必要な場合があります。
Dave Black の回答もご覧ください。

于 2013-01-04T15:34:15.277 に答える
2

Jeff Key のIsDebugユーティリティを使用するのはどうですか? 少し古いですが、Reflector があるので、フレームワークのどのバージョンでも逆コンパイルして再コンパイルできます。やった。

于 2009-03-12T11:34:11.407 に答える