Как определить, работает ли пользовательский элемент управления в среде 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, указывает НЕ в режиме разработки!