反射避免系统.Web引用



我有一个在windows和web中使用的共享报告dll。我现在正试图将windows程序移动到。net 4客户端配置文件,因此需要避免系统。Web引用。

在某些地方,代码需要获得网站的目录或dll的目录。我使用的代码是这样的:

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

是否有办法使用反射或类似的方法来避免系统。Web参考,所以我仍然可以得到适当的路径?如果有,我该怎么做?

替代品吗?

编辑我想这样做的原因是我使用一个报告系统,它可以接受样式表文件并将其应用于报告(我对所有报告都这样做)。作为我之前在dll中设置的mystylesheet.repss.所以如果我想改变样式,我只需要在dll中改变它,它就适用于所有报告。然后,只需将适当的repss文件放入windows和网站的根目录中。并找到合适的路径。

尝试在dll中使用相对路径会导致问题。传递报告。repss在Windows中工作得很好,但尝试~/mystylesheet。代表 mystylesheet。reps或其他任何我能想到的从web中的dll最终查找错误的目录"c:windowssystem32inetsrv"。

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

希望你听懂了。

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

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新