Как определить, работает ли пользовательский элемент управления в среде IDE, в режиме отладки или в выпущенном EXE-файле?

У меня есть пользовательский элемент управления, который я создаю. Его целью является отображение статуса класса для пользователя. Очевидно, что это не имеет значения и замедлит работу при запуске элемента управления в среде IDE, как это происходит, как только вы добавите его в форму.

Один из способов обойти это - создать элемент управления и добавить его в коллекцию элементов управления во время выполнения. Но это кажется не идеальным.

Есть ли способ установить флаг в элементе управления, чтобы он мог пропускать определенные разделы кода в зависимости от того, как он работает?

я использую C# и VS 2008

3 ответа

Решение
public static bool IsInRuntimeMode( IComponent component ) {
    bool ret = IsInDesignMode( component );
    return !ret;
}

public static bool IsInDesignMode( IComponent component ) {
    bool ret = false;
    if ( null != component ) {
        ISite site = component.Site;
        if ( null != site ) {
            ret = site.DesignMode;
        }
        else if ( component is System.Windows.Forms.Control ) {
            IComponent parent = ( (System.Windows.Forms.Control)component ).Parent;
            ret = IsInDesignMode( parent );
        }
    }

    return ret;
}

Я нашел этот ответ в другом посте, и мне кажется, что он легче и работает лучше для моей ситуации.

Определение режима проектирования из конструктора элемента управления

using System.ComponentModel;

if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
{
}

Это метод, который я использовал в своем проекте:

//use a Property or Field for keeping the info to avoid runtime computation
public static bool NotInDesignMode { get; } = IsNotInDesignMode();
private static bool IsNotInDesignMode()
{
    /*
    File.WriteAllLines(@"D:\1.log", new[]
    {
        LicenseManager.UsageMode.ToString(), //not always reliable, e.g. WPF app in Blend this will return RunTime
        Process.GetCurrentProcess().ProcessName, //filename without extension
        Process.GetCurrentProcess().MainModule.FileName, //full path
        Process.GetCurrentProcess().MainModule.ModuleName, //filename
        Assembly.GetEntryAssembly()?.Location, //null for WinForms app in VS IDE
        Assembly.GetEntryAssembly()?.ToString(), //null for WinForms app in VS IDE
        Assembly.GetExecutingAssembly().Location, //always return your project's output assembly info
        Assembly.GetExecutingAssembly().ToString(), //always return your project's output assembly info
    });
    //*/

    //LicenseManager.UsageMode will return RunTime if LicenseManager.context is not present.
    //So you can not return true by judging it's value is RunTime.
    if (LicenseUsageMode.Designtime == LicenseManager.UsageMode) return false;
    var procName = Process.GetCurrentProcess().ProcessName.ToLower();
    return "devenv" != procName //WinForms app in VS IDE
        && "xdesproc" != procName //WPF app in VS IDE/Blend
        && "blend" != procName //WinForms app in Blend
        //other IDE's process name if you detected by log from above
        ;
}

Внимание!!!: код, возвращаемый bool, указывает НЕ в режиме разработки!

Другие вопросы по тегам