簡體   English   中英

在修剪的獨立部署中定位包含的組件

[英]Locating included assemblies in trimmed self-contained deployment

我正在學習 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.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 中的所有程序集的列表以急切地加載它們? 任何按名稱直接引用、class 負載或其他任何內容都會破壞整個 MEF 概念,因此我不想以任何手動方法進行。

解決方案之一是安裝Microsoft.Extensions.DependencyModel並使用DependencyContext.Default 正確的方法是:

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

我不確定如何正確解析runtimeIdentifier ,但使用不存在的標識符(例如String.Empty )將退回到默認的程序集名稱集,這對我來說已經足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM