Link more assemblies (type granularity linking for real this time) (#18165)
This commit is contained in:
parent
d4ada348fb
commit
a181fd5232
|
|
@ -19,6 +19,11 @@ namespace Microsoft.AspNetCore.Blazor.Hosting
|
||||||
|
|
||||||
public WebAssemblyHost(IServiceProvider services, IJSRuntime runtime)
|
public WebAssemblyHost(IServiceProvider services, IJSRuntime runtime)
|
||||||
{
|
{
|
||||||
|
// To ensure JS-invoked methods don't get linked out, have a reference to their enclosing types
|
||||||
|
GC.KeepAlive(typeof(EntrypointInvoker));
|
||||||
|
GC.KeepAlive(typeof(JSInteropMethods));
|
||||||
|
GC.KeepAlive(typeof(WebAssemblyEventDispatcher));
|
||||||
|
|
||||||
Services = services ?? throw new ArgumentNullException(nameof(services));
|
Services = services ?? throw new ArgumentNullException(nameof(services));
|
||||||
_runtime = runtime ?? throw new ArgumentNullException(nameof(runtime));
|
_runtime = runtime ?? throw new ArgumentNullException(nameof(runtime));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
using Microsoft.Build.Framework;
|
||||||
|
using Microsoft.Build.Utilities;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Blazor.Build.Tasks
|
||||||
|
{
|
||||||
|
public class GenerateTypeGranularityLinkingConfig : Task
|
||||||
|
{
|
||||||
|
[Required]
|
||||||
|
public ITaskItem[] Assemblies { get; set; }
|
||||||
|
|
||||||
|
[Required]
|
||||||
|
public string OutputPath { get; set; }
|
||||||
|
|
||||||
|
public override bool Execute()
|
||||||
|
{
|
||||||
|
var linkerElement = new XElement("linker",
|
||||||
|
new XComment(" THIS IS A GENERATED FILE - DO NOT EDIT MANUALLY "));
|
||||||
|
|
||||||
|
foreach (var assembly in Assemblies)
|
||||||
|
{
|
||||||
|
var assemblyElement = CreateTypeGranularityConfig(assembly);
|
||||||
|
linkerElement.Add(assemblyElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
using var fileStream = File.Open(OutputPath, FileMode.Create);
|
||||||
|
new XDocument(linkerElement).Save(fileStream);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XElement CreateTypeGranularityConfig(ITaskItem assembly)
|
||||||
|
{
|
||||||
|
// We match all types in the assembly, and for each one, tell the linker to preserve all
|
||||||
|
// its members (preserve=all) but only if there's some reference to the type (required=false)
|
||||||
|
return new XElement("assembly",
|
||||||
|
new XAttribute("fullname", Path.GetFileNameWithoutExtension(assembly.ItemSpec)),
|
||||||
|
new XElement("type",
|
||||||
|
new XAttribute("fullname", "*"),
|
||||||
|
new XAttribute("preserve", "all"),
|
||||||
|
new XAttribute("required", "false")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -160,6 +160,7 @@
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<UsingTask TaskName="BlazorILLink" AssemblyFile="$(BlazorTasksPath)" />
|
<UsingTask TaskName="BlazorILLink" AssemblyFile="$(BlazorTasksPath)" />
|
||||||
|
<UsingTask TaskName="GenerateTypeGranularityLinkingConfig" AssemblyFile="$(BlazorTasksPath)" />
|
||||||
|
|
||||||
<Target
|
<Target
|
||||||
Name="_LinkBlazorApplication"
|
Name="_LinkBlazorApplication"
|
||||||
|
|
@ -171,7 +172,10 @@
|
||||||
Outputs="$(_BlazorLinkerOutputCache)">
|
Outputs="$(_BlazorLinkerOutputCache)">
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<_BlazorDependencyAssembly Include="@(_BlazorDependencyInput)" IsLinkable="$([System.String]::Copy('%(FileName)').StartsWith('System.'))" />
|
<_BlazorDependencyAssembly Include="@(_BlazorDependencyInput)" />
|
||||||
|
<_BlazorDependencyAssembly IsLinkable="true" Condition="$([System.String]::Copy('%(Filename)').StartsWith('System.'))" />
|
||||||
|
<_BlazorDependencyAssembly IsLinkable="true" TypeGranularity="true" Condition="$([System.String]::Copy('%(Filename)').StartsWith('Microsoft.AspNetCore.'))" />
|
||||||
|
<_BlazorDependencyAssembly IsLinkable="true" TypeGranularity="true" Condition="$([System.String]::Copy('%(Filename)').StartsWith('Microsoft.Extensions.'))" />
|
||||||
|
|
||||||
<_BlazorAssemblyToLink Include="@(_WebAssemblyBCLAssembly)" />
|
<_BlazorAssemblyToLink Include="@(_WebAssemblyBCLAssembly)" />
|
||||||
<_BlazorAssemblyToLink Include="@(_BlazorDependencyAssembly)" Condition="'%(_BlazorDependencyAssembly.IsLinkable)' == 'true'" />
|
<_BlazorAssemblyToLink Include="@(_BlazorDependencyAssembly)" Condition="'%(_BlazorDependencyAssembly.IsLinkable)' == 'true'" />
|
||||||
|
|
@ -201,6 +205,15 @@
|
||||||
<_DotNetHostFileName Condition=" '$(OS)' == 'Windows_NT' ">dotnet.exe</_DotNetHostFileName>
|
<_DotNetHostFileName Condition=" '$(OS)' == 'Windows_NT' ">dotnet.exe</_DotNetHostFileName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<_TypeGranularityLinkingConfig>$(BlazorIntermediateOutputPath)linker.typegranularityconfig.xml</_TypeGranularityLinkingConfig>
|
||||||
|
</PropertyGroup>
|
||||||
|
<GenerateTypeGranularityLinkingConfig Assemblies="@(_BlazorAssemblyToLink->WithMetadataValue('TypeGranularity', 'true'))" OutputPath="$(_TypeGranularityLinkingConfig)" />
|
||||||
|
<ItemGroup>
|
||||||
|
<BlazorLinkerDescriptor Include="$(_TypeGranularityLinkingConfig)" />
|
||||||
|
<FileWrites Include="$(_TypeGranularityLinkingConfig)" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<BlazorILLink
|
<BlazorILLink
|
||||||
ILLinkPath="$(MonoLinkerPath)"
|
ILLinkPath="$(MonoLinkerPath)"
|
||||||
AssemblyPaths="@(_BlazorAssemblyToLink)"
|
AssemblyPaths="@(_BlazorAssemblyToLink)"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue