C# 获取windows应用程序和asp.net应用程序的应用程序路径的统一方法

C# 获取windows应用程序和asp.net应用程序的应用程序路径的统一方法,c#,.net,asp.net,path,C#,.net,Asp.net,Path,在.NET中是否有一种统一的方法来获取windows应用程序和asp.NET应用程序的应用程序路径(物理路径)?我不知道它是否提供了您想要的内容,但可能是一种候选方法 更新 正如@ AZ指出的那样,有些情况下,这将不会返回您通常会考虑的“应用程序目录”,所以最后我会说,不,没有统一的方式可以安全地给您所期望的。 < P>汇编。 它总是为您获取正在执行的dll或exe的路径(将位于web应用程序的bin文件夹中),然后您可以从中推断出应用程序目录[假设您指的是bin\folder]我就是这样做的

在.NET中是否有一种统一的方法来获取windows应用程序和asp.NET应用程序的应用程序路径(物理路径)?

我不知道它是否提供了您想要的内容,但可能是一种候选方法

更新

正如@ AZ指出的那样,有些情况下,这将不会返回您通常会考虑的“应用程序目录”,所以最后我会说,不,没有统一的方式可以安全地给您所期望的。

< P>汇编。
它总是为您获取正在执行的dll或exe的路径(将位于web应用程序的bin文件夹中),然后您可以从中推断出应用程序目录

[假设您指的是bin\folder]我就是这样做的

如果您的环境通常是Windows应用程序和Asp.Net,则您应该:

  • 检查AppDomain.CurrentDomain.SetupInformation.PrivateBinPath
    是否为空或null。
    
    • 如果不是,那么检查它是否是根目录
      • 如果不是,请记住此值为
        BinPath
        (在Asp.Net中为“bin”)——但请注意,更多自定义AppDomain宿主环境可能在此处有多个路径,并且可能有根路径
那么

  • 它是AppDomain.CurrentDomain.BaseDirectory
  • 或者
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory,BinPath)
    (其中
    BinPath
    从前面的代码中被记住)
此测试还有一些其他高级场景—测试运行程序为单元测试和其他奇怪的事情托管一个临时域。Asp.Net也有它的动态文件夹,这在这个答案的其他地方已经提到了——但是如果你只是想可靠地获取bin文件夹,那就太麻烦了

您当然不能只使用条目程序集的路径,因为在Asp.Net站点中,条目程序集将动态生成并驻留在该动态文件夹中

同样地,需要考虑SQLServer托管域,这再次改变了游戏(在这种情况下,您将获得MSSQL服务器文件夹)。


因此,对于任何AppDomain来说,任何能够可靠地确定这一点的解决方案实际上都将通过反复试验来获得最佳效果,我很抱歉——直到有人为每个托管场景提供完整的答案!因此,请坚持使用最常见的组件。

我有同样的问题,因为我正在编写一个框架组件,该组件在单元测试程序集以及ASP.NET网站中运行

我没有测试所有的组合,但在使用CodeRush插件运行单元测试时,我在IISExpress7.5和VisualStudio中测试了以下代码,效果很好

我要感谢MSDN文档中的一个老章节,它让我走上了这条道路:

不管怎样,这就是代码。希望有帮助:

string binPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string appPath = binPath.Substring(0, binPath.LastIndexOf("bin", StringComparison.InvariantCultureIgnoreCase));

如果您正在开发windows服务,则该属性将返回c:\windows\system32,因为该服务将由svchost.exe托管。所以它根本不起作用cases@AZ:不,这不是一个完美的解决方案。您还可能遇到这样的情况:应用程序在AppDomain中运行,而AppDomain是以某种方式创建的,因此加载应用程序的目录以外的目录是
BaseDirectory
。如果在IIS中运行的aspx页面中执行此操作,则会得到如下结果:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\TemporaryASP.NET文件\[…]\theassemblycontainingyourfile.dll
,这可能不是您要查找的内容。我真的认为原来问题的答案是“没有统一的方式”;我的回答也有缺陷(正如你正确指出的)。@Fredrik-u'r right。我没有测试一个网站(动态编译)而不是应用程序的情况。如果有可能,请将项目更改为Web应用程序,这将停止ASP对网站执行的临时程序集生成。在ASP.NET的情况下,这通常会返回一个临时位置。统一是指“现有的.NET运行时中的单个方法或类似方法将为您提供答案”,还是指“有人能以方法的形式给我一段代码,该方法将始终生成正确的路径,而不考虑上下文?”是的,你指出了,我指的是单一方法或属性。我不想编写代码来找出我所处的环境。