4

我需要知道我的程序集所在的上下文(ASP.NET、Windows 服务、Windows 应用程序等)。

我的程序集应该根据上下文调用不同的函数。例如,如果它需要创建一个相对于其位置的文件夹,我想知道使用哪种方法:Path.GetFullPath(dirName)Server.MapPath(dirName).

4

1 回答 1

5

听起来您正在开发一个供其他开发人员使用的 DLL。听起来好像您正在尝试创建您不知道和/或无法控制环境的临时文件。

如果上述情况属实,最好创建一个配置文件(与 DLL 位于同一目录中),其中包含用于临时文件的路径等。(或者,更好的是,使用 App.Config 或 Web.Config 中的AppSettings类似于Log4Net

如果没有此配置文件,您可以尝试使用GetTempPath(),但这对于 ASP.NET 可能会失败(并且在其他情况下可能会失败)

如果您无法创建临时文件,您可以尝试将所需的信息存储在内存中(例如,使用MemoryStream)。

如果失败,那么您总是可以告诉用户使用配置文件。


在回答您的实际问题时,我不知道有一种方法可以可靠地说明您正在使用哪种项目。.NET 的美妙之处在于它是如此灵活。理论上,您可以编写一个控制台应用程序,该应用程序能够作为 Web 服务器、桌面应用程序或 Windows 服务运行。它可能是三合一的。

您总是可以尝试根据调用可执行文件的引用程序集进行猜测(System.Windows 可能意味着桌面,System.Web 可能意味着 ASP.NET 等),但这将充满错误。我编写了几个引用 Web 程序集的桌面应用程序,并且编写了引用桌面程序集的网站。

但是,如果您将路径放在配置文件中,那么您可能不需要知道上下文......您已经拥有所需的完全限定路径,而无需使用 GetFullPath() 或 MapPath()。

如果你真的需要区分,你可以在你的配置文件中包含一个设置。DLL 的用户将能够将程序集配置为使用它的环境。如果他们配置错误......好吧......如果配置错误,大多数软件都会出现故障。事情就是这样。

或者......甚至更好......如果某些任务的行为(例如查找文件的路径)需要根据开发过程中未知的某些条件进行更改,那么您可以编写您的 DLL 以支持依赖注入以启用您的用户在需要时提供适当的功能。

于 2013-05-03T19:49:12.167 回答