在经过修剪的独立部署中定位包含的组件

问题描述 投票:1回答:1

我正在学习C#及其相关的堆栈,并尝试构建修剪的自包含可执行文件。问题在于,某些程序集没有直接引用,而是暗示通过Managed Extensibility Framework使用,因此微调器不将其视为已使用。我使用<TrimmerRootAssembly Include="x"/>将它们包括在scd中,但是即使在项目中引用了它们,它们也不是“可见”的代码。这是我的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概念,因此我不希望通过任何手动方法进行此操作。

c# .net-assembly self-contained
1个回答
0
投票

解决方案之一是安装Microsoft.Extensions.DependencyModel,然后使用DependencyContext.Default。正确的方法是:

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

我不确定如何正确解析runtimeIdentifier,但是使用不存在的标识符(例如String.Empty)将退回到默认的程序集名称集,这对我来说已经足够。

© www.soinside.com 2019 - 2024. All rights reserved.