0

我有一个在 windows 和 web 中使用的共享报告 dll。我现在正试图将 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 中的设置。因此,如果我想更改样式,我只需在 dll 中更改它并将其应用于所有报告。然后,只需将适当的 repss 文件放入 Windows 和网站的根目录中即可。并为他们找到合适的路径。

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

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

希望这一切都说得通。

4

2 回答 2

2

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

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

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

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

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

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

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

于 2011-09-22T11:02:12.480 回答
0

如果确定位置的机制应该取决于上下文,那么调用者将其作为构造函数或方法参数或类似的东西传入似乎是合适的。无论是作为一条直线路径还是Func<string, string>作为“路径解析器”之类的东西,都将取决于您需要做什么。

于 2011-09-22T10:31:32.433 回答