Расположение включенных сборок в урезанном автономном развертывании - PullRequest
1 голос
/ 09 октября 2019

Я изучаю C # и связанный с ним стек и пытаюсь создать урезанный автономный исполняемый файл. Проблема в том, что некоторые сборки не имеют прямой ссылки и подразумеваются для использования через Managed Extensibility Framework, поэтому триммер не считает их использованными. Я включаю их в scd, используя <TrimmerRootAssembly Include="x"/>), но они не «видны» коду, даже если на них есть ссылки в проекте. Вот мой csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
        <PublishReadyToRun>true</PublishReadyToRun>
        <PublishTrimmed>true</PublishTrimmed>
        <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <ItemGroup>
      <TrimmerRootAssembly Include="Ayte.Tool.Toolkit.Handler.*" />
      <ProjectReference Include="..\Ayte.Tool.Toolkit.Core\Ayte.Tool.Toolkit.Core.csproj" />
      <ProjectReference Include="..\Ayte.Tool.Toolkit.Handler.DotNet\Ayte.Tool.Toolkit.Handler.DotNet.csproj" />
      <ProjectReference Include="..\Ayte.Tool.Toolkit.Handler.JVM\Ayte.Tool.Toolkit.Handler.JVM.csproj" />
      <ProjectReference Include="..\Ayte.Tool.Toolkit.Handler.Toolkit\Ayte.Tool.Toolkit.Handler.Toolkit.csproj" />
    </ItemGroup>

</Project>

Ayte.Tool.Toolkit.Handler.Toolkit успешно включен в SCD и доступен для моего приложения:

public static void Main(string[] args)
{            
    Console.WriteLine(Assembly.Load("Ayte.Tool.Toolkit.Handler.Toolkit"));
}

// Ayte.Tool.Toolkit.Handler.Toolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Но без прямого использования классов ассемблера / явного имени по именизагрузить это не появляется ни в AppDomain.CurrentDomain.GetAssemblies(), ни в Assembly.GetExecutingAssembly().GetReferencedAssemblies():

Current domain assemblies:
System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Ayte.Tool.Toolkit.CLI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Executing assembly references:
System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Runtime.Extensions, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

Как я могу получить список всех сборок, которые содержатся в SCD, чтобы нетерпеливо загрузить их? Любая прямая ссылка по имени, загрузке класса или чему-либо еще нарушает всю концепцию MEF, поэтому я не хотел бы делать это ни в каком другом методе.

1 Ответ

1 голос
/ 09 октября 2019

Одним из решений будет установка Microsoft.Extensions.DependencyModel и использование DependencyContext.Default. Правильный путь:

var assemblies = DependencyContext.Default.GetRuntimeAssemblyNames(runtimeIdentifier);

Я не уверен, как правильно разрешить runtimeIdentifier, но использование несуществующего идентификатора (например, String.Empty) приведет к использованию набора имен по умолчанию, которыйбыло достаточно для меня.

...