webdevqa.jp.net

.NETアプリケーションがDEBUGモードまたはRELEASEモードでコンパイルされたかどうかを確認するにはどうすればよいですか?

コンピューターにアプリケーションがインストールされています。 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
45
Alex

blogged これはずっと前のことで、それがまだ有効かどうかはわかりませんが、コードは次のようなものです...

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;
}
29
ZombieSheep

ゾンビシープの答えは正しくありません。

この重複した質問に対する私の答えはここにあります: 。NETアプリケーションがデバッグモードまたはリリースモードでコンパイルされたかどうかを確認する方法

十分に注意してください-'Debuggable'属性が存在するかどうかについて、アセンブリマニフェストの 'Assembly属性'を確認するだけです[〜#〜]ない[〜#〜]は、JIT最適化されていないアセンブリがあることを意味します。アセンブリはJIT最適化できますが、詳細ビルド設定の下にアセンブリ出力があり、「完全」または「pdbのみ」の情報が含まれます。この場合、「デバッグ可能」属性が存在します。

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

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

exaclty "Debug"と "Release"の意味を定義する必要もあります...

  • アプリケーションがコード最適化で構成されているということですか?
  • Visual Studio/JITデバッガーを接続できるということですか?
  • DebugOutputが生成されるということですか?
  • それはDEBUG定数を定義しているということですか? System.Diagnostics.Conditional()属性を使用して、条件付きでメソッドをコンパイルできることに注意してください。
26
Dave Black

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

[Assembly: Debuggable(...)]
9
Joe Basirico

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

2
flipdoubt

これは、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が指摘したように、別のアプローチが必要になる状況があるかもしれません。
多分あなたもデイブブラックの答えを見てみることができます:

2
Max