如何以编程方式获取.NET程序集的正式文件夹位置而非影子复制路径?
获取程序集原始Bin文件夹路径(避开影子复制路径)
嘿,这个问题我之前也帮不少开发者解决过!确实,影子复制虽然方便了网站的发布更新,但想拿到程序集的原始部署位置(也就是网站的\bin文件夹)时,Assembly.GetExecutingAssembly().Location返回的总是复制后的临时路径,挺闹心的。别担心,有两种靠谱的方法可以搞定:
方法一:利用Assembly.CodeBase属性
这个属性会返回程序集的原始部署位置,而非影子复制后的路径。不过它返回的是带file://前缀的Uri格式,需要做一点转换:
using System.Reflection; using System; using System.IO; // 获取程序集的CodeBase路径 string codeBase = Assembly.GetExecutingAssembly().CodeBase; UriBuilder uriBuilder = new UriBuilder(codeBase); // 转义Uri中的特殊字符并提取本地路径 string rawPath = Uri.UnescapeDataString(uriBuilder.Path); // 获取路径对应的文件夹(即原始Bin文件夹) string originalBinPath = Path.GetDirectoryName(rawPath);
原理是:影子复制只是把程序集复制到临时目录,CodeBase会保留程序集最初被加载的原始位置,也就是网站的Bin文件夹。
方法二:ASP.NET专属——HttpRuntime.BinDirectory
如果是ASP.NET应用,这个方法更直接,HttpRuntime.BinDirectory会直接返回网站的Bin文件夹绝对路径,不需要额外转换:
using System.Web; string binFolderPath = HttpRuntime.BinDirectory;
注意这个方法需要引用System.Web程序集,仅适用于传统ASP.NET项目(.NET Framework)。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

