Корень приложения Core 2 пуст из пакета Nuget - PullRequest
0 голосов
/ 30 марта 2019

Код в методе GetApplicationRoot () идентичен коду в методе WildHare IOExtensions.GetApplicationRoot () .

Если код ссылается в том же решении с использованием ссылки на проект в .net Core 2, они возвращают одно и то же значение. В проекте net471 обе строки также возвращают один и тот же корень приложения.

В .net Core 2, если я использую метод IOExtensions.GetApplicationRoot () , импортированный из пакета Nuget WildHare, он возвращает пустое значение.

Просто чтобы прояснить, я являюсь автором пакета и был удивлен, когда это не сработало в контексте пакета .net Core Nuget, и меня интересует, почему.

Есть идеи?

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 Ответ

3 голосов
/ 12 июня 2019

Значение, возвращаемое из 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, что будет очень маловероятно после публикации заявки.Либо ослабьте, либо уберите это ограничение.

...