示例#1
0
        public static string GetBootJsonContent(string assemblyFileName, string entryPoint, string[] assemblyReferences, IEnumerable <EmbeddedResourceInfo> embeddedContent, bool linkerEnabled)
        {
            var data = new BootJsonData(
                assemblyFileName,
                entryPoint,
                assemblyReferences,
                embeddedContent,
                linkerEnabled);

            return(JsonSerializer.Serialize(data, JsonSerializerOptionsProvider.Options));
        }
        internal static void WriteBootJson(Stream stream, string entryAssemblyName, string[] assemblies, bool linkerEnabled)
        {
            var data = new BootJsonData
            {
                entryAssembly = entryAssemblyName,
                assemblies    = assemblies,
                linkerEnabled = linkerEnabled,
            };

            var serializer = new DataContractJsonSerializer(typeof(BootJsonData));

            serializer.WriteObject(stream, data);
        }
        // Internal for tests
        internal void WriteBootJson(Stream output, string entryAssemblyName)
        {
            var result = new BootJsonData
            {
                entryAssembly      = entryAssemblyName,
                cacheBootResources = CacheBootResources,
                debugBuild         = DebugBuild,
                linkerEnabled      = LinkerEnabled,
                resources          = new ResourcesData(),
                config             = new List <string>(),
            };

            // Build a two-level dictionary of the form:
            // - assembly:
            //   - UriPath (e.g., "System.Text.Json.dll")
            //     - ContentHash (e.g., "4548fa2e9cf52986")
            // - runtime:
            //   - UriPath (e.g., "dotnet.js")
            //     - ContentHash (e.g., "3448f339acf512448")
            if (Resources != null)
            {
                var resourceData = result.resources;
                foreach (var resource in Resources)
                {
                    var resourceTypeMetadata = resource.GetMetadata("BootManifestResourceType");
                    ResourceHashesByNameDictionary resourceList;
                    switch (resourceTypeMetadata)
                    {
                    case "runtime":
                        resourceList = resourceData.runtime;
                        break;

                    case "assembly":
                        resourceList = resourceData.assembly;
                        break;

                    case "pdb":
                        resourceData.pdb ??= new ResourceHashesByNameDictionary();
                        resourceList = resourceData.pdb;
                        break;

                    case "satellite":
                        if (resourceData.satelliteResources is null)
                        {
                            resourceData.satelliteResources = new Dictionary <string, ResourceHashesByNameDictionary>(StringComparer.OrdinalIgnoreCase);
                        }
                        var resourceCulture = resource.GetMetadata("Culture");
                        if (resourceCulture is null)
                        {
                            Log.LogWarning("Satellite resource {0} does not specify required metadata 'Culture'.", resource);
                            continue;
                        }

                        if (!resourceData.satelliteResources.TryGetValue(resourceCulture, out resourceList))
                        {
                            resourceList = new ResourceHashesByNameDictionary();
                            resourceData.satelliteResources.Add(resourceCulture, resourceList);
                        }
                        break;

                    default:
                        throw new NotSupportedException($"Unsupported BootManifestResourceType metadata value: {resourceTypeMetadata}");
                    }

                    var resourceName = GetResourceName(resource);
                    if (!resourceList.ContainsKey(resourceName))
                    {
                        resourceList.Add(resourceName, $"sha256-{resource.GetMetadata("Integrity")}");
                    }
                }
            }

            if (ConfigurationFiles != null)
            {
                foreach (var configFile in ConfigurationFiles)
                {
                    result.config.Add(Path.GetFileName(configFile.ItemSpec));
                }
            }

            var serializer = new DataContractJsonSerializer(typeof(BootJsonData), new DataContractJsonSerializerSettings
            {
                UseSimpleDictionaryFormat = true
            });

            using var writer = JsonReaderWriterFactory.CreateJsonWriter(output, Encoding.UTF8, ownsStream: false, indent: true);
            serializer.WriteObject(writer, result);
        }