Отражение, чтобы избежать ссылки System.Web - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть общая библиотека отчетов, которая используется как в Windows, так и в Интернете. Сейчас я пытаюсь переместить программы Windows в профиль клиента .NET 4, поэтому необходимо избегать ссылок на System.Web.

В некоторых точках кода необходимо получить каталог веб-сайта или каталог dll. Я использовал код примерно так:

string path;
if (HttpContext.Current != null)
{
    path = HttpContext.Current.Server.MapPath("default.aspx");
}
else
{
    path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}

Есть ли способ использовать отражение или подобное, чтобы избежать ссылки на System.Web, чтобы я все еще мог найти подходящий путь? Если да, то как мне это сделать?

Есть ли альтернативы?

EDIT Причина, по которой я хочу это сделать, заключается в том, что я использую систему отчетов, которая может взять файл таблицы стилей и применить его к отчетам (я делаю это для всех отчетов). В качестве настройки, которую я ранее имел в самой dll, mystylesheet.repss. Поэтому, если я хочу изменить стили, я просто изменяю их в dll, и они применяются ко всем отчетам. Тогда это был просто случай сброса соответствующего файла repss в корневой каталог Windows и веб-сайт. И найти подходящий путь к ним.

Попытка использовать относительные пути с DLL приводит к проблемам. Передача отчета. \ Mystylesheet.repss отлично работает в Windows, но попытка ~ / mystylesheet.repss. \ Mystylesheet.repss или чего-либо еще, что я могу придумать из dll в сети, заканчивается поиском неправильного каталога "c: \ windows \ system32 \ Inetsrv».

Я мог бы перенести настройку в каждое отдельное окно и веб-приложение и передать ее с обработанным полным путем, кажется, что задом наперед сделать это так, когда это действительно внутренняя настройка для DLL.

Надеюсь, что все это имело смысл.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Почему вы не используете пути относительно AppDomain.BaseDirectory .

Это будет корневой каталог веб-приложения для ASP.NET и каталог, содержащий ваш исполняемый файл для приложения Console или WinForms.

Для других типов приложений это обычно будет разумное расположение по умолчанию: например, в приложении VSTO 2005 это будет каталог, содержащий управляемые сборки VSTO для вашего приложения, а не, скажем, путь к исполняемому файлу Excel. .

Если необходимо, вы можете поддерживать необязательный параметр конфигурации (например, appSetting), чтобы позволить вызывающей стороне вашей DLL указать альтернативное расположение, при этом по умолчанию используется базовый каталог.

Другой вариант - позволить вызывающим абонентам указать путь к файлу таблицы стилей, который может быть абсолютным или относительным. Если относительный, сделайте это относительно AppDomain.BaseDirectory.

if (!Path.IsPathRooted(stylesheetPath))
{
     stylesheetPath = Path.Combine(
                          AppDomain.CurrentDomain.BaseDirectory, 
                          stylesheetPath);
}
...

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

0 голосов
/ 22 сентября 2011

Если механизм определения местоположения должен зависеть от контекста, кажется, что для вызывающей стороны было бы целесообразно передать его в качестве параметра конструктора или метода или чего-то подобного. Будь то прямой путь или что-то вроде Func<string, string> в качестве «преобразователя пути», будет зависеть именно от того, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...