GetApplicationRoot()方法中的代码与WildHare IOExtensions.GetApplicationRoot()方法中的代码相同。
如果使用.net Core 2项目中的项目引用在同一解决方案中引用了代码,则它们将返回相同的值。在 net471 项目中,这两行还返回相同的应用程序根目录。
在.net Core 2中,如果我使用从Nuget WildHare数据包导入的 IOExtensions.GetApplicationRoot()方法,它将返回一个空值。
知道为什么吗?
using System;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using WildHare.Extensions;
namespace FirstCore
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"GetApplicationRoot(): { GetApplicationRoot() }");
// Returns C:\Code\Samples\Core2\FirstCore
Console.WriteLine($"IOExtensions.GetApplicationRoot(): { IOExtensions.GetApplicationRoot() }");
// Returns empty string
Console.ReadLine();
}
public static string GetApplicationRoot()
{
var exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
var appPathMatcher = new Regex(@"(?<!fil)[A-Za-z]:\\+[\S\s]*?(?=\\+bin)");
var appRoot = appPathMatcher.Match(exePath).Value;
return appRoot;
}
}
}
答案 0 :(得分:3)
从Assembly.GetExecutingAssembly().CodeBase
返回的值并不总是您期望的值,因此它与正则表达式不匹配,从而导致空字符串。
Assembly.GetExecutingAssembly
解析包含当前正在执行的代码的程序集,这里是WildHare程序集。
在开发.NET Core
应用程序时,通过NuGet packages
引用的任何程序集都不会复制到bin
文件夹中。
这意味着WildHare程序集可以从NuGet packages
文件夹中解析出来,其代码库如。 file:///C:/Users/you/.nuget/packages/wildhare/0.9.8.3/lib/netstandard2.0/WildHare.dll
此路径与正则表达式不匹配,结果为空字符串。
在构建Full .NET Framework
应用程序(例如4.7.1)时,所有程序集的确会复制到bin
文件夹中,从而导致正则表达式匹配。
在主程序集中插入代码时,代码库路径当然将包含bin
文件夹,并将通过正则表达式。
使用Assembly.GetEntryAssembly
代替Assembly.GetExecutingAssembly
,因为Assembly.GetCallingAssembly
返回的程序集是默认应用程序域中的进程可执行文件,或者是执行的第一个可执行文件您的主要应用程序。
备注:请注意,由于实现中的正则表达式匹配,GetApplicationRoot
仅在应用程序从bin
文件夹中运行时才有效。一旦应用程序发布。放松或消除此约束。