Browse Source

Merge pull request #18261 from dotnet-maestro-bot/merge/blazor-wasm-to-master

[automated] Merge branch 'blazor-wasm' => 'master'
Justin Kotalik 6 years ago
parent
commit
7d8dd27d16

+ 2 - 0
src/Components/Blazor/Blazor.Version.props

@@ -0,0 +1,2 @@
+<Project>
+</Project>

+ 5 - 0
src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHost.cs

@@ -19,6 +19,11 @@ namespace Microsoft.AspNetCore.Blazor.Hosting
 
         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));
             _runtime = runtime ?? throw new ArgumentNullException(nameof(runtime));
         }

+ 48 - 0
src/Components/Blazor/Build/src/Tasks/GenerateTypeGranularityLinkingConfig.cs

@@ -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")));
+        }
+    }
+}

+ 16 - 3
src/Components/Blazor/Build/src/targets/Blazor.MonoRuntime.targets

@@ -22,8 +22,6 @@
   <Target
     Name="_BlazorCopyFilesToOutputDirectory"
     DependsOnTargets="PrepareBlazorOutputs"
-    Inputs="@(BlazorOutputWithTargetPath)"
-    Outputs="@(BlazorOutputWithTargetPath->'$(TargetDir)%(TargetOutputPath)')"
     AfterTargets="CopyFilesToOutputDirectory"
     Condition="'$(OutputType.ToLowerInvariant())'=='exe'">
 
@@ -160,6 +158,7 @@
   </Target>
 
   <UsingTask TaskName="BlazorILLink" AssemblyFile="$(BlazorTasksPath)" />
+  <UsingTask TaskName="GenerateTypeGranularityLinkingConfig" AssemblyFile="$(BlazorTasksPath)" />
 
   <Target
       Name="_LinkBlazorApplication"
@@ -171,7 +170,10 @@
       Outputs="$(_BlazorLinkerOutputCache)">
 
     <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="@(_BlazorDependencyAssembly)" Condition="'%(_BlazorDependencyAssembly.IsLinkable)' == 'true'" />
@@ -201,6 +203,15 @@
       <_DotNetHostFileName Condition=" '$(OS)' == 'Windows_NT' ">dotnet.exe</_DotNetHostFileName>
     </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
         ILLinkPath="$(MonoLinkerPath)"
         AssemblyPaths="@(_BlazorAssemblyToLink)"
@@ -257,6 +268,8 @@
       <Output TaskParameter="Dependencies" ItemName="_BlazorResolvedRuntimeDependencies" />
     </ResolveBlazorRuntimeDependencies>
 
+    <WriteLinesToFile File="$(_BlazorApplicationAssembliesCacheFile)" Lines="@(_BlazorResolvedRuntimeDependencies)" Overwrite="true" />
+
     <ItemGroup>
       <FileWrites Include="$(_BlazorApplicationAssembliesCacheFile)" />
     </ItemGroup>

+ 3 - 0
src/Components/Blazor/Directory.Build.props

@@ -0,0 +1,3 @@
+<Project>
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
+</Project>

+ 6 - 2
src/ProjectTemplates/BlazorWasm.ProjectTemplates/Microsoft.AspNetCore.Blazor.Templates.csproj

@@ -1,4 +1,10 @@
 <Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <BlazorProjectsRoot>$(RepoRoot)src\Components\Blazor\</BlazorProjectsRoot>
+  </PropertyGroup>
+
+  <Import Project="$(BlazorProjectsRoot)Blazor.Version.props" />
+
   <PropertyGroup>
     <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
     <IsShippingPackage>true</IsShippingPackage>
@@ -18,8 +24,6 @@
       MicrosoftEntityFrameworkCoreSqlServerPackageVersion=$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion);
       MicrosoftAspNetCoreBlazorServerPackageVersion=$(MicrosoftAspNetCoreBlazorServerPackageVersion);
     </GeneratedContentProperties>
-
-    <BlazorProjectsRoot>$(RepoRoot)src\Components\Blazor\</BlazorProjectsRoot>
   </PropertyGroup>
 
   <ItemGroup>