Как я могу узнать, был ли мой код вызван из непосредственного окна?

Есть ли способ, которым мой код может отличить «Я выполняю в контексте обычного процесса» и «Я был выполнен из непосредственного окна отладчика»?

У меня есть объект библиотеки, который предоставляет общедоступное свойство. При использовании релизной версии этой библиотеки, но при отладке приложения, которое загрузило DLL, содержащую эту библиотеку, если я изменю свойство из окна Immediate Window (x.prop = true), я бы хотел, чтобы код моего свойства обнаружил это и выполнил иначе.

Есть ли способ это обнаружить?

Для удобства я также хотел бы, чтобы это работало, когда я использую отладочную версию этой библиотеки. Итак, я не могу просто проверить, подключен ли отладчик, и перейти оттуда.


person Joe    schedule 27.08.2012    source источник
comment
Пока вы ждете ответа, попробуйте поиграть с StackTrace и посмотрите, сможете ли вы определить по стеку вызовов, откуда пришел вызов. Может быть очевидно, что он пришел из сборки отладчика.   -  person HABO    schedule 27.08.2012
comment
stackoverflow.com/questions/2188201/ Вы можете попробовать это   -  person Paul Farry    schedule 27.08.2012
comment
@Paul, спасибо, но эта система использует Debugger.IsAttached, который, как я указал, здесь не может работать, так как этот код также запускался, когда я отлаживал саму библиотеку ...   -  person Joe    schedule 27.08.2012
comment
@ Хабо, спасибо, я сначала это проверил. Immediate Window, по-видимому, очень хорошо подключается прямо к существующему стеку, потому что в стеке о нем нет упоминания. В стеке нет ничего, кроме того, что было бы там обычно. Я был разочарован.   -  person Joe    schedule 27.08.2012
comment
+1 хороший вопрос, связанный с stackoverflow.com/a/10918403/495455 - если на этот вопрос нет решения, Обходной путь - использовать перегруженные методы для другого выполнения при вызове из Immediate Window.   -  person Jeremy Thompson    schedule 27.08.2012
comment
@ Джереми, правильно ли я анализирую ваше предложение, так как у вас есть перегруженный метод, который вы никогда не вызываете из кода, но вы вызываете из окна Immediate Window? Это возможный подход, но он все равно сделает его общедоступным, и я бы не хотел, чтобы потребители моей библиотеки вызывали эту перегрузку. На этом этапе я, вероятно, собираюсь предположить, что то, что я хочу, невыполнимо. VS слишком хорош в том, чтобы заставить Immediate Window работать в моем потоке, в моем процессе, в моем контексте. Блин эти парни. :-)   -  person Joe    schedule 27.08.2012


Ответы (2)


Я всегда замечал одну вещь: любые вызовы из Immediate Window содержат по крайней мере один вызов, происходящий из следующего пространства имен:

Microsoft.VisualStudio.HostingProcess

Итак, если да, скажите:

public static string DumpStack()
{
    return new StackTrace().ToString();
}

Вы бы увидели что-то вроде:

   at ConsoleApplication1.Program.DumpStack()
   at ConsoleApplication1.Program.Main(String[] args)
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
person JerKimball    schedule 29.09.2012

единственная вещь, которую нужно проверить, если вызов из окна Immediate, - это создать ВНЕШНИЙ поток вашей функции. Этот поток устанавливает логическое значение.

Обычно непосредственное окно не может использовать другие потоки, потому что они заморожены. Значит, если ваше логическое значение изменилось, вы сразу же находитесь в окне.

Я надеюсь, что это понятно.

person Felix Wohlfarth    schedule 28.06.2018