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

StackOverflow https://stackoverflow.com/questions/2186613

質問

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

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

役に立ちましたか?

解決

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

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

他のヒント

それが大好きでした デビッド 提案ですが、この方法で行くこともできます(AssemblyInfo.cs):

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

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

それがあなたのアセンブリである場合、私は使用すると信じています アセンブリ構成 属性が最良のアプローチです。これは、「アセンブリのリテールまたはデバッグなどのビルド構成を指定する」として文書化されています。

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

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

次に、アセンブリ属性を確認します。

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

(Rさんは知っています。Rubens Farias での Schreurs のコメントでも同じことが述べられていますが、コメントを見る前にこの情報を他の場所で見つけたので、これにはコメントではなく完全な応答などのより重要なエントリが必要だと思います)

あなたはリフレクターがインストールされている場合、あなたはまた、デバッグ属性の集合体と表情をクリックすることができます。:逆アセンブラのペインで([アセンブリデバッグ可能()])

DEBUGシンボルが(プロパティフォルダ下)AssemblyInfo.csに以下のコードように、デバッグ構成で定義されたデフォルトで、のみデバッグおよびリリース構成を仮定する。

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

私はそれが私のWindows 7のファイルエクスプローラのプロパティに表示されますようAssemblyDescription上AssemblyTitleを使用します:

ダビデとsteviegの答えのように、ここではC#で書かれたLINQPadスクリプトである人のために

。スクリプトを使用するには、 LINQPad 5 にダウンロードして示すように、C#のプログラムが選択されていることを確認する必要があります下のスクリーンショットインチ

単に、検査対象のDLLを含むフォルダにポイントにDLL_FOLDER_PATHを置き換えます。

// 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;
        }
    }
}

LINQPAD 5は、ダウンロードしたここをすることができます。

のVisual Studioを経て生産を展開しないでください。スクリプト継続的インテグレーションとに見て、このような<のhref = "HTTPと同様に(ビルドします:// nant.sourceforge.net/」のrel = "nofollowをnoreferrer"> NAntのに、など、より読みやすいおそらく何か<のhref = "http://fsharp.github.io/FAKE/" のrel = "nofollowをnoreferrer" > FAKE の)ます。

F5キーがビルドプロセスではありません

この質問に答えていないと信じて中傷に、OPは書いてます:

  

...私はあることを行っているすべてのアセンブリことを保証する必要があります   展開は、リリース構成を使用して構築された。

への保証のようにチームシティーのようビルドサーバーを使用する、ということおそらくタコ展開のようなリリース管理ツール。その開発者が公式のビルドプロセスを経なければならないので、本番システムをロックダウンします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top