public static PartDiscovery CreatePartDiscovery(Resolver resolver) { return(PartDiscovery.Combine(new AttributedPartDiscoveryV1(resolver), new AttributedPartDiscovery(resolver, isNonPublicSupported: true))); }
public override bool Execute() { if (Environment.GetEnvironmentVariable("CreateCompositionTaskDebug") == "1") { Debugger.Launch(); } this.catalogAssemblyPaths.AddRange(this.CatalogAssemblies.Select(this.GetMEFAssemblyFullPath)); AppDomain.CurrentDomain.AssemblyResolve += this.CurrentDomain_AssemblyResolve; try { var loadableAssemblies = this.catalogAssemblyPaths .Concat(this.ReferenceAssemblies.Select(i => i.GetMetadata("FullPath")) ?? Enumerable.Empty <string>()); var resolver = new Resolver(new AssemblyLoader(this, loadableAssemblies)); var discovery = PartDiscovery.Combine( new AttributedPartDiscoveryV1(resolver), new AttributedPartDiscovery(resolver, isNonPublicSupported: true)); this.CancellationToken.ThrowIfCancellationRequested(); var parts = discovery.CreatePartsAsync(this.catalogAssemblyPaths).GetAwaiter().GetResult(); var catalog = ComposableCatalog.Create(resolver) .AddParts(parts); this.LogLines(this.GetLogFilePath("CatalogAssemblies"), this.GetCatalogAssembliesLines(catalog), this.CancellationToken); string catalogErrorFilePath = this.GetLogFilePath("CatalogErrors"); if (catalog.DiscoveredParts.DiscoveryErrors.IsEmpty) { File.Delete(catalogErrorFilePath); } else { this.LogLines(catalogErrorFilePath, GetCatalogErrorLines(catalog), this.CancellationToken); foreach (var error in catalog.DiscoveredParts.DiscoveryErrors) { string message = error.GetUserMessage(); if (this.ContinueOnDiscoveryErrors) { this.LogWarning(DiscoveryErrorCode, message); } else { this.Log.LogError(null, DiscoveryErrorCode, null, null, 0, 0, 0, 0, message); } } if (!this.ContinueOnDiscoveryErrors) { return(false); } } this.CancellationToken.ThrowIfCancellationRequested(); var configuration = CompositionConfiguration.Create(catalog); if (!string.IsNullOrEmpty(this.DgmlOutputPath)) { configuration.CreateDgml().Save(this.DgmlOutputPath); this.writtenFiles.Add(this.DgmlOutputPath !); } this.CancellationToken.ThrowIfCancellationRequested(); string compositionLogPath = this.GetLogFilePath("CompositionErrors"); if (configuration.CompositionErrors.IsEmpty) { File.Delete(compositionLogPath); } else { this.LogLines(compositionLogPath, GetCompositionErrorLines(configuration), this.CancellationToken); foreach (var error in configuration.CompositionErrors.Peek()) { if (this.ContinueOnCompositionErrors) { this.LogWarning(CompositionErrorCode, error.Message); } else { this.Log.LogError(null, CompositionErrorCode, null, null, 0, 0, 0, 0, error.Message); } } if (!this.ContinueOnCompositionErrors) { return(false); } } this.CancellationToken.ThrowIfCancellationRequested(); string cachePath = Path.GetFullPath(this.CompositionCacheFile); this.Log.LogMessage("Producing IoC container \"{0}\"", cachePath); using (var cacheStream = File.Open(cachePath, FileMode.Create)) { this.CancellationToken.ThrowIfCancellationRequested(); var runtime = RuntimeComposition.CreateRuntimeComposition(configuration); this.CancellationToken.ThrowIfCancellationRequested(); var runtimeCache = new CachedComposition(); runtimeCache.SaveAsync(runtime, cacheStream, this.CancellationToken).GetAwaiter().GetResult(); } this.writtenFiles.Add(cachePath); return(!this.Log.HasLoggedErrors); } finally { AppDomain.CurrentDomain.AssemblyResolve -= this.CurrentDomain_AssemblyResolve; this.FileWrites = this.writtenFiles.Select(f => new TaskItem(f)).ToArray(); } }
public async Task GetAssemblyInputs_IdentifiesAssembliesDefiningBaseTypesOfParts(PartDiscovery discovery) { var catalog = TestUtilities.EmptyCatalog.AddParts( await discovery.CreatePartsAsync(typeof(ExportingTypeDerivesFromOtherAssembly))); var expected = new HashSet <AssemblyName>(AssemblyNameComparer.Default) { typeof(ExportingTypeDerivesFromOtherAssembly).GetTypeInfo().Assembly.GetName(), typeof(AssemblyDiscoveryTests.NonPart).GetTypeInfo().Assembly.GetName(), typeof(object).GetTypeInfo().Assembly.GetName(), }; var actual = catalog.GetInputAssemblies(); this.AssertExpectedInputAssemblies(expected, actual); }
public async Task GetAssemblyInputs_ContainsDefiningAttributeAssemblyForMetadata(PartDiscovery discovery) { var catalog = TestUtilities.EmptyCatalog.AddParts( await discovery.CreatePartsAsync(typeof(ExportingTypeWithMetadataWhoseDefiningAttributeIsInAnotherAssembly))); var inputAssemblies = catalog.GetInputAssemblies(); Assert.Contains(typeof(SomeMetadataAttributeFromAnotherAssemblyAttribute).GetTypeInfo().Assembly.GetName(), inputAssemblies, AssemblyNameComparer.Default); }
public async Task GetAssemblyInputs_IdentifiesAssembliesDefiningExportingMembersWithTypeMetadata(PartDiscovery discovery) { var catalog = TestUtilities.EmptyCatalog.AddParts( await discovery.CreatePartsAsync(typeof(ExportingWithExportingMembers))); var expected = new HashSet <AssemblyName>(AssemblyNameComparer.Default) { typeof(AssemblyDiscoveryTests.ISomeInterface).GetTypeInfo().Assembly.GetName(), typeof(ExportingWithExportingMembers).GetTypeInfo().Assembly.GetName(), typeof(object).GetTypeInfo().Assembly.GetName(), }; var actual = catalog.GetInputAssemblies(); this.AssertExpectedInputAssemblies(expected, actual); }
public async Task GetAssemblyInputs_IdentifiesAssembliesDefiningMultipleDifferentEnumMetadata(PartDiscovery discovery) { var catalog = TestUtilities.EmptyCatalog.AddParts( await discovery.CreatePartsAsync(typeof(ExportingWithMultipleDifferentEnumMetadata))); var expected = new HashSet <AssemblyName>(AssemblyNameComparer.Default) { typeof(AssemblyDiscoveryTests.SomeEnum).GetTypeInfo().Assembly.GetName(), typeof(AssemblyDiscoveryTests2.SomeOtherEnum).GetTypeInfo().Assembly.GetName(), typeof(ExportingWithMultipleDifferentEnumMetadata).GetTypeInfo().Assembly.GetName(), typeof(object).GetTypeInfo().Assembly.GetName(), }; var actual = catalog.GetInputAssemblies(); this.AssertExpectedInputAssemblies(expected, actual); }