反思避免System.Web参考

时间:2011-09-22 10:27:37

标签: .net reflection system.web

我有一个共享报告dll,用于Windows和Web。我现在正在尝试将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引用,所以我仍然可以获得适当的路径?如果是这样,我该怎么做?

任何替代方案?

修改 我想这样做的原因是我使用一个报告系统,可以获取样式表文件并将其应用于报告(我为所有报告执行此操作)。作为我之前在dll中设置的设置mystylesheet.repss.So如果我想更改样式,我只需在dll中更改它并将其应用于所有报告。然后只是将适当的repss文件放到Windows和网站上的根目录中。并找到适合他们的路径。

尝试在dll中使用相对路径会导致问题。传递报告。\ mystylesheet.repss在Windows中工作正常,但是尝试〜/ mystylesheet.repss。\ mystylesheet.repss或者其他任何我能从网上的dll中想到的东西最终会查找错误的目录“c:\ windows \ system32 \ INETSRV”。

我可以将设置移动到每个不同的窗口和Web应用程序并将其传递到完整路径,当它实际上是dll的内部设置时,似乎向后执行它。

希望这一切都有意义。

2 个答案:

答案 0 :(得分:2)

为什么不使用相对于AppDomain.BaseDirectory的路径。

这将是ASP.NET Web应用程序的根目录,以及包含Console或WinForms应用程序可执行文件的目录。

对于其他应用程序类型,它通常是一个合理的默认位置:例如,在VSTO 2005应用程序中,它将是包含应用程序的VSTO托管程序集的目录,而不是Excel可执行文件的路径

如果合适,您可以支持可选的配置设置(例如appSetting),以允许DLL的调用者指定备用位置,同时默认为基本目录。

另一个选项是允许调用者指定样式表文件的路径,该路径可以是绝对路径也可以是相对路径。如果是相对的,请将其设为相对于AppDomain.BaseDirectory

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

请注意,如果使用相对路径,则它将相对于当前工作目录,该目录可在应用程序的生命周期内更改,并且与应用程序基目录不同。

答案 1 :(得分:0)

如果用于确定位置的机制应该取决于上下文,则听起来调用者将其作为构造函数或方法参数或类似的东西传递是合适的。这只是一条直线路径还是像Func<string, string>那样的“路径解析器”将取决于你需要做什么。