web-dev-qa-db-ja.com

アセンブリがデバッグまたはリリース構成を使用してビルドされたかどうかを確認するにはどうすればよいですか?

Webアプリケーションの展開を開始しています。展開されるすべてのアセンブリがリリース構成を使用して構築されていることを保証する必要があります。私たちのシステムはC#/。Net 3.5を使用して開発されました。

これを達成する方法はありますか?

44
born to hula

チェック this 。アイデアは、Assembly.GetCustomAttributes()を使用してアセンブリ属性のリストを取得し、DebuggableAttributeを検索して、そのような属性にIsJITTrackingEnabledプロパティが設定されているかどうかを確認することです。

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return Assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }
41
David

私はそれが好きだった David 提案、しかしあなたはこのように行くこともできる(AssemblyInfo.cs):

#if DEBUG
[Assembly: AssemblyDescription("Your application Assembly (DEBUG version)")]
#else if RELEASE
[Assembly: AssemblyDescription("Your application Assembly (RELEASE version)")]
#endif

誰でもそのアセンブリを右クリックしてPropertiesを選択し、Detailsタブに移動できるため、これはより人間に優しいものです。

28
Rubens Farias

それがあなたのアセンブリである場合、 AssemblyConfiguration 属性を使用するのが最善の方法だと思います。それは「アセンブリのリテールやデバッグなどのビルド構成を指定する」として文書化されています。

ビルド構成によっては、次のようなコードが含まれる場合があります。

#if DEBUG
[Assembly: AssemblyConfiguration("Debug")]
#else
[Assembly: AssemblyConfiguration("Release")]
#endif

次に、Assembly属性を確認します。

public static bool IsAssemblyConfiguration(Assembly assembly, string configuration)
{
    var attributes = Assembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
    if (attributes.Length == 1)
    {
        var assemblyConfiguration = attributes[0] as AssemblyConfigurationAttribute;
        if (assemblyConfiguration != null)
        {
            return assemblyConfiguration.Configuration.Equals(configuration, StringComparison.InvariantCultureIgnoreCase);
        }
    }
    return true;
}

(Rubens FariasのR. Schreursのコメントも同じだと知っていますが、コメントを見る前にどこかでこの情報を見つけたので、コメントの代わりに完全な応答のようなより重要なエントリが必要だと思います)

7

Reflectorがインストールされている場合は、アセンブリをクリックして、逆アセンブラペインでデバッグ可能な属性([アセンブリ:Debuggable()])を探すこともできます。

2
xr280xr

デバッグおよびリリース構成のみを想定すると、デフォルトではデバッグシンボルがデバッグ構成で定義されるため、以下のコードはAssemblyInfo.cs(Propertiesフォルダーの下)にあります。

#if DEBUG
[Assembly: AssemblyTitle("Debug")]
#else
[Assembly: AssemblyTitle("Release")]
#endif

Windows 7のファイルエクスプローラーのプロパティに表示されるので、AssemblyDescriptionではなくAssemblyTitleを使用します。

DLL File properties

Davidとsteviegの答えが好きな人のために、C#で記述されたLINQPadスクリプトを次に示します。このスクリプトを使用するには、 LINQPad 5 をダウンロードし、下のスクリーンショットに示すようにC#プログラムが選択されていることを確認する必要があります。

DLL_FOLDER_PATHを置き換えるだけで、検査するDLLを含むフォルダーを指すことができます。

// TODO - Specify your folder containing DLLs to inspect
static string DLL_FOLDER_PATH = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0";
void Main()
{
    (from dllPath in Directory.GetFiles(DLL_FOLDER_PATH, "*.dll")
    let Assembly = dllPath.SafeLoad()
    let build = Assembly == null ? "Error" : (dllPath.SafeLoad().IsAssemblyDebugBuild() ? "Debug" : "Release")
    select new {
        Assembly_Path = dllPath,
        Build = build,
    }).Dump();
}
static class Extensions {
    public static bool IsAssemblyDebugBuild(this Assembly assembly)
    {
        return Assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Select(da => da.IsJITTrackingEnabled).FirstOrDefault();
    }
    public static Assembly SafeLoad(this string path){
        try{
            return Assembly.LoadFrom(path);
        }
        catch {
            return null;
        }
    }
}

Checking release or debug build using LINQPad5

LINQPAD 5はダウンロードできます ここ

2
Chris Voon