كيفية التحقق مما إذا تم بناء مجموعة باستخدام تصحيح أو تكوين الإصدار؟

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

سؤال

أبدأ نشر تطبيق الويب الخاص بي وأحتاج إلى ضمان أن جميع التجميعات التي سيتم نشرها تم تصميمها باستخدام تكوين الإصدار. تم تطوير نظامنا باستخدام 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. Schreurs في Rubens Farias يقول الشيء نفسه ، لكنني أجد هذه المعلومات في مكان آخر قبل رؤية التعليق ، لذلك أعتقد أن هذا يتطلب إدخالًا أكثر أهمية مثل استجابة كاملة بدلاً من التعليق)

إذا قمت بتثبيت عاكس ، فيمكنك أيضًا النقر على التجميع والبحث عن السمة القابلة للتصحيح ([Assembly: Defuggable ()]) في جزء disassembler.

بافتراض فقط تصحيح التصحيح والإصدار ، يتم تصحيح رمز التصحيح بشكل افتراضي مع تكوين التصحيح ، وبالتالي فإن الكود أدناه في AssemblyInfo.cs (ضمن مجلد الخصائص).

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

يمكنني استخدام AssemblyTitle عبر AssemblyDescription حيث سيظهر على خصائص مستكشف ملفات Windows 7:

DLL File properties

بالنسبة لأولئك الذين يحبون إجابة ديفيد وستيفيج ، إليك نص LINQPAD مكتوب في C#. لاستخدام البرنامج النصي ، تحتاج إلى التنزيل Linqpad 5 وتأكد من تحديد برنامج C# كما هو موضح في لقطة الشاشة أدناه.

ما عليك سوى استبدال dll_folder_path للإشارة إلى مجلد يحتوي على DLLs المراد تفتيشها.

// 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 هنا.

لا تنتشر في الإنتاج عبر Visual Studio. تفحص التكامل المستمر وتصنيع نصية (كما هو الحال مع نانت, ، أو ربما شيء أكثر وضوحا مثل مزيف).

مفتاح F5 ليس عملية بناء

وكتب البروتوكول الاختياري: إلى النتقاء الذين يعتقدون أن هذا لا يجيب على السؤال ، كتب البروتوكول الاختياري:

... أحتاج إلى ضمان أن جميع التجميعات التي سيتم نشرها تم تصميمها باستخدام تكوين الإصدار.

ل ضمان هذا ، استخدم خادم البناء مثل Teamcity وربما أداة لإدارة الإصدار مثل الأخطبوط النشر. قم بإغلاق أنظمة الإنتاج الخاصة بك بحيث يجب على المطورين المرور من خلال عملية الإنشاء الرسمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top