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

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

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

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

p.s. Я использую C # и VS 2008

Ответы [ 3 ]

15 голосов
/ 03 декабря 2008
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;
}
4 голосов
/ 22 марта 2013

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

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

using System.ComponentModel;

if (LicenseManager.UsageMode == LicenseUsageMode.Runtime)
{
}
0 голосов
/ 29 сентября 2018

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

//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 указывает НЕ в режиме разработки!

...