У меня есть общая библиотека инструментов С# Tools, которая используется как в библиотеке консоли, так и в веб-приложении. В зависимости от того, используется ли DLL в веб-приложении или в консоли, мне нужны определенные методы для выполнения по-разному.
Есть ли способ определить, находимся ли мы в контексте веб-контекста или консольного приложения из данного метода? Я понимаю, что для этого могу использовать файл конфигурации, но в моей ситуации было бы предпочтительнее, если бы я смог выполнить это в методе.
Вы должны параметризовать эту информацию и передать ее классу/методам, которые вы хотите использовать.
Вы не можете определить (надежным способом), если одно приложение является веб-приложением или консольным приложением, поскольку они не являются взаимно исключающими. Консольное приложение также может вести себя как веб-приложение, в качестве примера возьмите OWIN.
Если вы настаиваете на том, чтобы сделать это автоматически, вы определяете и используете атрибут в исполняемой сборке:
[AttributeUsage(AttributeTargets.Assembly)]
public class AppModelAttribute : Attribute {
public ModelType Model {get;private set} // This one can be an enum type with values Web, Console
public AppModel(ModelType type)
{
this.Model = type;
}
}
Добавьте эту сборку в свою исполняющую сборку:
[assembly: AppModelAttribute(ModelType.Web)]
Затем вы можете запросить этот атрибут и определить, является ли исполняющая сборка Web или консолью:
var attributes = assembly
.GetCustomAttributes(typeof(AppModelAttribute), false)
.Cast<AppModelAttribute>();
Вышеуказанный запрос берется здесь.
EDIT: Я имею в виду, что консольное приложение может запускаться как веб-сервер и вести себя как обычное веб-приложение, например, класс HttpServer может использоваться в любом виде приложения и позволяет вам отвечать на http-сообщения (GET, POST и т.д.). OWIN является примером консольного приложения, ведущего себя как веб-приложение.
Тем не менее вы можете определить веб-приложение как приложение, работающее в IIS в вашем контексте. Затем вам нужно как-то проанализировать процесс и посмотреть, действительно ли он размещен IIS, но это, безусловно, будет излишним.