我们正在Windows上使用C#和.NET 4.0在Visual Studio 2010中开发多个应用程序.两个SilverLight应用程序使用来自多个WCF项目的服务.另一个是控制台应用程序.
我们希望在一个单独的库项目中放置一些"通用"功能,以便分解和重用代码.由于文件路径处理不同,此库需要知道应用程序是托管(IIS,ASP.NET ...),如WCF服务还是作为控制台应用程序运行.
谷歌搜索这个问题,人们表示使用System.Web.dll以了解代码是否托管,使用HttpContext,HostingEnvironment.IsHosted ......问题是这种方法需要包含对System.Web int的引用如果此库将由具有客户端配置文件的控制台项目引用,则不能接受库项目.
我们的想法是使用另一种不涉及使用System.Web程序集的技术.
如果您只需要获取包含应用程序的文件夹中的文件的路径(如问题评论中所述),您可以使用:
Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "filename")
Run Code Online (Sandbox Code Playgroud)
对于ASP.NET应用程序,这将是根文件夹(与MapPath("〜/"+ filename)相同),对于控制台应用程序,它将是包含可执行文件的文件夹.
从评论到原始问题:
在运行控制台应用程序时,只需使用文件名作为相对路径
我不建议使用相对路径.这将与当前工作目录相关,该目录可能与应用程序目录不同.
有几种方法可以检查应用程序是否是ASP.NET.
检查配置文件的名称
if ("web.config".Equals(Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile), StringComparison.OrdinalIgnoreCase))
{
// ASP.NET application
}
Run Code Online (Sandbox Code Playgroud)
ASP.NET应用程序没有条目程序集
if (Assembly.GetEntryAssembly() == null)
{
// ASP.NET application
}
Run Code Online (Sandbox Code Playgroud)
ASP.NET应用程序使用所有.dll文件的卷影副本.但是,我不确定这是否可以在其他类型的应用程序中使用.
if (AppDomain.CurrentDomain.ShadowCopyFiles)
{
// ASP.NET application (probably)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8784 次 |
| 最近记录: |