关于c#:如何确定我的dll托管位置

How can I determine where my dll is hosted

本问题已经有最佳答案,请猛点这里访问。

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

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


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

如果上述情况属实,则最好创建一个配置文件(与DLL位于同一目录中),其中包含用于临时文件的路径。(或者,更好的是,使用app.config或web.config中类似log4net的appsettings)

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

如果未能创建临时文件,可以尝试将所需信息存储在内存中(例如,使用memoryStream)。

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

为了回答您的实际问题,我不知道如何可靠地说出您正在处理的项目类型。.net的美在于它是如此的灵活。理论上,您可以编写一个能够作为Web服务器、桌面应用程序或Windows服务运行的控制台应用程序。可能是三合一。

您可以根据调用可执行文件的引用程序集(system.windows可能表示桌面,system.web可能表示asp.net等)尝试猜测,但这将充满错误。我已经编写了几个引用Web程序集的桌面应用程序,以及一些引用桌面程序集的网站。

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

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

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