在修剪的独立部署中查找包含的程序集



我正在学习C#,它与堆栈相关,并尝试构建修剪过的自包含可执行文件。问题在于某些程序集没有直接引用,并且暗示通过托管扩展性框架使用,因此修整器不会将它们计为已使用。我使用<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.CoreAyte.Tool.Toolkit.Core.csproj" />
<ProjectReference Include="..Ayte.Tool.Toolkit.Handler.DotNetAyte.Tool.Toolkit.Handler.DotNet.csproj" />
<ProjectReference Include="..Ayte.Tool.Toolkit.Handler.JVMAyte.Tool.Toolkit.Handler.JVM.csproj" />
<ProjectReference Include="..Ayte.Tool.Toolkit.Handler.ToolkitAyte.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 概念,所以我不想以任何手动方法进行。

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

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

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

最新更新