来自Nuget数据包的Core 2应用程序根为空

时间:2019-03-30 06:09:55

标签: c# .net .net-core

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;
        }
    }
 }

Result

1 个答案:

答案 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文件夹中运行时才有效。一旦应用程序发布。放松或消除此约束。