From c0c4af040eaf483a1f994c2a1d0d455b6bae7cdd Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Fri, 16 Jan 2015 16:01:41 -0800 Subject: [PATCH 1/2] Add System.Composition source code, update projects to build in corefx --- .../src/Properties/AssemblyInfo.cs | 18 + .../System.Composition.AttributedModel.csproj | 46 + .../Convention/AttributedModelProvider.cs | 33 + .../src/System/Composition/ExportAttribute.cs | 94 + .../Composition/ExportMetadataAttribute.cs | 51 + .../src/System/Composition/ImportAttribute.cs | 55 + .../System/Composition/ImportManyAttribute.cs | 48 + .../ImportMetadataConstraintAttribute.cs | 41 + .../ImportingConstructorAttribute.cs | 27 + .../Composition/MetadataAttributeAttribute.cs | 23 + .../OnImportsSatisfiedAttribute.cs | 17 + .../Composition/PartMetadataAttribute.cs | 50 + .../PartNotDiscoverableAttribute.cs | 21 + .../src/System/Composition/SharedAttribute.cs | 48 + .../Composition/SharingBoundaryAttribute.cs | 45 + .../Diagnostics/CompositionTrace.cs | 120 + .../Diagnostics/CompositionTraceId.cs | 25 + .../Diagnostics/CompositionTraceSource.cs | 58 + .../Diagnostics/SilverlightTraceWriter.cs | 88 + .../Diagnostics/TraceSourceTraceWriter.cs | 53 + .../Composition/Diagnostics/TraceWriter.cs | 23 + .../Assumes.InternalErrorException.cs | 23 + .../src/Microsoft/Internal/Assumes.cs | 115 + .../Microsoft/Internal/AttributeServices.cs | 76 + .../src/Microsoft/Internal/Lock.Reader.cs | 32 + .../src/Microsoft/Internal/Lock.Writer.cs | 32 + .../src/Microsoft/Internal/Lock.cs | 79 + .../Microsoft/Internal/ReflectionServices.cs | 33 + .../src/Microsoft/Internal/Requires.cs | 41 + .../src/Properties/AssemblyInfo.cs | 18 + .../src/Strings.Designer.cs | 203 + .../src/Strings.resx | 165 + .../src/System.Composition.Convention.csproj | 68 + .../Convention/ConventionBuilder.cs | 351 + .../Convention/ExportConventionBuilder.cs | 140 + .../Convention/ImportConventionBuilder.cs | 177 + .../ParameterImportConventionBuilder.cs | 41 + .../Convention/PartConventionBuilder.cs | 822 + .../Convention/PartConventionBuilderOfT.cs | 359 + .../System/Composition/ExceptionBuilder.cs | 42 + .../AttributedModelConventionExtensions.cs | 48 + .../tests/ConventionBuilderTests.cs | 202 + .../tests/ExceptionAssert.cs | 324 + .../tests/ExportBuilderTests.cs | 135 + .../tests/ExportBuilderUnitTests.cs | 57 + .../ExportInterfacesContractExclusionTests.cs | 67 + .../tests/ImportBuilderTests.cs | 130 + .../tests/PartBuilderInheritanceTests.cs | 98 + .../tests/PartBuilderInterfaceTests.cs | 176 + .../tests/PartBuilderOfTInheritanceTests.cs | 96 + .../tests/PartBuilderOfTTests.cs | 554 + .../tests/PartBuilderTests.cs | 621 + .../tests/Properties/AssemblyInfo.cs | 18 + .../tests/RetryMode.cs | 13 + ...System.Composition.Convention.Tests.csproj | 81 + .../tests/project.json | 13 + .../tests/project.lock.json | 1283 + .../Assumes.InternalErrorException.cs | 23 + .../src/Microsoft/Internal/Assumes.cs | 115 + .../src/Microsoft/Internal/Requires.cs | 20 + .../src/Microsoft/Internal/ThrowHelper.cs | 55 + .../src/Properties/AssemblyInfo.cs | 18 + .../src/Properties/Resources.Designer.cs | 244 + .../src/Properties/Resources.resx | 181 + .../src/System.Composition.Hosting.csproj | 82 + .../Composition/Hosting/CompositionHost.cs | 88 + .../Hosting/Core/CompositeActivator.cs | 14 + .../Hosting/Core/CompositionDependency.cs | 159 + .../Hosting/Core/CompositionOperation.cs | 121 + .../Core/CycleBreakingExportDescriptor.cs | 49 + .../Core/CycleBreakingMetadataDictionary.cs | 117 + .../Hosting/Core/DependencyAccessor.cs | 81 + .../Hosting/Core/DirectExportDescriptor.cs | 27 + .../Hosting/Core/ExportDescriptor.cs | 36 + .../Hosting/Core/ExportDescriptorPromise.cs | 106 + .../Hosting/Core/ExportDescriptorProvider.cs | 53 + .../Hosting/Core/ExportDescriptorRegistry.cs | 56 + .../Core/ExportDescriptorRegistryUpdate.cs | 156 + .../Hosting/Core/LifetimeContext.cs | 222 + .../Composition/Hosting/Core/UpdateResult.cs | 59 + .../Hosting/Providers/Constants.cs | 27 + .../CurrentScopeExportDescriptorProvider.cs | 27 + .../ExportFactoryExportDescriptorProvider.cs | 64 + ...oryWithMetadataExportDescriptorProvider.cs | 71 + .../ImportManyExportDescriptorProvider.cs | 58 + .../Lazy/LazyExportDescriptorProvider.cs | 46 + ...azyWithMetadataExportDescriptorProvider.cs | 52 + .../Metadata/MetadataViewProvider.cs | 95 + .../Composition/Hosting/Util/Formatters.cs | 44 + .../Hosting/Util/MethodInfoExtensions.cs | 15 + .../Hosting/Util/SmallSparseInitonlyArray.cs | 101 + .../src/Properties/AssemblyInfo.cs | 18 + .../src/Properties/Resources.Designer.cs | 91 + .../src/Properties/Resources.resx | 129 + .../src/System.Composition.Runtime.csproj | 52 + .../System/Composition/CompositionContext.cs | 212 + .../System/Composition/ExportFactoryOfT.cs | 40 + .../Composition/ExportFactoryOfTTMetadata.cs | 37 + .../src/System/Composition/ExportOfT.cs | 53 + .../Hosting/CompositionFailedException.cs | 39 + .../Hosting/Core/CompositionContract.cs | 248 + .../Composition/Runtime/Util/Formatters.cs | 44 + .../src/Properties/AssemblyInfo.cs | 18 + .../src/Properties/Resources.Designer.cs | 163 + .../src/Properties/Resources.resx | 153 + .../src/System.Composition.TypedParts.csproj | 83 + .../CompositionContextExtensions.cs | 80 + .../AttributedModelProviderExtensions.cs | 49 + .../ContainerConfigurationDebuggerProxy.cs | 82 + .../Debugging/DiscoveredPartDebuggerProxy.cs | 36 + .../Hosting/ContainerConfiguration.cs | 220 + .../ActivationFeatures/ActivationFeature.cs | 46 + .../ActivationFeatures/DisposalFeature.cs | 33 + .../ActivationFeatures/LifetimeFeature.cs | 45 + .../OnImportsSatisfiedFeature.cs | 69 + .../ActivationFeatures/PropertyImportSite.cs | 27 + .../PropertyInjectionFeature.cs | 115 + .../Composition/TypedParts/ContractHelpers.cs | 102 + .../TypedParts/Discovery/DiscoveredExport.cs | 53 + .../Discovery/DiscoveredInstanceExport.cs | 30 + .../TypedParts/Discovery/DiscoveredPart.cs | 219 + .../Discovery/DiscoveredPropertyExport.cs | 47 + .../Discovery/ParameterImportSite.cs | 24 + .../TypedParts/Discovery/TypeInspector.cs | 239 + .../Composition/TypedParts/ImportInfo.cs | 23 + .../TypedPartExportDescriptorProvider.cs | 141 + .../TypedParts/Util/DirectAttributeContext.cs | 31 + src/System.Composition/System.Composition.sln | 92 + .../DictionaryExportDescriptorProvider.cs | 98 + .../KeyByMetadataAttribute.cs | 54 + ...ion.Demos.ExtendedCollectionImports.csproj | 51 + ...deredImportManyExportDescriptorProvider.cs | 78 + .../OrderedImportManyAttribute.cs | 36 + .../Properties/AssemblyInfo.cs | 15 + .../Util/Formatters.cs | 43 + src/System.Composition/perftests/App.config | 6 + src/System.Composition/perftests/Benchmark.cs | 19 + .../perftests/ControlBenchmark.cs | 29 + .../perftests/FiftyPerSecondTestBenchmark.cs | 33 + .../perftests/HugeGraph4Scenario.cs | 13277 ++++++++ .../perftests/HugeGraphBenchmark.cs | 90 + .../perftests/HugeGraphScenario.cs | 25293 ++++++++++++++++ ...osoft.Composition.ThroughputHarness.csproj | 67 + src/System.Composition/perftests/Program.cs | 153 + .../perftests/Properties/AssemblyInfo.cs | 19 + .../perftests/ShootoutWithNewBenchmark.cs | 83 + src/System.Composition/perftests/Suite.cs | 29 + .../perftests/ThroughputHarness.cs | 51 + .../perftests/WebBenchmarkScenario.cs | 132 + .../perftests/WebBenchmarks.cs | 125 + src/System.Composition/perftests/project.json | 18 + .../perftests/project.lock.json | 935 + .../TestLibrary/Properties/AssemblyInfo.cs | 13 + .../scenarios/TestLibrary/TestClass.cs | 56 + .../scenarios/TestLibrary/TestLibrary.csproj | 41 + .../tests/ActivationEventOrderingTests.cs | 43 + .../tests/CardinalityTests.cs | 53 + .../tests/CircularityTests.cs | 196 + .../CompositionContextExtensionsTests.cs | 27 + .../tests/ConcurrencyTests.cs | 40 + .../tests/ContainerTests.cs | 32 + src/System.Composition/tests/ContractTests.cs | 93 + .../tests/CustomerReportedMetadataBug.cs | 52 + .../tests/DictionaryImportTests.cs | 133 + .../tests/DiscoveryTests.cs | 135 + .../tests/ErrorMessageQualityTests.cs | 114 + .../tests/ExportDescriptorProviderTests.cs | 65 + .../tests/ExportFactoryTests.cs | 239 + .../tests/ExportMetadataDiscoveryTests.cs | 123 + .../tests/ImportManyTests.cs | 59 + .../tests/ImportOrderingTests.cs | 79 + .../tests/InheritanceTests.cs | 214 + src/System.Composition/tests/LazyTests.cs | 82 + .../tests/LightContainerTests.cs | 134 + .../tests/LooseImportsTests.cs | 34 + .../tests/MetadataConstraintTests.cs | 92 + src/System.Composition/tests/MetadataTests.cs | 143 + .../tests/MetadataViewGenerationTests.cs | 131 + .../tests/OpenGenericsTests.cs | 155 + .../tests/OptionalImportTests.cs | 75 + .../tests/Properties/AssemblyInfo.cs | 19 + .../tests/PropertyExportTests.cs | 53 + .../RegistrationBuilderCompatibilityTests.cs | 191 + src/System.Composition/tests/SharingTests.cs | 496 + .../tests/System.Composition.Tests.csproj | 102 + src/System.Composition/tests/Util/AssertX.cs | Bin 0 -> 8024 bytes src/System.Composition/tests/project.json | 13 + .../tests/project.lock.json | 1261 + 188 files changed, 59104 insertions(+) create mode 100644 src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/Convention/AttributedModelProvider.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/ImportingConstructorAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/MetadataAttributeAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/OnImportsSatisfiedAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/PartNotDiscoverableAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs create mode 100644 src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTrace.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceId.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceSource.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceSourceTraceWriter.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceWriter.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/AttributeServices.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Lock.Reader.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Lock.Writer.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/ReflectionServices.cs create mode 100644 src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs create mode 100644 src/System.Composition.Convention/src/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.Convention/src/Strings.Designer.cs create mode 100644 src/System.Composition.Convention/src/Strings.resx create mode 100644 src/System.Composition.Convention/src/System.Composition.Convention.csproj create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/ConventionBuilder.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/ExportConventionBuilder.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/ImportConventionBuilder.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/ParameterImportConventionBuilder.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilderOfT.cs create mode 100644 src/System.Composition.Convention/src/System/Composition/ExceptionBuilder.cs create mode 100644 src/System.Composition.Convention/tests/AttributedModelConventionExtensions.cs create mode 100644 src/System.Composition.Convention/tests/ConventionBuilderTests.cs create mode 100644 src/System.Composition.Convention/tests/ExceptionAssert.cs create mode 100644 src/System.Composition.Convention/tests/ExportBuilderTests.cs create mode 100644 src/System.Composition.Convention/tests/ExportBuilderUnitTests.cs create mode 100644 src/System.Composition.Convention/tests/ExportInterfacesContractExclusionTests.cs create mode 100644 src/System.Composition.Convention/tests/ImportBuilderTests.cs create mode 100644 src/System.Composition.Convention/tests/PartBuilderInheritanceTests.cs create mode 100644 src/System.Composition.Convention/tests/PartBuilderInterfaceTests.cs create mode 100644 src/System.Composition.Convention/tests/PartBuilderOfTInheritanceTests.cs create mode 100644 src/System.Composition.Convention/tests/PartBuilderOfTTests.cs create mode 100644 src/System.Composition.Convention/tests/PartBuilderTests.cs create mode 100644 src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.Convention/tests/RetryMode.cs create mode 100644 src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj create mode 100644 src/System.Composition.Convention/tests/project.json create mode 100644 src/System.Composition.Convention/tests/project.lock.json create mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.InternalErrorException.cs create mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.cs create mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Requires.cs create mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/ThrowHelper.cs create mode 100644 src/System.Composition.Hosting/src/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.Hosting/src/Properties/Resources.Designer.cs create mode 100644 src/System.Composition.Hosting/src/Properties/Resources.resx create mode 100644 src/System.Composition.Hosting/src/System.Composition.Hosting.csproj create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/CompositionHost.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositeActivator.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionDependency.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionOperation.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingExportDescriptor.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingMetadataDictionary.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DependencyAccessor.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DirectExportDescriptor.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptor.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorPromise.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistry.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistryUpdate.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/LifetimeContext.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Core/UpdateResult.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Constants.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/CurrentScope/CurrentScopeExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryWithMetadataExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ImportMany/ImportManyExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyWithMetadataExportDescriptorProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Metadata/MetadataViewProvider.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Util/Formatters.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Util/MethodInfoExtensions.cs create mode 100644 src/System.Composition.Hosting/src/System/Composition/Hosting/Util/SmallSparseInitonlyArray.cs create mode 100644 src/System.Composition.Runtime/src/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.Runtime/src/Properties/Resources.Designer.cs create mode 100644 src/System.Composition.Runtime/src/Properties/Resources.resx create mode 100644 src/System.Composition.Runtime/src/System.Composition.Runtime.csproj create mode 100644 src/System.Composition.Runtime/src/System/Composition/CompositionContext.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfT.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfTTMetadata.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/ExportOfT.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/Hosting/CompositionFailedException.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/Hosting/Core/CompositionContract.cs create mode 100644 src/System.Composition.Runtime/src/System/Composition/Runtime/Util/Formatters.cs create mode 100644 src/System.Composition.TypedParts/src/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition.TypedParts/src/Properties/Resources.Designer.cs create mode 100644 src/System.Composition.TypedParts/src/Properties/Resources.resx create mode 100644 src/System.Composition.TypedParts/src/System.Composition.TypedParts.csproj create mode 100644 src/System.Composition.TypedParts/src/System/Composition/CompositionContextExtensions.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/Convention/AttributedModelProviderExtensions.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/Debugging/ContainerConfigurationDebuggerProxy.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/Debugging/DiscoveredPartDebuggerProxy.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/Hosting/ContainerConfiguration.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/ActivationFeature.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/DisposalFeature.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/LifetimeFeature.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/OnImportsSatisfiedFeature.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyImportSite.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyInjectionFeature.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ContractHelpers.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredExport.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredInstanceExport.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPart.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPropertyExport.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/ParameterImportSite.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/TypeInspector.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/ImportInfo.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/TypedPartExportDescriptorProvider.cs create mode 100644 src/System.Composition.TypedParts/src/System/Composition/TypedParts/Util/DirectAttributeContext.cs create mode 100644 src/System.Composition/System.Composition.sln create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Dictionaries/DictionaryExportDescriptorProvider.cs create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/KeyByMetadataAttribute.cs create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Microsoft.Composition.Demos.ExtendedCollectionImports.csproj create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedCollections/OrderedImportManyExportDescriptorProvider.cs create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedImportManyAttribute.cs create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Util/Formatters.cs create mode 100644 src/System.Composition/perftests/App.config create mode 100644 src/System.Composition/perftests/Benchmark.cs create mode 100644 src/System.Composition/perftests/ControlBenchmark.cs create mode 100644 src/System.Composition/perftests/FiftyPerSecondTestBenchmark.cs create mode 100644 src/System.Composition/perftests/HugeGraph4Scenario.cs create mode 100644 src/System.Composition/perftests/HugeGraphBenchmark.cs create mode 100644 src/System.Composition/perftests/HugeGraphScenario.cs create mode 100644 src/System.Composition/perftests/Microsoft.Composition.ThroughputHarness.csproj create mode 100644 src/System.Composition/perftests/Program.cs create mode 100644 src/System.Composition/perftests/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition/perftests/ShootoutWithNewBenchmark.cs create mode 100644 src/System.Composition/perftests/Suite.cs create mode 100644 src/System.Composition/perftests/ThroughputHarness.cs create mode 100644 src/System.Composition/perftests/WebBenchmarkScenario.cs create mode 100644 src/System.Composition/perftests/WebBenchmarks.cs create mode 100644 src/System.Composition/perftests/project.json create mode 100644 src/System.Composition/perftests/project.lock.json create mode 100644 src/System.Composition/scenarios/TestLibrary/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition/scenarios/TestLibrary/TestClass.cs create mode 100644 src/System.Composition/scenarios/TestLibrary/TestLibrary.csproj create mode 100644 src/System.Composition/tests/ActivationEventOrderingTests.cs create mode 100644 src/System.Composition/tests/CardinalityTests.cs create mode 100644 src/System.Composition/tests/CircularityTests.cs create mode 100644 src/System.Composition/tests/CompositionContextExtensionsTests.cs create mode 100644 src/System.Composition/tests/ConcurrencyTests.cs create mode 100644 src/System.Composition/tests/ContainerTests.cs create mode 100644 src/System.Composition/tests/ContractTests.cs create mode 100644 src/System.Composition/tests/CustomerReportedMetadataBug.cs create mode 100644 src/System.Composition/tests/DictionaryImportTests.cs create mode 100644 src/System.Composition/tests/DiscoveryTests.cs create mode 100644 src/System.Composition/tests/ErrorMessageQualityTests.cs create mode 100644 src/System.Composition/tests/ExportDescriptorProviderTests.cs create mode 100644 src/System.Composition/tests/ExportFactoryTests.cs create mode 100644 src/System.Composition/tests/ExportMetadataDiscoveryTests.cs create mode 100644 src/System.Composition/tests/ImportManyTests.cs create mode 100644 src/System.Composition/tests/ImportOrderingTests.cs create mode 100644 src/System.Composition/tests/InheritanceTests.cs create mode 100644 src/System.Composition/tests/LazyTests.cs create mode 100644 src/System.Composition/tests/LightContainerTests.cs create mode 100644 src/System.Composition/tests/LooseImportsTests.cs create mode 100644 src/System.Composition/tests/MetadataConstraintTests.cs create mode 100644 src/System.Composition/tests/MetadataTests.cs create mode 100644 src/System.Composition/tests/MetadataViewGenerationTests.cs create mode 100644 src/System.Composition/tests/OpenGenericsTests.cs create mode 100644 src/System.Composition/tests/OptionalImportTests.cs create mode 100644 src/System.Composition/tests/Properties/AssemblyInfo.cs create mode 100644 src/System.Composition/tests/PropertyExportTests.cs create mode 100644 src/System.Composition/tests/RegistrationBuilderCompatibilityTests.cs create mode 100644 src/System.Composition/tests/SharingTests.cs create mode 100644 src/System.Composition/tests/System.Composition.Tests.csproj create mode 100644 src/System.Composition/tests/Util/AssertX.cs create mode 100644 src/System.Composition/tests/project.json create mode 100644 src/System.Composition/tests/project.lock.json diff --git a/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs b/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..db6cbba2c52d --- /dev/null +++ b/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +[assembly: ComVisible(false)] +[assembly: SecurityTransparent] diff --git a/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj b/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj new file mode 100644 index 000000000000..7a4f0f3c97f4 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj @@ -0,0 +1,46 @@ + + + + + + {C6257381-C624-494A-A9D9-5586E60856EA} + Library + Properties + System.Composition + System.Composition.AttributedModel + v4.5 + Profile259 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + true + 11.0 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/System.Composition.AttributedModel/src/System/Composition/Convention/AttributedModelProvider.cs b/src/System.Composition.AttributedModel/src/System/Composition/Convention/AttributedModelProvider.cs new file mode 100644 index 000000000000..a95278bb05b4 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/Convention/AttributedModelProvider.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace System.Composition.Convention +{ + /// + /// Provider of augmented reflection data in support of conventions. + /// + public abstract class AttributedModelProvider + { + /// + /// Provide the list of attributes applied to the specified member. + /// + /// The reflectedType the type used to retrieve the memberInfo. + /// The member to supply attributes for. + /// The list of applied attributes. + public abstract IEnumerable GetCustomAttributes(System.Type reflectedType, MemberInfo member); + + /// + /// The reflectedType the type used to retrieve the parameterInfo. + /// The member to supply attributes for. + /// The list of applied attributes. + /// + public abstract IEnumerable GetCustomAttributes(System.Type reflectedType, ParameterInfo parameter); + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs new file mode 100644 index 000000000000..cab20e1d32d2 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ExportAttribute.cs @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace System.Composition +{ + /// + /// Specifies that a type, property, field, or method provides a particular export. + /// + [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")] + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, + AllowMultiple = true, Inherited = false)] + public class ExportAttribute : Attribute + { + /// + /// Initializes a new instance of the class, exporting the + /// type or member marked with this attribute under the default contract name. + /// + public ExportAttribute() + : this((string)null, (Type)null) + { + } + + /// + /// Initializes a new instance of the class, exporting the + /// type or member marked with this attribute under a contract name derived from the + /// specified type. + /// + /// + /// A of which to derive the contract name to export the type or + /// member marked with this attribute, under; or to use the + /// default contract name. + /// + public ExportAttribute(Type contractType) + : this((string)null, contractType) + { + } + + /// + /// Initializes a new instance of the class, exporting the + /// type or member marked with this attribute under the specified contract name. + /// + /// + /// A containing the contract name to export the type or member + /// marked with this attribute, under; or or an empty string + /// ("") to use the default contract name. + /// + public ExportAttribute(string contractName) + : this(contractName, (Type)null) + { + } + + /// + /// Initializes a new instance of the class, exporting the + /// type or member marked with this attribute under the specified contract name. + /// + /// + /// A containing the contract name to export the type or member + /// marked with this attribute, under; or or an empty string + /// ("") to use the default contract name. + /// + /// + /// A of which to derive the contract name to export the type or + /// member marked with this attribute, under; or to use the + /// default contract name. + /// + public ExportAttribute(string contractName, Type contractType) + { + ContractName = contractName; + ContractType = contractType; + } + + /// + /// Gets the contract name to export the type or member under. + /// + /// + /// A containing the contract name to export the type or member + /// marked with this attribute, under. The default value is an empty string (""). + /// + public string ContractName { get; private set; } + + /// + /// Get the contract type that is exported by the member that this attribute is attached to. + /// + /// + /// A of the export that is be provided. The default value is + /// which means that the type will be obtained by looking at the type on + /// the member that this export is attached to. + /// + public Type ContractType { get; private set; } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs new file mode 100644 index 000000000000..3e36456664d6 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ExportMetadataAttribute.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// Specifies metadata for a type, property, field, or method marked with the + /// . + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Property, + AllowMultiple = true, Inherited = false)] + public sealed class ExportMetadataAttribute : Attribute + { + /// + /// Initializes a new instance of the with the + /// specified name and metadata value. + /// + /// + /// A containing the name of the metadata value; or + /// to set the property to an empty + /// string (""). + /// + /// + /// An containing the metadata value. This can be + /// . + /// + public ExportMetadataAttribute(string name, object value) + { + Name = name ?? string.Empty; + Value = value; + } + + /// + /// Gets the name of the metadata value. + /// + /// + /// A containing the name of the metadata value. + /// + public string Name { get; private set; } + + /// + /// Gets the metadata value. + /// + /// + /// An containing the metadata value. + /// + public object Value { get; private set; } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs new file mode 100644 index 000000000000..aedf6e9ecee6 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportAttribute.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace System.Composition +{ + /// + /// Specifies that a property, field, or parameter imports a particular export. + /// + [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")] + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, + AllowMultiple = false, Inherited = false)] + public class ImportAttribute : Attribute + { + /// + /// Initializes a new instance of the class, importing the + /// export without a contract name. + /// + public ImportAttribute() + : this((string)null) + { + } + + /// + /// Initializes a new instance of the class, importing the + /// export with the specified contract name. + /// + /// + /// A containing the contract name of the export to import, or + /// or an empty string ("") to use the default contract name. + /// + public ImportAttribute(string contractName) + { + ContractName = contractName; + } + + /// + /// Gets the contract name of the export to import. + /// + /// + /// A containing the contract name of the export to import. The + /// default value is null. + /// + public string ContractName { get; private set; } + + /// + /// Gets or sets a value indicating whether the property, field or parameter will be left + /// at its default value when an export with the contract name is not present in + /// the container. + /// + public bool AllowDefault { get; set; } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs new file mode 100644 index 000000000000..bff464ce4360 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportManyAttribute.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace System.Composition +{ + /// + /// Specifies that a property, field, or parameter imports a particular set of exports. + /// + [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")] + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, + AllowMultiple = false, Inherited = false)] + public class ImportManyAttribute : Attribute + { + /// + /// Initializes a new instance of the class, importing the + /// set of exports without a contract name. + /// + public ImportManyAttribute() + : this((string)null) + { + } + + /// + /// Initializes a new instance of the class, importing the + /// set of exports with the specified contract name. + /// + /// + /// A containing the contract name of the exports to import, or + /// . + /// + public ImportManyAttribute(string contractName) + { + ContractName = contractName; + } + + /// + /// Gets the contract name of the exports to import. + /// + /// + /// A containing the contract name of the exports to import. The + /// default value is null. + /// + public string ContractName { get; private set; } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs new file mode 100644 index 000000000000..11224d865f61 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportMetadataConstraintAttribute.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace System.Composition +{ + /// + /// When applied on an import, requires certain metadata values on the exporter. + /// + [AttributeUsage(AttributeTargets.Property, Inherited = false)] + public sealed class ImportMetadataConstraintAttribute : Attribute + { + private readonly string _name; + private readonly object _value; + + /// + /// Require a specific metadata value on the exporter. + /// + /// The name of the metadata item to match. + /// The value to match. + public ImportMetadataConstraintAttribute(string name, object value) + { + _name = name; + _value = value; + } + + /// + /// The metadata key to match. + /// + public string Name { get { return _name; } } + + /// + /// The value to match. + /// + public object Value { get { return _value; } } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/ImportingConstructorAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/ImportingConstructorAttribute.cs new file mode 100644 index 000000000000..c513b9d9cbb6 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/ImportingConstructorAttribute.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace System.Composition +{ + /// + /// Specifies that a constructor should be used when constructing an attributed part. + /// + /// + /// By default, only a default parameter-less constructor, if available, is used to + /// construct an attributed part. Use this attribute to indicate that a specific constructor + /// should be used. + /// + [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] + public sealed class ImportingConstructorAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + public ImportingConstructorAttribute() + { + } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/MetadataAttributeAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/MetadataAttributeAttribute.cs new file mode 100644 index 000000000000..fee84327d655 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/MetadataAttributeAttribute.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// Specifies that an attribute can be used to provide metadata for a type, property, field, + /// or method marked with the . + /// + [AttributeUsage(AttributeTargets.Class, + AllowMultiple = false, Inherited = true)] + public sealed class MetadataAttributeAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + public MetadataAttributeAttribute() + { + } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/OnImportsSatisfiedAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/OnImportsSatisfiedAttribute.cs new file mode 100644 index 000000000000..c3ca6261ec10 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/OnImportsSatisfiedAttribute.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// When applied to a void, parameterless instance method on a part, + /// MEF will call that method when composition of the part has + /// completed. The method must be public or internal. + /// + [AttributeUsage(AttributeTargets.Method, Inherited = false)] + public sealed class OnImportsSatisfiedAttribute : Attribute + { + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs new file mode 100644 index 000000000000..62194deec4d0 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/PartMetadataAttribute.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// Specifies metadata for a type to be used as a part. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] + public class PartMetadataAttribute : Attribute + { + /// + /// Initializes a new instance of the with the + /// specified name and metadata value. + /// + /// + /// A containing the name of the metadata value; or + /// to use an empty string (""). + /// + /// + /// An containing the metadata value. This can be + /// . + /// + public PartMetadataAttribute(string name, object value) + { + if (name == null) throw new ArgumentNullException("name"); + + Name = name; + Value = value; + } + + /// + /// Gets the name of the metadata value. + /// + /// + /// A containing the name of the metadata value. + /// + public string Name { get; private set; } + + /// + /// Gets the metadata value. + /// + /// + /// An containing the metadata value. + /// + public object Value { get; private set; } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/PartNotDiscoverableAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/PartNotDiscoverableAttribute.cs new file mode 100644 index 000000000000..3042da8c968d --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/PartNotDiscoverableAttribute.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// Place on a type that should not be discovered as a MEF part. + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] + public sealed class PartNotDiscoverableAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + public PartNotDiscoverableAttribute() + { + } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs new file mode 100644 index 000000000000..f62f2c9599af --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/SharedAttribute.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace System.Composition +{ + /// + /// Marks a part as being constrainted to sharing within the named boundary. + /// + /// + /// [Export, + /// Shared("HttpRequest")] + /// public class HttpResponseWriter { } + /// + /// + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public class SharedAttribute : PartMetadataAttribute + { + private const string SharingBoundaryPartMetadataName = "SharingBoundary"; + + /// + /// Mark a part as globally shared. + /// + public SharedAttribute() + : base(SharingBoundaryPartMetadataName, null) + { + } + + /// + /// Construct a for the specified + /// boundary name. + /// + /// The boundary outside of which this part is inaccessible. + public SharedAttribute(string sharingBoundaryName) + : base(SharingBoundaryPartMetadataName, sharingBoundaryName) + { + } + + /// + /// he boundary outside of which this part is inaccessible. + /// + public string SharingBoundary { get { return (string)base.Value; } } + } +} diff --git a/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs new file mode 100644 index 000000000000..04455b7cb191 --- /dev/null +++ b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.ObjectModel; + +namespace System.Composition +{ + /// + /// Applied to an import for ExportFactory{T}, this attribute marks the + /// boundary of a sharing scope. The ExportLifetimeContext{T} instances + /// returned from the factory will be boundaries for sharing of components that are bounded + /// by the listed boundary names. + /// + /// + /// [Import, SharingBoundary("HttpRequest")] + /// public ExportFactory<HttpRequestHandler> HandlerFactory { get; set; } + /// + /// + [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)] + [MetadataAttribute] + [CLSCompliant(false)] + public sealed class SharingBoundaryAttribute : Attribute + { + private readonly string[] _sharingBoundaryNames; + + private const string SharingBoundaryImportMetadataConstraintName = "SharingBoundaryNames"; + + /// + /// Construct a for the specified boundary names. + /// + /// Boundaries implemented by the created ExportLifetimeContext{T}s. + public SharingBoundaryAttribute(params string[] sharingBoundaryNames) + { + if (sharingBoundaryNames == null) throw new ArgumentNullException("boundaries"); + + _sharingBoundaryNames = sharingBoundaryNames; + } + + /// + /// Boundaries implemented by the created ExportLifetimeContext{T}s. + /// + public ReadOnlyCollection SharingBoundaryNames { get { return new ReadOnlyCollection(_sharingBoundaryNames); } } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTrace.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTrace.cs new file mode 100644 index 000000000000..d94575b065b7 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTrace.cs @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using Microsoft.Internal; +using System.Reflection; + +namespace Microsoft.Composition.Diagnostics +{ + internal static class CompositionTrace + { + internal static void Registration_ConstructorConventionOverridden(Type type) + { + Assumes.NotNull(type); + + if (CompositionTraceSource.CanWriteInformation) + { + CompositionTraceSource.WriteInformation(CompositionTraceId.Registration_ConstructorConventionOverridden, + Strings.Registration_ConstructorConventionOverridden, + type.FullName); + } + } + + internal static void Registration_TypeExportConventionOverridden(Type type) + { + Assumes.NotNull(type); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_TypeExportConventionOverridden, + Strings.Registration_TypeExportConventionOverridden, + type.FullName); + } + } + + internal static void Registration_MemberExportConventionOverridden(Type type, MemberInfo member) + { + Assumes.NotNull(type, member); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_MemberExportConventionOverridden, + Strings.Registration_MemberExportConventionOverridden, + member.Name, type.FullName); + } + } + + internal static void Registration_MemberImportConventionOverridden(Type type, MemberInfo member) + { + Assumes.NotNull(type, member); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_MemberImportConventionOverridden, + Strings.Registration_MemberImportConventionOverridden, + member.Name, type.FullName); + } + } + + internal static void Registration_OnSatisfiedImportNotificationOverridden(Type type, MemberInfo member) + { + Assumes.NotNull(type, member); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_OnSatisfiedImportNotificationOverridden, + Strings.Registration_OnSatisfiedImportNotificationOverridden, + member.Name, type.FullName); + } + } + + internal static void Registration_PartCreationConventionOverridden(Type type) + { + Assumes.NotNull(type); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_PartCreationConventionOverridden, + Strings.Registration_PartCreationConventionOverridden, + type.FullName); + } + } + + internal static void Registration_MemberImportConventionMatchedTwice(Type type, MemberInfo member) + { + Assumes.NotNull(type, member); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_MemberImportConventionMatchedTwice, + Strings.Registration_MemberImportConventionMatchedTwice, + member.Name, type.FullName); + } + } + + internal static void Registration_PartMetadataConventionOverridden(Type type) + { + Assumes.NotNull(type); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_PartMetadataConventionOverridden, + Strings.Registration_PartMetadataConventionOverridden, + type.FullName); + } + } + + internal static void Registration_ParameterImportConventionOverridden(ParameterInfo parameter, ConstructorInfo constructor) + { + Assumes.NotNull(parameter, constructor); + + if (CompositionTraceSource.CanWriteWarning) + { + CompositionTraceSource.WriteWarning(CompositionTraceId.Registration_ParameterImportConventionOverridden, + Strings.Registration_ParameterImportConventionOverridden, + parameter.Name, constructor.Name); + } + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceId.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceId.cs new file mode 100644 index 000000000000..01bc3469ad81 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceId.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace Microsoft.Composition.Diagnostics +{ + // NOTE: Do not change the trace ids of values that have already shipped, + // these leak out to TraceListerners which could take a dependency on them. + // This enum is a ushort deliberately, the maximum value of a trace id is 65535. + internal enum CompositionTraceId : ushort + { + // Registration + + Registration_ConstructorConventionOverridden = 101, + Registration_TypeExportConventionOverridden = 102, + Registration_MemberExportConventionOverridden = 103, + Registration_MemberImportConventionOverridden = 104, + Registration_PartCreationConventionOverridden = 105, + Registration_MemberImportConventionMatchedTwice = 106, + Registration_PartMetadataConventionOverridden = 107, + Registration_ParameterImportConventionOverridden = 108, + Registration_OnSatisfiedImportNotificationOverridden = 109, + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceSource.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceSource.cs new file mode 100644 index 000000000000..d12257399fe8 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/CompositionTraceSource.cs @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using Microsoft.Internal; + +namespace Microsoft.Composition.Diagnostics +{ + internal static class CompositionTraceSource + { +#if FEATURE_TRACING + private static readonly TraceSourceTraceWriter s_source = new TraceSourceTraceWriter(); +#else + private static readonly DebuggerTraceWriter s_source = new DebuggerTraceWriter(); +#endif + + public static bool CanWriteInformation + { + get { return s_source.CanWriteInformation; } + } + + public static bool CanWriteWarning + { + get { return s_source.CanWriteWarning; } + } + + public static bool CanWriteError + { + get { return s_source.CanWriteError; } + } + + public static void WriteInformation(CompositionTraceId traceId, string format, params object[] arguments) + { + EnsureEnabled(CanWriteInformation); + + s_source.WriteInformation(traceId, format, arguments); + } + + public static void WriteWarning(CompositionTraceId traceId, string format, params object[] arguments) + { + EnsureEnabled(CanWriteWarning); + + s_source.WriteWarning(traceId, format, arguments); + } + + public static void WriteError(CompositionTraceId traceId, string format, params object[] arguments) + { + EnsureEnabled(CanWriteError); + + s_source.WriteError(traceId, format, arguments); + } + + private static void EnsureEnabled(bool condition) + { + Assumes.IsTrue(condition, "To avoid unnecessary work when a trace level has not been enabled, check CanWriteXXX before calling this method."); + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs new file mode 100644 index 000000000000..a1aa239475ab --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !FEATURE_TRACING +using System; +using System.Diagnostics; +using System.Globalization; +using System.Text; + +namespace Microsoft.Composition.Diagnostics +{ + internal sealed class DebuggerTraceWriter : TraceWriter + { + private static readonly string s_sourceName = "System.Composition"; + + public override bool CanWriteInformation + { + get { return false; } + } + + public override bool CanWriteWarning + { + get { return false; /* Debugger.IsLogging(); */ } + } + + public override bool CanWriteError + { + get { return false; /* return Debugger.IsLogging(); */ } + } + + public override void WriteInformation(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Information, traceId, format, arguments); + } + + public override void WriteWarning(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Warning, traceId, format, arguments); + } + + public override void WriteError(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Error, traceId, format, arguments); + } + + private static void WriteEvent(TraceEventType eventType, CompositionTraceId traceId, string format, params object[] arguments) + { + if (true /* !Debugger.IsLogging() */) + { + return; + } + // string logMessage = CreateLogMessage(eventType, traceId, format, arguments); + /*Debugger.Log(0, null, logMessage);*/ + } + + internal static string CreateLogMessage(TraceEventType eventType, CompositionTraceId traceId, string format, params object[] arguments) + { + StringBuilder messageBuilder = new StringBuilder(); + + // Format taken from TraceListener.TraceEvent in full framework + messageBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0} {1}: {2} : ", + s_sourceName, eventType.ToString(), (int)traceId); + + if (arguments == null) + { + messageBuilder.Append(format); + } + else + { + messageBuilder.AppendFormat(CultureInfo.InvariantCulture, format, arguments); + } + + messageBuilder.AppendLine(); + + return messageBuilder.ToString(); + } + + // Copied from TraceEventType in full framework + internal enum TraceEventType + { + Error = 2, + Warning = 4, + Information = 8, + } + } +} + +#endif //!FEATURE_TRACING \ No newline at end of file diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceSourceTraceWriter.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceSourceTraceWriter.cs new file mode 100644 index 000000000000..2bbf00913a0b --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceSourceTraceWriter.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +#if FEATURE_TRACING + +using System; +using System.Diagnostics; +using Microsoft.Internal; + +namespace Microsoft.Composition.Diagnostics +{ + // Represents a trace writer that writes to a System.Diagnostics TraceSource + internal sealed class TraceSourceTraceWriter : TraceWriter + { + internal static readonly TraceSource Source = new TraceSource("Microsoft.Composition", SourceLevels.Warning); + + public override bool CanWriteInformation + { + get { return Source.Switch.ShouldTrace(TraceEventType.Information); } + } + + public override bool CanWriteWarning + { + get { return Source.Switch.ShouldTrace(TraceEventType.Warning); } + } + + public override bool CanWriteError + { + get { return Source.Switch.ShouldTrace(TraceEventType.Error); } + } + + public override void WriteInformation(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Information, traceId, format, arguments); + } + + public override void WriteWarning(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Warning, traceId, format, arguments); + } + + public override void WriteError(CompositionTraceId traceId, string format, params object[] arguments) + { + WriteEvent(TraceEventType.Error, traceId, format, arguments); + } + + private static void WriteEvent(TraceEventType eventType, CompositionTraceId traceId, string format, params object[] arguments) + { + Source.TraceEvent(eventType, (int)traceId, format, arguments); + } + } +} + +#endif //FEATURE_TRACING \ No newline at end of file diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceWriter.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceWriter.cs new file mode 100644 index 000000000000..a7c5d5eca480 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/TraceWriter.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace Microsoft.Composition.Diagnostics +{ + internal abstract class TraceWriter + { + public abstract bool CanWriteInformation { get; } + + public abstract bool CanWriteWarning { get; } + + public abstract bool CanWriteError { get; } + + public abstract void WriteInformation(CompositionTraceId traceId, string format, params object[] arguments); + + public abstract void WriteWarning(CompositionTraceId traceId, string format, params object[] arguments); + + public abstract void WriteError(CompositionTraceId traceId, string format, params object[] arguments); + } +} + diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs new file mode 100644 index 000000000000..31b3da0fe8c5 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.Serialization; + +namespace Microsoft.Internal +{ + internal partial class Assumes + { + // The exception that is thrown when an internal assumption failed. + [SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic")] + private sealed class InternalErrorException : Exception + { + public InternalErrorException(string message) + : base(string.Format(CultureInfo.CurrentCulture, Strings.InternalExceptionMessage, message)) + { + } + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs new file mode 100644 index 000000000000..afbb070e8d2a --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.Serialization; + +namespace Microsoft.Internal +{ + internal static partial class Assumes + { + [DebuggerStepThrough] + internal static void NotNull(T value) + where T : class + { + IsTrue(value != null); + } + + [DebuggerStepThrough] + internal static void NotNull(T1 value1, T2 value2) + where T1 : class + where T2 : class + { + NotNull(value1); + NotNull(value2); + } + + [DebuggerStepThrough] + internal static void NotNull(T1 value1, T2 value2, T3 value3) + where T1 : class + where T2 : class + where T3 : class + { + NotNull(value1); + NotNull(value2); + NotNull(value3); + } + + [DebuggerStepThrough] + internal static void NotNullOrEmpty(string value) + { + NotNull(value); + IsTrue(value.Length > 0); + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition) + { + if (!condition) + { + throw UncatchableException(null); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message) + { + if (!condition) + { + throw UncatchableException(message); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0, object arg1) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0, arg1)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0, object arg1, object arg2) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0, arg1, arg2)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, params object[] args) + { + if (!condition) + { + throw UncatchableException(String.Format(message, args)); + } + } + + [DebuggerStepThrough] + internal static T NotReachable() + { + throw UncatchableException("Code path should never be reached!"); + } + + [DebuggerStepThrough] + private static Exception UncatchableException(/*[Localizable(false)]*/string message) + { + return new InternalErrorException(message); + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/AttributeServices.cs b/src/System.Composition.Convention/src/Microsoft/Internal/AttributeServices.cs new file mode 100644 index 000000000000..50bcabcb6460 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/AttributeServices.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Microsoft.Internal +{ + internal static class AttributeServices + { + // MemberInfo Attribute helpers + public static IEnumerable GetAttributes(this MemberInfo memberInfo) where T : System.Attribute + { + return memberInfo.GetCustomAttributes(false); + } + + public static IEnumerable GetAttributes(this MemberInfo memberInfo, bool inherit) where T : System.Attribute + { + return memberInfo.GetCustomAttributes(inherit); + } + + public static T GetFirstAttribute(this MemberInfo memberInfo) where T : System.Attribute + { + return GetAttributes(memberInfo).FirstOrDefault(); + } + + public static T GetFirstAttribute(this MemberInfo memberInfo, bool inherit) where T : System.Attribute + { + return GetAttributes(memberInfo, inherit).FirstOrDefault(); + } + + public static bool IsAttributeDefined(this MemberInfo memberInfo) where T : System.Attribute + { + return memberInfo.IsDefined(typeof(T), false); + } + + public static bool IsAttributeDefined(this MemberInfo memberInfo, bool inherit) where T : System.Attribute + { + return memberInfo.IsDefined(typeof(T), inherit); + } + + + // ParameterInfo Attribute helpers + public static IEnumerable GetAttributes(this ParameterInfo parameterInfo) where T : System.Attribute + { + return parameterInfo.GetCustomAttributes(false); + } + + public static IEnumerable GetAttributes(this ParameterInfo parameterInfo, bool inherit) where T : System.Attribute + { + return parameterInfo.GetCustomAttributes(inherit); + } + + public static T GetFirstAttribute(this ParameterInfo parameterInfo) where T : System.Attribute + { + return GetAttributes(parameterInfo).FirstOrDefault(); + } + + public static T GetFirstAttribute(this ParameterInfo parameterInfo, bool inherit) where T : System.Attribute + { + return GetAttributes(parameterInfo, inherit).FirstOrDefault(); + } + + public static bool IsAttributeDefined(this ParameterInfo parameterInfo) where T : System.Attribute + { + return parameterInfo.IsDefined(typeof(T), false); + } + + public static bool IsAttributeDefined(this ParameterInfo parameterInfo, bool inherit) where T : System.Attribute + { + return parameterInfo.IsDefined(typeof(T), inherit); + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Reader.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Reader.cs new file mode 100644 index 000000000000..49ff02ada31f --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Reader.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Microsoft.Internal +{ + internal struct ReadLock : IDisposable + { + private readonly Lock _lock; + private int _isDisposed; + + public ReadLock(Lock @lock) + { + _isDisposed = 0; + _lock = @lock; + _lock.EnterReadLock(); + } + + public void Dispose() + { + if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) == 0) + { + _lock.ExitReadLock(); + } + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Writer.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Writer.cs new file mode 100644 index 000000000000..bb9a02cff86b --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.Writer.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Microsoft.Internal +{ + internal struct WriteLock : IDisposable + { + private readonly Lock _lock; + private int _isDisposed; + + public WriteLock(Lock @lock) + { + _isDisposed = 0; + _lock = @lock; + _lock.EnterWriteLock(); + } + + public void Dispose() + { + if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) == 0) + { + _lock.ExitWriteLock(); + } + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs new file mode 100644 index 000000000000..584eec84af10 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Microsoft.Internal +{ + internal sealed class Lock : IDisposable + { +#if FEATURE_SLIMLOCK + private readonly ReaderWriterLockSlim _thisLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); + private int _isDisposed = 0; + public void EnterReadLock() + { + _thisLock.EnterReadLock(); + } + + public void EnterWriteLock() + { + _thisLock.EnterWriteLock(); + } + + public void ExitReadLock() + { + _thisLock.ExitReadLock(); + } + + public void ExitWriteLock() + { + _thisLock.ExitWriteLock(); + } + + public void Dispose() + { + if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) == 0) + { + _thisLock.Dispose(); + } + } + +#else + // ReaderWriterLockSlim is not yet implemented on SilverLight + // Satisfies our requirements until it is implemented + private readonly object _thisLock = new object(); + + public Lock() + { + } + + public void EnterReadLock() + { + Monitor.Enter(_thisLock); + } + + public void EnterWriteLock() + { + Monitor.Enter(_thisLock); + } + + public void ExitReadLock() + { + Monitor.Exit(_thisLock); + } + + public void ExitWriteLock() + { + Monitor.Exit(_thisLock); + } + + public void Dispose() + { + } +#endif //FEATURE_SLIMLOCK + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/ReflectionServices.cs b/src/System.Composition.Convention/src/Microsoft/Internal/ReflectionServices.cs new file mode 100644 index 000000000000..ec6cefecf47c --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/ReflectionServices.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Microsoft.Internal +{ + internal static class ReflectionServices + { + public static bool IsMemberInfoForType(this MemberInfo memberInfo) + { + return memberInfo is TypeInfo; + } + + public static bool IsMemberInfoForProperty(this MemberInfo memberInfo) + { + return memberInfo is PropertyInfo; + } + + public static bool IsMemberInfoForConstructor(this MemberInfo memberInfo) + { + return memberInfo is ConstructorInfo; + } + + public static bool IsMemberInfoForMethod(this MemberInfo memberInfo) + { + return memberInfo is MethodInfo; + } + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs new file mode 100644 index 000000000000..02234b7f0377 --- /dev/null +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Reflection; + +namespace Microsoft.Internal +{ + internal static class Requires + { + [DebuggerStepThrough] + [ContractArgumentValidator] + public static void NotNull(T value, string parameterName) + where T : class + { + if (value == null) + { + throw new ArgumentNullException(parameterName); + } + Contract.EndContractBlock(); + } + + [DebuggerStepThrough] + [ContractArgumentValidator] + public static void NotNullOrEmpty(string value, string parameterName) + { + NotNull(value, parameterName); + + if (value.Length == 0) + { + throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.ArgumentException_EmptyString, parameterName), parameterName); + } + Contract.EndContractBlock(); + } + } +} diff --git a/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs b/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..db6cbba2c52d --- /dev/null +++ b/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +[assembly: ComVisible(false)] +[assembly: SecurityTransparent] diff --git a/src/System.Composition.Convention/src/Strings.Designer.cs b/src/System.Composition.Convention/src/Strings.Designer.cs new file mode 100644 index 000000000000..2c68b1912286 --- /dev/null +++ b/src/System.Composition.Convention/src/Strings.Designer.cs @@ -0,0 +1,203 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.16815 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Internal { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Composition.Convention.Strings", typeof(Strings).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to The value of argument '{0}' is not supported. The expression must use operator new.. + /// + internal static string Argument_ExpressionMustBeNew { + get { + return ResourceManager.GetString("Argument_ExpressionMustBeNew", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value of argument '{0}' is not supported. The expression must be a property member expression.. + /// + internal static string Argument_ExpressionMustBePropertyMember { + get { + return ResourceManager.GetString("Argument_ExpressionMustBePropertyMember", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value of argument '{0}' is not supported. The expression must be a void Method() member expression. + /// + internal static string Argument_ExpressionMustBeVoidMethodWithNoArguments + { + get + { + return ResourceManager.GetString("Argument_ExpressionMustBeVoidMethodWithNoArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' cannot be an empty string ("").. + /// + internal static string ArgumentException_EmptyString { + get { + return ResourceManager.GetString("ArgumentException_EmptyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value of argument '{0}' ({1}) is not supported. Allowed values are : '{2}'.. + /// + internal static string ArgumentOutOfRange_InvalidEnumInSet { + get { + return ResourceManager.GetString("ArgumentOutOfRange_InvalidEnumInSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal error occurred. Additional information: '{0}'.. + /// + internal static string InternalExceptionMessage { + get { + return ResourceManager.GetString("InternalExceptionMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A constructor selection convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_ConstructorConventionOverridden { + get { + return ResourceManager.GetString("Registration_ConstructorConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An Export specification convention that would apply to Member '{0}' of type '{1}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_MemberExportConventionOverridden { + get { + return ResourceManager.GetString("Registration_MemberExportConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only one import specification convention can apply to a single Member. More than one convention specification applies to this Member '{1}' of Type '{0}'.. + /// + internal static string Registration_MemberImportConventionMatchedTwice { + get { + return ResourceManager.GetString("Registration_MemberImportConventionMatchedTwice", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An Import specification convention that would apply to Member '{0}' of type '{1}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_MemberImportConventionOverridden { + get { + return ResourceManager.GetString("Registration_MemberImportConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A OnSatisfiedImport specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_OnSatisfiedImportNotificationOverridden { + get + { + return ResourceManager.GetString("Registration_OnSatisfiedImportNotificationOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A ParameterImport specification convention that would apply to Parameter '{0}' of Constructor '{1}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_ParameterImportConventionOverridden { + get { + return ResourceManager.GetString("Registration_ParameterImportConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A PartCreationPolicy specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_PartCreationConventionOverridden { + get { + return ResourceManager.GetString("Registration_PartCreationConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A PartMetadata specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_PartMetadataConventionOverridden { + get { + return ResourceManager.GetString("Registration_PartMetadataConventionOverridden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An Export specification convention that would apply to type '{0}' has been overridden by attributes applied in the source file or by a prior convention.. + /// + internal static string Registration_TypeExportConventionOverridden { + get { + return ResourceManager.GetString("Registration_TypeExportConventionOverridden", resourceCulture); + } + } + + } +} diff --git a/src/System.Composition.Convention/src/Strings.resx b/src/System.Composition.Convention/src/Strings.resx new file mode 100644 index 000000000000..5c1bf1eac188 --- /dev/null +++ b/src/System.Composition.Convention/src/Strings.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + '{0}' cannot be an empty string (""). + + + The value of argument '{0}' ({1}) is not supported. Allowed values are : '{2}'. + + + The value of argument '{0}' is not supported. The expression must use operator new. + + + The value of argument '{0}' is not supported. The expression must be a property member expression. + + + Internal error occurred. Additional information: '{0}'. + + + A constructor selection convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention. + + + An Export specification convention that would apply to type '{0}' has been overridden by attributes applied in the source file or by a prior convention. + + + An Export specification convention that would apply to Member '{0}' of type '{1}' has been overridden by attributes applied in the source file or by a prior convention. + + + An Import specification convention that would apply to Member '{0}' of type '{1}' has been overridden by attributes applied in the source file or by a prior convention. + + + Only one import specification convention can apply to a single Member. More than one convention specification applies to this Member '{0}' of Type '{1}'. + + + A ParameterImport specification convention that would apply to Parameter '{0}' of Constructor '{1}' has been overridden by attributes applied in the source file or by a prior convention. + + + A PartCreationPolicy specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention. + + + A PartMetadata specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention. + + + The value of argument '{0}' is not supported. The expression must be a void Method() member expression. + + + A OnSatisfiedImports specification convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention. + + \ No newline at end of file diff --git a/src/System.Composition.Convention/src/System.Composition.Convention.csproj b/src/System.Composition.Convention/src/System.Composition.Convention.csproj new file mode 100644 index 000000000000..f6a42f610d8b --- /dev/null +++ b/src/System.Composition.Convention/src/System.Composition.Convention.csproj @@ -0,0 +1,68 @@ + + + + + + {E6592FAD-10B5-4B56-9287-D72DD136992F} + Library + Properties + System.Composition.Convention + System.Composition.Convention + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + true + 11.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + + + + + + diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/ConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/ConventionBuilder.cs new file mode 100644 index 000000000000..11abd1d907c0 --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/ConventionBuilder.cs @@ -0,0 +1,351 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; + +using Microsoft.Internal; + +namespace System.Composition.Convention +{ + /// + /// Entry point for defining rules that configure plain-old-CLR-objects as MEF parts. + /// + public class ConventionBuilder : AttributedModelProvider + { + private static readonly List s_emptyList = new List(); + + private readonly Lock _lock = new Lock(); + private readonly List _conventions = new List(); + + private readonly Dictionary> _memberInfos = new Dictionary>(); + private readonly Dictionary> _parameters = new Dictionary>(); + + /// + /// Construct a new . + /// + public ConventionBuilder() + { + } + + /// + /// Define a rule that will apply to all types that + /// derive from (or implement) the specified type. + /// + /// The type from which matching types derive. + /// A that must be used to specify the rule. + public PartConventionBuilder ForTypesDerivedFrom() + { + var partBuilder = new PartConventionBuilder((t) => IsDescendentOf(t, typeof(T))); + _conventions.Add(partBuilder); + return partBuilder; + } + + /// + /// Define a rule that will apply to all types that + /// derive from (or implement) the specified type. + /// + /// The type from which matching types derive. + /// A that must be used to specify the rule. + public PartConventionBuilder ForTypesDerivedFrom(Type type) + { + Requires.NotNull(type, "type"); + + var partBuilder = new PartConventionBuilder((t) => IsDescendentOf(t, type)); + _conventions.Add(partBuilder); + return partBuilder; + } + + /// + /// Define a rule that will apply to the types . + /// + /// The type to which the rule applies. + /// A that must be used to specify the rule. + public PartConventionBuilder ForType() + { + var partBuilder = new PartConventionBuilder((t) => t == typeof(T)); + _conventions.Add(partBuilder); + return partBuilder; + } + + /// + /// Define a rule that will apply to the types . + /// + /// The type to which the rule applies. + /// A that must be used to specify the rule. + public PartConventionBuilder ForType(Type type) + { + Requires.NotNull(type, "type"); + + var partBuilder = new PartConventionBuilder((t) => t == type); + _conventions.Add(partBuilder); + return partBuilder; + } + + /// + /// Define a rule that will apply to types assignable to that + /// match the supplied predicate. + /// + /// A predicate that selects matching types. + /// The type to which the rule applies. + /// A that must be used to specify the rule. + public PartConventionBuilder ForTypesMatching(Predicate typeFilter) + { + Requires.NotNull(typeFilter, "typeFilter"); + + var partBuilder = new PartConventionBuilder(typeFilter); + _conventions.Add(partBuilder); + return partBuilder; + } + + /// + /// Define a rule that will apply to types that + /// match the supplied predicate. + /// + /// A predicate that selects matching types. + /// A that must be used to specify the rule. + public PartConventionBuilder ForTypesMatching(Predicate typeFilter) + { + Requires.NotNull(typeFilter, "typeFilter"); + + var partBuilder = new PartConventionBuilder(typeFilter); + _conventions.Add(partBuilder); + return partBuilder; + } + + private IEnumerable>> EvaluateThisTypeInfoAgainstTheConvention(TypeInfo typeInfo) + { + List>> results = new List>>(); + List attributes = new List(); + var configuredMembers = new List>>(); + bool specifiedConstructor = false; + bool matchedConvention = false; + var type = typeInfo.AsType(); + + foreach (var builder in _conventions.Where(c => c.SelectType(type))) + { + attributes.AddRange(builder.BuildTypeAttributes(type)); + + specifiedConstructor |= builder.BuildConstructorAttributes(type, ref configuredMembers); + builder.BuildPropertyAttributes(type, ref configuredMembers); + builder.BuildOnImportsSatisfiedNotification(type, ref configuredMembers); + + matchedConvention = true; + } + if (matchedConvention && !specifiedConstructor) + { + // DefaultConstructor + PartConventionBuilder.BuildDefaultConstructorAttributes(type, ref configuredMembers); + } + configuredMembers.Add(Tuple.Create((object)type.GetTypeInfo(), attributes)); + return configuredMembers; + } + + /// + /// Provide the list of attributes applied to the specified member. + /// + /// The reflectedType the type used to retrieve the memberInfo. + /// The member to supply attributes for. + /// The list of applied attributes. + public override IEnumerable GetCustomAttributes(Type reflectedType, System.Reflection.MemberInfo member) + { + Requires.NotNull(member, "member"); + + // Now edit the attributes returned from the base type + List cachedAttributes = null; + var typeInfo = member as TypeInfo; + if (typeInfo != null) + { + var memberInfo = typeInfo as MemberInfo; + using (new ReadLock(_lock)) + { + _memberInfos.TryGetValue(memberInfo, out cachedAttributes); + } + if (cachedAttributes == null) + { + using (new WriteLock(_lock)) + { + //Double check locking another thread may have inserted one while we were away. + if (!_memberInfos.TryGetValue(memberInfo, out cachedAttributes)) + { + List attributeList; + foreach (var element in EvaluateThisTypeInfoAgainstTheConvention(typeInfo)) + { + attributeList = element.Item2; + if (attributeList != null) + { + var mi = element.Item1 as MemberInfo; + if (mi != null) + { + List memberAttributes; + + if (mi != null && (mi.IsMemberInfoForConstructor() || mi.IsMemberInfoForType() || mi.IsMemberInfoForProperty() || mi.IsMemberInfoForMethod())) + { + if (!_memberInfos.TryGetValue(mi, out memberAttributes)) + { + _memberInfos.Add(mi, element.Item2); + } + } + } + else + { + var pi = element.Item1 as ParameterInfo; + Assumes.NotNull(pi); + List parameterAttributes; + + // Item contains as Constructor parameter to configure + if (!_parameters.TryGetValue(pi, out parameterAttributes)) + { + _parameters.Add(pi, element.Item2); + } + } + } + } + } + + // We will have updated all of the MemberInfos by now so lets reload cachedAttributes wiuth the current store + _memberInfos.TryGetValue(memberInfo, out cachedAttributes); + } + } + } + else if (member.IsMemberInfoForProperty() || member.IsMemberInfoForConstructor() || member.IsMemberInfoForMethod()) + { + cachedAttributes = ReadMemberCustomAttributes(reflectedType, member); + } + + IEnumerable appliedAttributes; + if (!(member is TypeInfo) && member.DeclaringType != reflectedType) + appliedAttributes = Enumerable.Empty(); + else + appliedAttributes = member.GetCustomAttributes(false); + + return cachedAttributes == null ? appliedAttributes : appliedAttributes.Concat(cachedAttributes); + } + + private List ReadMemberCustomAttributes(Type reflectedType, System.Reflection.MemberInfo member) + { + List cachedAttributes = null; + bool getMemberAttributes = false; + + // Now edit the attributes returned from the base type + using (new ReadLock(_lock)) + { + if (!_memberInfos.TryGetValue(member, out cachedAttributes)) + { + // If there is nothing for this member Cache any attributes for the DeclaringType + if (reflectedType != null + && !_memberInfos.TryGetValue(member.DeclaringType.GetTypeInfo() as MemberInfo, out cachedAttributes)) + { + // If there is nothing for this parameter look to see if the declaring Member has been cached yet? + // need to do it outside of the lock, so set the flag we'll check it in a bit + getMemberAttributes = true; + } + cachedAttributes = null; + } + } + + if (getMemberAttributes) + { + GetCustomAttributes(null, reflectedType.GetTypeInfo() as MemberInfo); + + // We should have run the rules for the enclosing parameter so we can again + using (new ReadLock(_lock)) + { + _memberInfos.TryGetValue(member, out cachedAttributes); + } + } + + return cachedAttributes; + } + + /// + /// Provide the list of attributes applied to the specified parameter. + /// + /// The reflectedType the type used to retrieve the parameterInfo. + /// The parameter to supply attributes for. + /// The list of applied attributes. + public override IEnumerable GetCustomAttributes(Type reflectedType, System.Reflection.ParameterInfo parameter) + { + Requires.NotNull(parameter, "reflectedType"); + Requires.NotNull(parameter, "parameter"); + var attributes = parameter.GetCustomAttributes(false); + List cachedAttributes = ReadParameterCustomAttributes(reflectedType, parameter); + return cachedAttributes == null ? attributes : attributes.Concat(cachedAttributes); + } + + private List ReadParameterCustomAttributes(Type reflectedType, System.Reflection.ParameterInfo parameter) + { + List cachedAttributes = null; + bool getMemberAttributes = false; + + // Now edit the attributes returned from the base type + using (new ReadLock(_lock)) + { + if (!_parameters.TryGetValue(parameter, out cachedAttributes)) + { + // If there is nothing for this parameter Cache any attributes for the DeclaringType + if (reflectedType != null + && !_memberInfos.TryGetValue(reflectedType.GetTypeInfo() as MemberInfo, out cachedAttributes)) + { + // If there is nothing for this parameter look to see if the declaring Member has been cached yet? + // need to do it outside of the lock, so set the flag we'll check it in a bit + getMemberAttributes = true; + } + cachedAttributes = null; + } + } + + if (getMemberAttributes) + { + GetCustomAttributes(null, reflectedType.GetTypeInfo() as MemberInfo); + + // We should have run the rules for the enclosing parameter so we can again + using (new ReadLock(_lock)) + { + _parameters.TryGetValue(parameter, out cachedAttributes); + } + } + + return cachedAttributes; + } + + private static bool IsGenericDescendentOf(TypeInfo openType, TypeInfo baseType) + { + if (openType.BaseType == null) + return false; + + if (openType.BaseType == baseType.AsType()) + return true; + + foreach (var iface in openType.ImplementedInterfaces) + { + if (iface.IsConstructedGenericType && + iface.GetGenericTypeDefinition() == baseType.AsType()) + return true; + } + + return IsGenericDescendentOf(openType.BaseType.GetTypeInfo(), baseType); + } + + private static bool IsDescendentOf(Type type, Type baseType) + { + if (type == baseType || type == typeof(object) || type == null) + { + return false; + } + + var ti = type.GetTypeInfo(); + var bti = baseType.GetTypeInfo(); + + if (ti.IsGenericTypeDefinition) + { + return IsGenericDescendentOf(ti, bti); + } + + return bti.IsAssignableFrom(ti); + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/ExportConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/ExportConventionBuilder.cs new file mode 100644 index 000000000000..c6e804dbf25e --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/ExportConventionBuilder.cs @@ -0,0 +1,140 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Linq; +using System.Text; +using System.Reflection; + +using Microsoft.Internal; + +namespace System.Composition.Convention +{ + /// + /// Configures an export associated with a part. + /// + public sealed class ExportConventionBuilder + { + private string _contractName; + private Type _contractType; + private List> _metadataItems; + private List>> _metadataItemFuncs; + private Func _getContractNameFromPartType; + + internal ExportConventionBuilder() { } + + /// + /// Specify the contract type for the export. + /// + /// The contract type. + /// An export builder allowing further configuration. + public ExportConventionBuilder AsContractType() + { + return AsContractType(typeof(T)); + } + + /// + /// Specify the contract type for the export. + /// + /// The contract type. + /// An export builder allowing further configuration. + public ExportConventionBuilder AsContractType(Type type) + { + Requires.NotNull(type, "type"); + _contractType = type; + return this; + } + + /// + /// Specify the contract name for the export. + /// + /// The contract name. + /// An export builder allowing further configuration. + public ExportConventionBuilder AsContractName(string contractName) + { + Requires.NotNullOrEmpty(contractName, "contractName"); + _contractName = contractName; + return this; + } + + /// + /// Specify the contract name for the export. + /// + /// A Func to retrieve the contract name from the part typeThe contract name. + /// An export builder allowing further configuration. + public ExportConventionBuilder AsContractName(Func getContractNameFromPartType) + { + Requires.NotNull(getContractNameFromPartType, "getContractNameFromPartType"); + _getContractNameFromPartType = getContractNameFromPartType; + return this; + } + + /// + /// Add export metadata to the export. + /// + /// The name of the metadata item. + /// The value of the metadata item. + /// An export builder allowing further configuration. + public ExportConventionBuilder AddMetadata(string name, object value) + { + Requires.NotNullOrEmpty(name, "name"); + if (_metadataItems == null) + { + _metadataItems = new List>(); + } + _metadataItems.Add(Tuple.Create(name, value)); + return this; + } + + /// + /// Add export metadata to the export. + /// + /// The name of the metadata item. + /// A function that calculates the metadata value based on the type. + /// An export builder allowing further configuration. + public ExportConventionBuilder AddMetadata(string name, Func getValueFromPartType) + { + Requires.NotNullOrEmpty(name, "name"); + Requires.NotNull(getValueFromPartType, "getValueFromPartType"); + if (_metadataItemFuncs == null) + { + _metadataItemFuncs = new List>>(); + } + _metadataItemFuncs.Add(Tuple.Create(name, getValueFromPartType)); + return this; + } + + internal void BuildAttributes(Type type, ref List attributes) + { + if (attributes == null) + { + attributes = new List(); + } + + var contractName = (_getContractNameFromPartType != null) ? _getContractNameFromPartType(type) : _contractName; + attributes.Add(new ExportAttribute(contractName, _contractType)); + + //Add metadata attributes from direct specification + if (_metadataItems != null) + { + foreach (var item in _metadataItems) + { + attributes.Add(new ExportMetadataAttribute(item.Item1, item.Item2)); + } + } + + //Add metadata attributes from func specification + if (_metadataItemFuncs != null) + { + foreach (var item in _metadataItemFuncs) + { + var name = item.Item1; + var value = (item.Item2 != null) ? item.Item2(type) : null; + attributes.Add(new ExportMetadataAttribute(name, value)); + } + } + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/ImportConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/ImportConventionBuilder.cs new file mode 100644 index 000000000000..24e273a94d45 --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/ImportConventionBuilder.cs @@ -0,0 +1,177 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Composition; +using System.Linq; +using System.Reflection; +using System.Text; +using Microsoft.Internal; + +namespace System.Composition.Convention +{ + /// + /// Configures an import associated with a part. + /// + public sealed class ImportConventionBuilder + { + private static readonly Type[] s_supportedImportManyTypes = new[] { typeof(IList<>), typeof(ICollection<>), typeof(IEnumerable<>) }; + + private string _contractName; + private bool? _asMany; + private bool _allowDefault; + private Func _getContractNameFromPartType; + private List> _metadataConstraintItems; + private List>> _metadataConstraintItemFuncs; + + internal ImportConventionBuilder() { } + + /// + /// Specify the contract name for the import. + /// + /// + /// An import builder allowing further configuration. + public ImportConventionBuilder AsContractName(string contractName) + { + Requires.NotNullOrEmpty(contractName, "contractName"); + _contractName = contractName; + return this; + } + + /// + /// Specify the contract name for the export. + /// + /// A Func to retrieve the contract name from the part typeThe contract name. + /// An export builder allowing further configuration. + public ImportConventionBuilder AsContractName(Func getContractNameFromPartType) + { + Requires.NotNull(getContractNameFromPartType, "getContractNameFromPartType"); + _getContractNameFromPartType = getContractNameFromPartType; + return this; + } + + /// + /// Configure the import to receive all exports of the contract. + /// + /// An import builder allowing further configuration. + public ImportConventionBuilder AsMany() + { + return AsMany(true); + } + + /// + /// Configure the import to receive all exports of the contract. + /// + /// True if the import receives all values; otherwise false. + /// An import builder allowing further configuration. + public ImportConventionBuilder AsMany(bool isMany) + { + _asMany = isMany; + return this; + } + + /// + /// Allow the import to receive the default value for its type if + /// the contract cannot be supplied by another part. + /// + /// An import builder allowing further configuration. + public ImportConventionBuilder AllowDefault() + { + _allowDefault = true; + return this; + } + + /// + /// Add an import constraint + /// + /// The name of the constraint item. + /// The value to match. + /// An import builder allowing further configuration. + public ImportConventionBuilder AddMetadataConstraint(string name, object value) + { + Requires.NotNullOrEmpty(name, "name"); + if (_metadataConstraintItems == null) + { + _metadataConstraintItems = new List>(); + } + _metadataConstraintItems.Add(Tuple.Create(name, value)); + return this; + } + + /// + /// Add an import constraint + /// + /// The name of the constraint item. + /// A function that calculates the value to match. + /// An export builder allowing further configuration. + public ImportConventionBuilder AddMetadataConstraint(string name, Func getConstraintValueFromPartType) + { + Requires.NotNullOrEmpty(name, "name"); + Requires.NotNull(getConstraintValueFromPartType, "getConstraintValueFromPartType"); + + if (_metadataConstraintItemFuncs == null) + { + _metadataConstraintItemFuncs = new List>>(); + } + _metadataConstraintItemFuncs.Add(Tuple.Create(name, getConstraintValueFromPartType)); + return this; + } + + internal void BuildAttributes(Type type, ref List attributes) + { + Attribute importAttribute; + + var contractName = (_getContractNameFromPartType != null) ? _getContractNameFromPartType(type) : _contractName; + + // Infer from Type when not explicitly set. + var asMany = _asMany ?? IsSupportedImportManyType(type.GetTypeInfo()); + if (!asMany) + { + importAttribute = new ImportAttribute(contractName) + { + AllowDefault = _allowDefault + }; + } + else + { + importAttribute = new ImportManyAttribute(contractName); + } + if (attributes == null) + { + attributes = new List(); + } + attributes.Add(importAttribute); + + + //Add metadata attributes from direct specification + if (_metadataConstraintItems != null) + { + foreach (var item in _metadataConstraintItems) + { + attributes.Add(new ImportMetadataConstraintAttribute(item.Item1, item.Item2)); + } + } + + //Add metadata attributes from func specification + if (_metadataConstraintItemFuncs != null) + { + foreach (var item in _metadataConstraintItemFuncs) + { + var name = item.Item1; + var value = (item.Item2 != null) ? item.Item2(type) : null; + attributes.Add(new ImportMetadataConstraintAttribute(name, value)); + } + } + return; + } + + private bool IsSupportedImportManyType(TypeInfo typeInfo) + { + return typeInfo.IsArray || + (typeInfo.IsGenericTypeDefinition && s_supportedImportManyTypes.Contains(typeInfo.AsType())) || + (typeInfo.AsType().IsConstructedGenericType && s_supportedImportManyTypes.Contains(typeInfo.GetGenericTypeDefinition())); + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/ParameterImportConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/ParameterImportConventionBuilder.cs new file mode 100644 index 000000000000..6efeae72c87f --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/ParameterImportConventionBuilder.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Linq.Expressions; + +namespace System.Composition.Convention +{ + /// + /// Used when configuring a . Used only + /// in expressions, instances of this type are never created. + /// + public abstract class ParameterImportConventionBuilder + { + private ParameterImportConventionBuilder() { } + + /// + /// Import with contract . + /// + /// The type of the parameter. + /// The imported instance. + public T Import() + { + return default(T); + } + + /// + /// Import with contract . + /// + /// Configuration for the import. + /// The type of the parameter. + /// The imported instance. + public T Import(Action configure) + { + return default(T); + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs new file mode 100644 index 000000000000..23186a1e8d4f --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs @@ -0,0 +1,822 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Composition; +using System.Linq; +using System.Reflection; +using System.Text; + +using Microsoft.Composition.Diagnostics; +using Microsoft.Internal; + +namespace System.Composition.Convention +{ + /// + /// Configures a type as a MEF part. + /// + public class PartConventionBuilder + { + private readonly Type[] _emptyTypeArray = new Type[0]; + private static List s_onImportsSatisfiedAttributeList; + private readonly static List s_importingConstructorList = new List() { new ImportingConstructorAttribute() }; + private readonly static Type s_exportAttributeType = typeof(ExportAttribute); + private readonly List _typeExportBuilders; + private readonly List _constructorImportBuilders; + private bool _isShared; + private string _sharingBoundary; + + // Metadata selection + private List> _metadataItems; + private List>> _metadataItemFuncs; + + // Constructor selector / configuration + private Func, ConstructorInfo> _constructorFilter; + private Action _configureConstuctorImports; + + //Property Import/Export selection and configuration + private readonly List, Action, Type>> _propertyExports; + private readonly List, Action>> _propertyImports; + private readonly List, Action>> _interfaceExports; + private readonly List> _methodImportsSatisfiedNotifications; + + internal Predicate SelectType { get; private set; } + + internal PartConventionBuilder(Predicate selectType) + { + SelectType = selectType; + _typeExportBuilders = new List(); + _constructorImportBuilders = new List(); + _propertyExports = new List, Action, Type>>(); + _propertyImports = new List, Action>>(); + _interfaceExports = new List, Action>>(); + _methodImportsSatisfiedNotifications = new List>(); + } + + /// + /// Export the part using its own concrete type as the contract. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Export() + { + var exportBuilder = new ExportConventionBuilder(); + _typeExportBuilders.Add(exportBuilder); + return this; + } + + /// + /// Export the part. + /// + /// Configuration action for the export. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Export(Action exportConfiguration) + { + Requires.NotNull(exportConfiguration, "exportConfiguration"); + var exportBuilder = new ExportConventionBuilder(); + exportConfiguration(exportBuilder); + _typeExportBuilders.Add(exportBuilder); + return this; + } + + /// + /// Export the part using as the contract. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Export() + { + var exportBuilder = new ExportConventionBuilder().AsContractType(); + _typeExportBuilders.Add(exportBuilder); + return this; + } + + /// + /// Export the class using as the contract. + /// + /// Configuration action for the export. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Export(Action exportConfiguration) + { + Requires.NotNull(exportConfiguration, "exportConfiguration"); + var exportBuilder = new ExportConventionBuilder().AsContractType(); + exportConfiguration(exportBuilder); + _typeExportBuilders.Add(exportBuilder); + return this; + } + + /// + /// Select which of the available constructors will be used to instantiate the part. + /// + /// Filter that selects a single constructor. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder SelectConstructor(Func, ConstructorInfo> constructorSelector) + { + Requires.NotNull(constructorSelector, "constructorSelector"); + _constructorFilter = constructorSelector; + return this; + } + + /// + /// Select which of the available constructors will be used to instantiate the part. + /// + /// Filter that selects a single constructor. + /// Action configuring the parameters of the selected constructor. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder SelectConstructor( + Func, ConstructorInfo> constructorSelector, + Action importConfiguration) + { + Requires.NotNull(importConfiguration, "importConfiguration"); + SelectConstructor(constructorSelector); + _configureConstuctorImports = importConfiguration; + return this; + } + + /// + /// Select the interfaces on the part type that will be exported. + /// + /// Filter for interfaces. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportInterfaces(Predicate interfaceFilter) + { + Requires.NotNull(interfaceFilter, "interfaceFilter"); + return ExportInterfacesImpl(interfaceFilter, null); + } + + /// + /// Export all interfaces implemented by the part. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportInterfaces() + { + return ExportInterfaces(t => true); + } + + /// + /// Select the interfaces on the part type that will be exported. + /// + /// Filter for interfaces. + /// Action to configure selected interfaces. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportInterfaces( + Predicate interfaceFilter, + Action exportConfiguration) + { + Requires.NotNull(interfaceFilter, "interfaceFilter"); + Requires.NotNull(exportConfiguration, "exportConfiguration"); + return ExportInterfacesImpl(interfaceFilter, exportConfiguration); + } + + private PartConventionBuilder ExportInterfacesImpl( + Predicate interfaceFilter, + Action exportConfiguration) + { + _interfaceExports.Add(Tuple.Create(interfaceFilter, exportConfiguration)); + return this; + } + + /// + /// Select properties on the part to export. + /// + /// Selector for exported properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperties(Predicate propertyFilter) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + + return ExportPropertiesImpl(propertyFilter, null); + } + + /// + /// Select properties on the part to export. + /// + /// Selector for exported properties. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperties( + Predicate propertyFilter, + Action exportConfiguration) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + Requires.NotNull(exportConfiguration, "exportConfiguration"); + return ExportPropertiesImpl(propertyFilter, exportConfiguration); + } + + private PartConventionBuilder ExportPropertiesImpl( + Predicate propertyFilter, + Action exportConfiguration) + { + _propertyExports.Add(Tuple.Create(propertyFilter, exportConfiguration, default(Type))); + return this; + } + + /// + /// Select properties to export from the part. + /// + /// Contract type to export. + /// Filter to select matching properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperties(Predicate propertyFilter) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + + return ExportPropertiesImpl(propertyFilter, null); + } + + /// + /// Select properties to export from the part. + /// + /// Contract type to export. + /// Filter to select matching properties. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperties( + Predicate propertyFilter, + Action exportConfiguration) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + Requires.NotNull(exportConfiguration, "exportConfiguration"); + + return ExportPropertiesImpl(propertyFilter, exportConfiguration); + } + + private PartConventionBuilder ExportPropertiesImpl( + Predicate propertyFilter, + Action exportConfiguration) + { + _propertyExports.Add(Tuple.Create(propertyFilter, exportConfiguration, typeof(T))); + return this; + } + + /// + /// Select properties to import into the part. + /// + /// Filter to select matching properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperties(Predicate propertyFilter) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + + return ImportPropertiesImpl(propertyFilter, null); + } + + /// + /// Select properties to import into the part. + /// + /// Filter to select matching properties. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperties( + Predicate propertyFilter, + Action importConfiguration) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + Requires.NotNull(importConfiguration, "importConfiguration"); + + return ImportPropertiesImpl(propertyFilter, importConfiguration); + } + + private PartConventionBuilder ImportPropertiesImpl( + Predicate propertyFilter, + Action importConfiguration) + { + _propertyImports.Add(Tuple.Create(propertyFilter, importConfiguration)); + return this; + } + + /// + /// Select properties to import into the part. + /// + /// Property type to import. + /// Filter to select matching properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperties(Predicate propertyFilter) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + + return ImportPropertiesImpl(propertyFilter, null); + } + + /// + /// Select properties to import into the part. + /// + /// Property type to import. + /// Filter to select matching properties. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperties( + Predicate propertyFilter, + Action importConfiguration) + { + Requires.NotNull(propertyFilter, "propertyFilter"); + Requires.NotNull(importConfiguration, "importConfiguration"); + + return ImportPropertiesImpl(propertyFilter, importConfiguration); + } + + private PartConventionBuilder ImportPropertiesImpl( + Predicate propertyFilter, + Action importConfiguration) + { + Predicate typedFilter = pi => pi.PropertyType.Equals(typeof(T)) && (propertyFilter == null || propertyFilter(pi)); + _propertyImports.Add(Tuple.Create(typedFilter, importConfiguration)); + return this; + } + + /// + /// Mark the part as being shared within the entire composition. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder NotifyImportsSatisfied(Predicate methodFilter) + { + _methodImportsSatisfiedNotifications.Add(methodFilter); + return this; + } + + /// + /// Mark the part as being shared within the entire composition. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Shared() + { + return SharedImpl(null); + } + + /// + /// Mark the part as being shared within the specified boundary. + /// + /// Name of the sharing boundary. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder Shared(string sharingBoundary) + { + Requires.NotNullOrEmpty(sharingBoundary, "sharingBoundary"); + return SharedImpl(sharingBoundary); + } + + private PartConventionBuilder SharedImpl(string sharingBoundary) + { + _isShared = true; + _sharingBoundary = sharingBoundary; + return this; + } + + /// + /// Add the specified metadata to the part. + /// + /// The metadata name. + /// The metadata value. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder AddPartMetadata(string name, object value) + { + Requires.NotNullOrEmpty(name, "name"); + + if (_metadataItems == null) + { + _metadataItems = new List>(); + } + _metadataItems.Add(Tuple.Create(name, value)); + return this; + } + + /// + /// Add the specified metadata to the part. + /// + /// The metadata name. + /// A function mapping the part type to the metadata value. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder AddPartMetadata(string name, Func getValueFromPartType) + { + Requires.NotNullOrEmpty(name, "name"); + Requires.NotNull(getValueFromPartType, "itemFunc"); + + if (_metadataItemFuncs == null) + { + _metadataItemFuncs = new List>>(); + } + _metadataItemFuncs.Add(Tuple.Create(name, getValueFromPartType)); + return this; + } + + private static bool MemberHasExportMetadata(MemberInfo member) + { + foreach (var attr in member.GetAttributes()) + { + var provider = attr as ExportMetadataAttribute; + if (provider != null) + { + return true; + } + else + { + Type attrType = attr.GetType(); + // Perf optimization, relies on short circuit evaluation, often a property attribute is an ExportAttribute + if (attrType != PartConventionBuilder.s_exportAttributeType && attrType.GetTypeInfo().IsAttributeDefined(true)) + { + return true; + } + } + } + return false; + } + + internal IEnumerable BuildTypeAttributes(Type type) + { + var attributes = new List(); + + if (_typeExportBuilders != null) + { + bool isConfigured = type.GetTypeInfo().GetFirstAttribute() != null || MemberHasExportMetadata(type.GetTypeInfo()); + if (isConfigured) + { + CompositionTrace.Registration_TypeExportConventionOverridden(type); + } + else + { + foreach (var export in _typeExportBuilders) + { + export.BuildAttributes(type, ref attributes); + } + } + } + + if (_isShared) + { + // Check if there is already a SharedAttribute. If found Trace a warning and do not add this Shared + // otherwise add new one + bool isConfigured = type.GetTypeInfo().GetFirstAttribute() != null; + if (isConfigured) + { + CompositionTrace.Registration_PartCreationConventionOverridden(type); + } + else + { + attributes.Add(_sharingBoundary == null ? + new SharedAttribute() : + new SharedAttribute(_sharingBoundary)); + } + } + + //Add metadata attributes from direct specification + if (_metadataItems != null) + { + bool isConfigured = type.GetTypeInfo().GetFirstAttribute() != null; + if (isConfigured) + { + CompositionTrace.Registration_PartMetadataConventionOverridden(type); + } + else + { + foreach (var item in _metadataItems) + { + attributes.Add(new PartMetadataAttribute(item.Item1, item.Item2)); + } + } + } + + //Add metadata attributes from func specification + if (_metadataItemFuncs != null) + { + bool isConfigured = type.GetTypeInfo().GetFirstAttribute() != null; + if (isConfigured) + { + CompositionTrace.Registration_PartMetadataConventionOverridden(type); + } + else + { + foreach (var item in _metadataItemFuncs) + { + var name = item.Item1; + var value = (item.Item2 != null) ? item.Item2(type) : null; + attributes.Add(new PartMetadataAttribute(name, value)); + } + } + } + + if (_interfaceExports.Any()) + { + if (_typeExportBuilders != null) + { + bool isConfigured = type.GetTypeInfo().GetFirstAttribute() != null || MemberHasExportMetadata(type.GetTypeInfo()); + if (isConfigured) + { + CompositionTrace.Registration_TypeExportConventionOverridden(type); + } + else + { + foreach (var iface in type.GetTypeInfo().ImplementedInterfaces) + { + if (iface == typeof(IDisposable)) + { + continue; + } + + // Run through the export specifications see if any match + foreach (var exportSpecification in _interfaceExports) + { + if (exportSpecification.Item1 != null && exportSpecification.Item1(iface)) + { + ExportConventionBuilder exportBuilder = new ExportConventionBuilder(); + exportBuilder.AsContractType(iface); + if (exportSpecification.Item2 != null) + { + exportSpecification.Item2(iface, exportBuilder); + } + exportBuilder.BuildAttributes(iface, ref attributes); + } + } + } + } + } + } + return attributes; + } + + internal bool BuildConstructorAttributes(Type type, ref List>> configuredMembers) + { + IEnumerable constructors = type.GetTypeInfo().DeclaredConstructors; + + // First see if any of these constructors have the ImportingConstructorAttribute if so then we are already done + foreach (var ci in constructors) + { + // We have a constructor configuration we must log a warning then not bother with ConstructorAttributes + IEnumerable attributes = ci.GetCustomAttributes(typeof(ImportingConstructorAttribute), false); + if (attributes.Count() != 0) + { + CompositionTrace.Registration_ConstructorConventionOverridden(type); + return true; + } + } + + if (_constructorFilter != null) + { + ConstructorInfo constructorInfo = _constructorFilter(constructors); + if (constructorInfo != null) + { + ConfigureConstructorAttributes(constructorInfo, ref configuredMembers, _configureConstuctorImports); + } + return true; + } + else if (_configureConstuctorImports != null) + { + bool configured = false; + foreach (var constructorInfo in FindLongestConstructors(constructors)) + { + ConfigureConstructorAttributes(constructorInfo, ref configuredMembers, _configureConstuctorImports); + configured = true; + } + return configured; + } + return false; + } + + internal static void BuildDefaultConstructorAttributes(Type type, ref List>> configuredMembers) + { + IEnumerable constructors = type.GetTypeInfo().DeclaredConstructors; + + foreach (var constructorInfo in FindLongestConstructors(constructors)) + { + ConfigureConstructorAttributes(constructorInfo, ref configuredMembers, null); + } + } + + private static void ConfigureConstructorAttributes(ConstructorInfo constructorInfo, ref List>> configuredMembers, Action configureConstuctorImports) + { + if (configuredMembers == null) + { + configuredMembers = new List>>(); + } + + // Make its attribute + configuredMembers.Add(Tuple.Create((object)constructorInfo, s_importingConstructorList)); + + //Okay we have the constructor now we can configure the ImportBuilders + var parameterInfos = constructorInfo.GetParameters(); + foreach (var pi in parameterInfos) + { + bool isConfigured = pi.GetFirstAttribute() != null || pi.GetFirstAttribute() != null; + if (isConfigured) + { + CompositionTrace.Registration_ParameterImportConventionOverridden(pi, constructorInfo); + } + else + { + var importBuilder = new ImportConventionBuilder(); + + // Let the developer alter them if they specified to do so + if (configureConstuctorImports != null) + { + configureConstuctorImports(pi, importBuilder); + } + + // Generate the attributes + List attributes = null; + importBuilder.BuildAttributes(pi.ParameterType, ref attributes); + configuredMembers.Add(Tuple.Create((object)pi, attributes)); + } + } + } + + internal void BuildOnImportsSatisfiedNotification(Type type, ref List>> configuredMembers) + { + //Add OnImportsSatisfiedAttribute where specified + if (_methodImportsSatisfiedNotifications != null) + { + foreach (var mi in type.GetRuntimeMethods()) + { + //We are only interested in void methods with no arguments + if (mi.ReturnParameter.ParameterType == typeof(void) + && mi.GetParameters().Length == 0) + { + MethodInfo underlyingMi = mi.DeclaringType.GetRuntimeMethod(mi.Name, _emptyTypeArray); + if (underlyingMi != null) + { + bool checkedIfConfigured = false; + bool isConfigured = false; + foreach (var notification in _methodImportsSatisfiedNotifications) + { + if (notification(underlyingMi)) + { + if (!checkedIfConfigured) + { + isConfigured = mi.GetFirstAttribute() != null; + checkedIfConfigured = true; + } + + if (isConfigured) + { + CompositionTrace.Registration_OnSatisfiedImportNotificationOverridden(type, mi); + break; + } + else + { + // We really only need to create this list once and then cache it, it never goes back to null + // Its perfectly okay if we make a list a few times on different threads, effectively though once we have + // cached one we will never make another. + if (PartConventionBuilder.s_onImportsSatisfiedAttributeList == null) + { + var onImportsSatisfiedAttributeList = new List(); + onImportsSatisfiedAttributeList.Add(new OnImportsSatisfiedAttribute()); + PartConventionBuilder.s_onImportsSatisfiedAttributeList = onImportsSatisfiedAttributeList; + } + configuredMembers.Add(new Tuple>(mi, PartConventionBuilder.s_onImportsSatisfiedAttributeList)); + } + } + } + } + } + } + } + } + + internal void BuildPropertyAttributes(Type type, ref List>> configuredMembers) + { + if (_propertyImports.Any() || _propertyExports.Any()) + { + foreach (var pi in type.GetRuntimeProperties()) + { + List attributes = null; + int importsBuilt = 0; + bool checkedIfConfigured = false; + bool isConfigured = false; + + PropertyInfo underlyingPi = null; + + // Run through the import specifications see if any match + foreach (var importSpecification in _propertyImports) + { + if (underlyingPi == null) + { + underlyingPi = pi.DeclaringType.GetRuntimeProperty(pi.Name); + } + if (importSpecification.Item1 != null && importSpecification.Item1(underlyingPi)) + { + var importBuilder = new ImportConventionBuilder(); + + if (importSpecification.Item2 != null) + { + importSpecification.Item2(pi, importBuilder); + } + + if (!checkedIfConfigured) + { + isConfigured = pi.GetFirstAttribute() != null || pi.GetFirstAttribute() != null; + checkedIfConfigured = true; + } + + if (isConfigured) + { + CompositionTrace.Registration_MemberImportConventionOverridden(type, pi); + break; + } + else + { + importBuilder.BuildAttributes(pi.PropertyType, ref attributes); + ++importsBuilt; + } + } + if (importsBuilt > 1) + { + CompositionTrace.Registration_MemberImportConventionMatchedTwice(type, pi); + } + } + + checkedIfConfigured = false; + isConfigured = false; + + // Run through the export specifications see if any match + foreach (var exportSpecification in _propertyExports) + { + if (underlyingPi == null) + { + underlyingPi = pi.DeclaringType.GetRuntimeProperty(pi.Name); + } + + if (exportSpecification.Item1 != null && exportSpecification.Item1(underlyingPi)) + { + var exportBuilder = new ExportConventionBuilder(); + + if (exportSpecification.Item3 != null) + { + exportBuilder.AsContractType(exportSpecification.Item3); + } + + if (exportSpecification.Item2 != null) + { + exportSpecification.Item2(pi, exportBuilder); + } + + if (!checkedIfConfigured) + { + isConfigured = pi.GetFirstAttribute() != null || MemberHasExportMetadata(pi); + checkedIfConfigured = true; + } + + if (isConfigured) + { + CompositionTrace.Registration_MemberExportConventionOverridden(type, pi); + break; + } + else + { + exportBuilder.BuildAttributes(pi.PropertyType, ref attributes); + } + } + } + + if (attributes != null) + { + if (configuredMembers == null) + { + configuredMembers = new List>>(); + } + + configuredMembers.Add(Tuple.Create((object)pi, attributes)); + } + } + } + return; + } + + private static IEnumerable FindLongestConstructors(IEnumerable constructors) + { + ConstructorInfo longestConstructor = null; + int argumentsCount = 0; + int constructorsFound = 0; + + foreach (var candidateConstructor in constructors) + { + int length = candidateConstructor.GetParameters().Length; + if (length != 0) + { + if (length > argumentsCount) + { + longestConstructor = candidateConstructor; + argumentsCount = length; + constructorsFound = 1; + } + else if (length == argumentsCount) + { + ++constructorsFound; + } + } + } + if (constructorsFound > 1) + { + foreach (var candidateConstructor in constructors) + { + int length = candidateConstructor.GetParameters().Length; + if (length == argumentsCount) + { + yield return candidateConstructor; + } + } + } + else if (constructorsFound == 1) + { + yield return longestConstructor; + } + yield break; + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilderOfT.cs b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilderOfT.cs new file mode 100644 index 000000000000..578a94bb81c3 --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilderOfT.cs @@ -0,0 +1,359 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using System.Linq.Expressions; + +using Microsoft.Internal; + +namespace System.Composition.Convention +{ + /// + /// Configures a type as a MEF part. + /// + /// The type of the part, or a type to which the part is assignable. + public class PartConventionBuilder : PartConventionBuilder + { + private class MethodExpressionAdapter + { + private readonly MethodInfo _methodInfo; + + public MethodExpressionAdapter(Expression> methodSelector) + { + _methodInfo = SelectMethods(methodSelector); + } + + public bool VerifyMethodInfo(MethodInfo mi) + { + return mi == _methodInfo; + } + + private static MethodInfo SelectMethods(Expression> methodSelector) + { + Requires.NotNull(methodSelector, "methodSelector"); + + var expr = Reduce(methodSelector).Body; + if (expr.NodeType == ExpressionType.Call) + { + var memberInfo = ((MethodCallExpression)expr).Method as MethodInfo; + if (memberInfo != null) + { + return memberInfo; + } + } + + // An error occured the expression must be a void Method() Member Expression + throw ExceptionBuilder.Argument_ExpressionMustBeVoidMethodWithNoArguments("methodSelector"); + } + + protected static Expression> Reduce(Expression> expr) + { + while (expr.CanReduce) + { + expr = (Expression>)expr.Reduce(); + } + return expr; + } + + protected static Expression> Reduce(Expression> expr) + { + while (expr.CanReduce) + { + expr = (Expression>)expr.Reduce(); + } + return expr; + } + } + + private class PropertyExpressionAdapter + { + private readonly PropertyInfo _propertyInfo; + private readonly Action _configureImport; + private readonly Action _configureExport; + + public PropertyExpressionAdapter( + Expression> propertySelector, + Action configureImport = null, + Action configureExport = null) + { + _propertyInfo = SelectProperties(propertySelector); + _configureImport = configureImport; + _configureExport = configureExport; + } + + public bool VerifyPropertyInfo(PropertyInfo pi) + { + return pi == _propertyInfo; + } + + public void ConfigureImport(PropertyInfo propertyInfo, ImportConventionBuilder importBuilder) + { + if (_configureImport != null) + { + _configureImport(importBuilder); + } + } + + public void ConfigureExport(PropertyInfo propertyInfo, ExportConventionBuilder exportBuilder) + { + if (_configureExport != null) + { + _configureExport(exportBuilder); + } + } + + private static PropertyInfo SelectProperties(Expression> propertySelector) + { + Requires.NotNull(propertySelector, "propertySelector"); + + var expr = Reduce(propertySelector).Body; + if (expr.NodeType == ExpressionType.MemberAccess) + { + var memberInfo = ((MemberExpression)expr).Member as PropertyInfo; + if (memberInfo != null) + { + return memberInfo; + } + } + + // An error occured the expression must be a Property Member Expression + throw ExceptionBuilder.Argument_ExpressionMustBePropertyMember("propertySelector"); + } + + protected static Expression> Reduce(Expression> expr) + { + while (expr.CanReduce) + { + expr = (Expression>)expr.Reduce(); + } + return expr; + } + } + + private class ConstructorExpressionAdapter + { + private ConstructorInfo _constructorInfo = null; + private Dictionary> _importBuilders = null; + + public ConstructorExpressionAdapter(Expression> selectConstructor) + { + ParseSelectConstructor(selectConstructor); + } + + public ConstructorInfo SelectConstructor(IEnumerable constructorInfos) + { + return _constructorInfo; + } + + public void ConfigureConstructorImports(ParameterInfo parameterInfo, ImportConventionBuilder importBuilder) + { + if (_importBuilders != null) + { + Action parameterImportBuilder; + if (_importBuilders.TryGetValue(parameterInfo, out parameterImportBuilder)) + { + parameterImportBuilder(importBuilder); + } + } + + return; + } + + private void ParseSelectConstructor(Expression> constructorSelector) + { + Requires.NotNull(constructorSelector, "constructorSelector"); + + var expr = Reduce(constructorSelector).Body; + if (expr.NodeType != ExpressionType.New) + { + throw ExceptionBuilder.Argument_ExpressionMustBeNew("constructorSelector"); + } + var newExpression = (NewExpression)expr; + _constructorInfo = newExpression.Constructor; + + int index = 0; + var parameterInfos = _constructorInfo.GetParameters(); + + foreach (var argument in newExpression.Arguments) + { + if (argument.NodeType == ExpressionType.Call) + { + var methodCallExpression = (MethodCallExpression)argument; + if (methodCallExpression.Arguments.Count() == 1) + { + var parameter = methodCallExpression.Arguments[0]; + if (parameter.NodeType == ExpressionType.Lambda) + { + var lambdaExpression = (LambdaExpression)parameter; + var importDelegate = lambdaExpression.Compile(); + if (_importBuilders == null) + { + _importBuilders = new Dictionary>(); + } + _importBuilders.Add(parameterInfos[index], (Action)importDelegate); + ++index; + } + } + } + } + } + + private static Expression> Reduce(Expression> expr) + { + while (expr.CanReduce) + { + expr.Reduce(); + } + return expr; + } + } + + internal PartConventionBuilder(Predicate selectType) : base(selectType) + { + } + + /// + /// Select which of the available constructors will be used to instantiate the part. + /// + /// Expression that selects a single constructor. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder SelectConstructor(Expression> constructorSelector) + { + Requires.NotNull(constructorSelector, "constructorSelector"); + + var adapter = new ConstructorExpressionAdapter(constructorSelector); + base.SelectConstructor(adapter.SelectConstructor, adapter.ConfigureConstructorImports); + return this; + } + + /// + /// Select a property on the part to export. + /// + /// Expression that selects the exported property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperty(Expression> propertySelector) + { + return ExportProperty(propertySelector, null); + } + + /// + /// Select a property on the part to export. + /// + /// Expression that selects the exported property. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperty( + Expression> propertySelector, + Action exportConfiguration) + { + Requires.NotNull(propertySelector, "propertySelector"); + + var adapter = new PropertyExpressionAdapter(propertySelector, null, exportConfiguration); + base.ExportProperties(adapter.VerifyPropertyInfo, adapter.ConfigureExport); + return this; + } + + + /// + /// Select a property to export from the part. + /// + /// Contract type to export. + /// Expression to select the matching property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperty(Expression> propertySelector) + { + return ExportProperty(propertySelector, null); + } + + /// + /// Select a property to export from the part. + /// + /// Contract type to export. + /// Expression to select the matching property. + /// Action to configure selected properties. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ExportProperty( + Expression> propertySelector, + Action exportConfiguration) + { + Requires.NotNull(propertySelector, "propertySelector"); + + var adapter = new PropertyExpressionAdapter(propertySelector, null, exportConfiguration); + base.ExportProperties(adapter.VerifyPropertyInfo, adapter.ConfigureExport); + return this; + } + + /// + /// Select a property on the part to import. + /// + /// Expression selecting the property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperty(Expression> propertySelector) + { + return ImportProperty(propertySelector, null); + } + + /// + /// Select a property on the part to import. + /// + /// Expression selecting the property. + /// Action configuring the imported property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperty( + Expression> propertySelector, + Action importConfiguration) + { + Requires.NotNull(propertySelector, "propertySelector"); + + var adapter = new PropertyExpressionAdapter(propertySelector, importConfiguration, null); + base.ImportProperties(adapter.VerifyPropertyInfo, adapter.ConfigureImport); + return this; + } + + /// + /// Select a property on the part to import. + /// + /// Contract type to import. + /// Expression selecting the property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperty(Expression> propertySelector) + { + return ImportProperty(propertySelector, null); + } + + /// + /// Select a property on the part to import. + /// + /// Contract type to import. + /// Expression selecting the property. + /// Action configuring the imported property. + /// A part builder allowing further configuration of the part. + public PartConventionBuilder ImportProperty( + Expression> propertySelector, + Action importConfiguration) + { + Requires.NotNull(propertySelector, "propertySelector"); + + var adapter = new PropertyExpressionAdapter(propertySelector, importConfiguration, null); + base.ImportProperties(adapter.VerifyPropertyInfo, adapter.ConfigureImport); + return this; + } + + /// + /// Mark the part as being shared within the entire composition. + /// + /// A part builder allowing further configuration of the part. + public PartConventionBuilder NotifyImportsSatisfied(Expression> methodSelector) + { + Requires.NotNull(methodSelector, "methodSelector"); + + var adapter = new MethodExpressionAdapter(methodSelector); + base.NotifyImportsSatisfied(adapter.VerifyMethodInfo); + return this; + } + } +} diff --git a/src/System.Composition.Convention/src/System/Composition/ExceptionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/ExceptionBuilder.cs new file mode 100644 index 000000000000..0238a6fea1d6 --- /dev/null +++ b/src/System.Composition.Convention/src/System/Composition/ExceptionBuilder.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Globalization; +using System.Reflection; + +using Microsoft.Internal; + +namespace System.Composition +{ + internal static class ExceptionBuilder + { + public static ArgumentException Argument_ExpressionMustBeNew(string parameterName) + { + return CreateArgumentException(Strings.Argument_ExpressionMustBeNew, parameterName); + } + + public static ArgumentException Argument_ExpressionMustBePropertyMember(string parameterName) + { + return CreateArgumentException(Strings.Argument_ExpressionMustBePropertyMember, parameterName); + } + + + public static ArgumentException Argument_ExpressionMustBeVoidMethodWithNoArguments(string methodName) + { + return CreateArgumentException(Strings.Argument_ExpressionMustBeVoidMethodWithNoArguments, methodName); + } + + private static ArgumentException CreateArgumentException(string message, string parameterName) + { + Assumes.NotNull(parameterName); + + return new ArgumentException(Format(message, parameterName), parameterName); + } + + private static string Format(string format, params string[] arguments) + { + return String.Format(CultureInfo.CurrentCulture, format, arguments); + } + } +} diff --git a/src/System.Composition.Convention/tests/AttributedModelConventionExtensions.cs b/src/System.Composition.Convention/tests/AttributedModelConventionExtensions.cs new file mode 100644 index 000000000000..63cb464bbaef --- /dev/null +++ b/src/System.Composition.Convention/tests/AttributedModelConventionExtensions.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace System.Composition.Convention.UnitTests +{ + /// + /// Helper extension methods for retrieving attributes from objects implementing IAttributedModelConvention + /// + internal static class AttributedModelConventionExtensions + { + public static TAttribute GetDeclaredAttribute(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, member).OfType().SingleOrDefault(); + } + + public static Attribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) + { + return convention.GetCustomAttributes(reflectedType, member).ToArray(); + } + + public static TAttribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, member).OfType().ToArray(); + } + + public static TAttribute GetDeclaredAttribute(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().SingleOrDefault(); + } + + public static Attribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().ToArray(); + } + + public static TAttribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().ToArray(); + } + } +} diff --git a/src/System.Composition.Convention/tests/ConventionBuilderTests.cs b/src/System.Composition.Convention/tests/ConventionBuilderTests.cs new file mode 100644 index 000000000000..82de4cd4f26c --- /dev/null +++ b/src/System.Composition.Convention/tests/ConventionBuilderTests.cs @@ -0,0 +1,202 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition; +using System.Composition.Convention; +using System.Composition.Convention.UnitTests; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace System.Composition.Convention.UnitTests +{ + public class ConventionBuilderTests + { + private interface IFoo { } + private class FooImpl : IFoo + { + public string P1 { get; set; } + public string P2 { get; set; } + public IEnumerable P3 { get; set; } + } + private class FooImplWithConstructors : IFoo + { + public FooImplWithConstructors() { } + public FooImplWithConstructors(IEnumerable ids) { } + public FooImplWithConstructors(int id, string name) { } + } + + [Fact] + public void MapType_ShouldReturnProjectedAttributesForType() + { + var builder = new ConventionBuilder(); + + builder. + ForTypesDerivedFrom(). + Export(); + + var fooImplAttributes = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetTypeInfo()); + var fooImplWithConstructorsAttributes = builder.GetDeclaredAttributes(typeof(FooImplWithConstructors), typeof(FooImplWithConstructors).GetTypeInfo()); + + var exports = new List(); + + exports.AddRange(fooImplAttributes); + exports.AddRange(fooImplWithConstructorsAttributes); + Assert.Equal(2, exports.Count); + + foreach (var exportAttribute in exports) + { + Assert.Equal(typeof(IFoo), ((ExportAttribute)exportAttribute).ContractType); + Assert.Null(((ExportAttribute)exportAttribute).ContractName); + } + } + + [Fact] + public void MapType_ConventionSelectedConstructor() + { + var builder = new ConventionBuilder(); + + builder. + ForTypesDerivedFrom(). + Export(); + + var fooImplWithConstructorsTypeInfo = typeof(FooImplWithConstructors).GetTypeInfo(); + + // necessary as BuildConventionConstructorAttributes is only called for type level query for attributes + var constructor1 = fooImplWithConstructorsTypeInfo.DeclaredConstructors.Where(c => c.GetParameters().Length == 0).Single(); + var constructor2 = fooImplWithConstructorsTypeInfo.DeclaredConstructors.Where(c => c.GetParameters().Length == 1).Single(); + var constructor3 = fooImplWithConstructorsTypeInfo.DeclaredConstructors.Where(c => c.GetParameters().Length == 2).Single(); + + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor1).Count()); + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor2).Count()); + + var ci = constructor3; + var attrs = builder.GetCustomAttributes(typeof(FooImplWithConstructors), ci); + Assert.Equal(1, attrs.Count()); + Assert.Equal(typeof(ImportingConstructorAttribute), attrs.FirstOrDefault().GetType()); + } + + [Fact] + public void MapType_OverridingSelectionOfConventionSelectedConstructor() + { + var builder = new ConventionBuilder(); + + builder. + ForTypesDerivedFrom(). + Export(); + + builder.ForType() + .SelectConstructor(cis => cis.ElementAtOrDefault(1)); + + var fooImplWithConstructors = typeof(FooImplWithConstructors).GetTypeInfo(); + + var constructor1 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 0).Single(); + var constructor2 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 1).Single(); + var constructor3 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 2).Single(); + + + // necessary as BuildConventionConstructorAttributes is only called for type level query for attributes + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor1).Count()); + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor3).Count()); + + var ci = constructor2; + var attrs = builder.GetCustomAttributes(typeof(FooImplWithConstructors), ci); + Assert.Equal(1, attrs.Count()); + Assert.Equal(typeof(ImportingConstructorAttribute), attrs.FirstOrDefault().GetType()); + } + + [Fact] + public void MapType_OverridingSelectionOfConventionSelectedConstructor_WithPartBuilderOfT() + { + var builder = new ConventionBuilder(); + + builder. + ForTypesDerivedFrom(). + Export(); + + builder.ForType(). + SelectConstructor(param => new FooImplWithConstructors(param.Import>())); + + var fooImplWithConstructors = typeof(FooImplWithConstructors).GetTypeInfo(); + + var constructor1 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 0).Single(); + var constructor2 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 1).Single(); + var constructor3 = fooImplWithConstructors.DeclaredConstructors.Where(c => c.GetParameters().Length == 2).Single(); + + // necessary as BuildConventionConstructorAttributes is only called for type level query for attributes + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor1).Count()); + Assert.Equal(0, builder.GetCustomAttributes(typeof(FooImplWithConstructors), constructor3).Count()); + + var ci = constructor2; + var attrs = builder.GetCustomAttributes(typeof(FooImplWithConstructors), ci); + Assert.Equal(1, attrs.Count()); + Assert.Equal(typeof(ImportingConstructorAttribute), attrs.FirstOrDefault().GetType()); + } + + private interface IGenericInterface { } + + [Export(typeof(IGenericInterface<>))] + private class ClassExportingInterface : IGenericInterface { } + //[TestMethod] + //public void GenericInterfaceExportInRegistrationBuilder() + //{ + // var container = CreateRegistrationBuilderContainer(typeof(ClassExportingInterface<>)); + // var v = container.GetExportedValue>(); + // Assert.IsInstanceOfType(v, typeof(IGenericInterface)); + //} + + //class GenericBaseClass { } + + //[Export(typeof(GenericBaseClass<>))] + //class ClassExportingBaseClass : GenericBaseClass { } + + //[TestMethod] + //public void GenericBaseClassExportInRegistrationBuilder() + //{ + // var container = CreateRegistrationBuilderContainer(typeof(ClassExportingBaseClass<>)); + // var v = container.GetExportedValue>(); + // Assert.IsInstanceOfType(v, typeof(GenericBaseClass)); + //} + + //[Export] + //class GenericClass { } + + //[TestMethod] + //public void GenericExportInRegistrationBuilder() + //{ + // var container = CreateRegistrationBuilderContainer(typeof(GenericClass<>)); + // var v = container.GetExportedValue>(); + // Assert.IsInstanceOfType(v, typeof(GenericClass)); + //} + + //[Export(typeof(ExplicitGenericClass<>))] + //class ExplicitGenericClass { } + + //[TestMethod] + //public void ExplicitGenericExportInRegistrationBuilder() + //{ + // var container = CreateRegistrationBuilderContainer(typeof(ExplicitGenericClass<>)); + // var v = container.GetExportedValue>(); + // Assert.IsInstanceOfType(v, typeof(ExplicitGenericClass)); + //} + + //[Export(typeof(ExplicitGenericClass<,>))] + //class ExplicitGenericClass { } + + //[TestMethod] + //public void ExplicitGenericArity2ExportInRegistrationBuilder() + //{ + // var container = CreateRegistrationBuilderContainer(typeof(ExplicitGenericClass<,>)); + // var v = container.GetExportedValue>(); + // Assert.IsInstanceOfType(v, typeof(ExplicitGenericClass)); + //} + + //CompositionContainer CreateRegistrationBuilderContainer(params Type[] types) + //{ + // var reg = new RegistrationBuilder(); + // var container = new CompositionContainer(new TypeCatalog(types, reg)); + // return container; + //} + } +} diff --git a/src/System.Composition.Convention/tests/ExceptionAssert.cs b/src/System.Composition.Convention/tests/ExceptionAssert.cs new file mode 100644 index 000000000000..c088bd26c3ed --- /dev/null +++ b/src/System.Composition.Convention/tests/ExceptionAssert.cs @@ -0,0 +1,324 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Composition.UnitTests.Util; +using System.Runtime.Serialization; +using Xunit; + +namespace System.Composition.Convention +{ + public static class ExceptionAssert + { + // NOTE: To catch state corrupting exceptions, it by design that + // the ThrowsXXX methods retry by default. To prevent this in a + // test, simply use one of the overloads that takes a RetryMode. + + /// + /// Verifies that the exception has the default message generated by the base Exception class. + /// + public static void HasDefaultMessage(Exception exception) + { + Assert.NotNull(exception); + + // Exception of type '[typename]' was thrown + // However, don't check for single-quotes as they can be localized + Assert.Contains(exception.GetType().FullName, exception.Message); + } + + /// + /// Verifies that the specified action throws a SerializationException. + /// + public static SerializationException ThrowsSerialization(string memberName, Action action) + { + var exception = Throws(RetryMode.Retry, action, (actual, retryCount) => + { + AssertSerializationMemberName(memberName, actual, retryCount); + }); + + return exception; + } + + /// + /// Verifies that the specified action throws an ObjectDisposedException. + /// + public static ObjectDisposedException ThrowsDisposed(object instance, Action action) + { + var exception = Throws(RetryMode.Retry, action, (actual, retryCount) => + { + AssertObjectDisposed(instance, actual, retryCount); + }); + + return exception; + } + + /// + /// Verifies that the specified action throws an ArgumentNullException. + /// + public static ArgumentNullException ThrowsArgumentNull(string parameterName, Action action) + { + return ThrowsArgument(parameterName, action); + } + + /// + /// Verifies that the specified action throws an ArgumentException. + /// + public static ArgumentException ThrowsArgument(string parameterName, Action action) + { + return ThrowsArgument(parameterName, action); + } + + /// + /// Verifies that the specified action throws an ArgumentException of type . + /// + public static T ThrowsArgument(string parameterName, Action action) + where T : ArgumentException + { + var exception = Throws(RetryMode.Retry, action, (actual, retryCount) => + { + AssertSameParameterName(parameterName, actual, retryCount); + }); + + return exception; + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception of type . + /// + public static T Throws(Action action) + where T : Exception + where TInner : Exception + { + return Throws(RetryMode.Retry, action); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception of type , and indicating + /// whether to retry. + /// + public static T Throws(RetryMode retry, Action action) + where T : Exception + where TInner : Exception + { + return Throws(retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception of type , indicating + /// whether to retry and running the specified validator. + /// + public static T Throws(RetryMode retry, Action action, Action validator) + where T : Exception + where TInner : Exception + { + var exception = Throws(retry, action, (actual, retryCount) => + { + AssertIsExactInstanceOfInner(typeof(TInner), actual, retryCount); + + if (validator != null) + { + validator(actual, retryCount); + } + }); + + return exception; + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception. + /// + public static T Throws(Exception innerException, Action action) + where T : Exception + { + return Throws(innerException, RetryMode.Retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception, and indicating whether to retry. + /// + public static T Throws(Exception innerException, RetryMode retry, Action action) + where T : Exception + { + return Throws(innerException, RetryMode.Retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// with the specified inner exception, indicating whether to retry and running the + /// specified validator. + /// + public static T Throws(Exception innerException, RetryMode retry, Action action, Action validator) + where T : Exception + { + T exception = Throws(retry, action, (actual, retryCount) => + { + AssertSameInner(innerException, actual, retryCount); + + if (validator != null) + { + validator(actual, retryCount); + } + }); + + return exception; + } + + /// + /// Verifies that the specified action throws an exception of type . + /// + public static T Throws(Action action) + where T : Exception + { + return Throws(RetryMode.Retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// indicating whether to retry. + /// + public static T Throws(RetryMode retry, Action action) + where T : Exception + { + return Throws(retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws an exception of type , + /// indicating whether to retry and running the specified validator. + /// + public static T Throws(RetryMode retry, Action action, Action validator) + where T : Exception + { + var exception = (T)Run(retry, action, (actual, retryCount) => + { + AssertIsExactInstanceOf(typeof(T), actual, retryCount); + + if (validator != null) + { + validator((T)actual, retryCount); + } + }); + + return exception; + } + + /// + /// Verifies that the specified action throws the specified exception. + /// + public static void Throws(Exception expected, Action action) + { + Throws(expected, RetryMode.Retry, action); + } + + /// + /// Verifies that the specified action throws the specified exception, + /// indicating whether to retry. + /// + public static void Throws(Exception expected, RetryMode retry, Action action) + { + Throws(expected, retry, action, (Action)null); + } + + /// + /// Verifies that the specified action throws the specified exception, + /// indicating whether to retry and running the specified validator. + /// + public static void Throws(Exception expected, RetryMode retry, Action action, Action validator) + { + Run(retry, action, (actual, retryCount) => + { + AssertSame(expected, actual, retryCount); + + if (validator != null) + { + validator(actual, retryCount); + } + }); + } + + private static Exception Run(RetryMode retry, Action action, Action validator) + { + Exception exception = null; + + for (int i = -1; i < (int)retry; i++) + { + exception = Run(action); + + validator(exception, i + 2); + } + + return exception; + } + + private static Exception Run(Action action) + { + try + { + action(); + return null; + } + catch (Exception ex) + { + return ex; + } + } + + private static void AssertSerializationMemberName(string memberName, SerializationException actual, int retryCount) + { + // Unfortunately, SerializationException does not provide a way to get our hands on the + // the actual member that was missing from the SerializationInfo, so we need to grok the + // message string. + + // Member '[memberName]' was not found. + // However, don't check for single-quotes as they can be localized + AssertX.Contains(memberName, actual.Message, "Retry Count {0}: Expected SerializationException MemberName to be '{1}'", retryCount, memberName); + } + + private static void AssertObjectDisposed(object instance, ObjectDisposedException actual, int retryCount) + { + string objectName = instance.GetType().FullName; + + AssertX.Equal(objectName, actual.ObjectName, "Retry Count {0}: Expected {1}.ObjectName to be '{2}', however, '{3}' is.", retryCount, actual.GetType().Name, objectName, actual.ObjectName); + } + + private static void AssertSameParameterName(string parameterName, ArgumentException actual, int retryCount) + { + AssertX.Contains(parameterName, actual.Message, "Retry Count {0}: Expected {1}.ParamName to be '{2}'", retryCount, actual.GetType().Name, parameterName); + } + + private static void AssertSame(Exception expected, Exception actual, int retryCount) + { + AssertX.Same(expected, actual, "Retry Count {0}: Expected '{1}' to be thrown, however, '{2}' was thrown.", retryCount, expected, actual); + } + + private static void AssertSameInner(Exception innerException, Exception actual, int retryCount) + { + AssertX.Same(innerException, actual.InnerException, "Retry Count {0}: Expected '{1}' to be the inner exception, however, '{2}' is.", retryCount, innerException, actual.InnerException); + } + + private static void AssertIsExactInstanceOf(Type expectedType, Exception actual, int retryCount) + { + if (actual == null) + AssertX.Fail("Retry Count {0}: Expected '{1}' to be thrown", retryCount, expectedType); + + Type actualType = actual.GetType(); + + AssertX.Same(expectedType, actualType, "Retry Count {0}: Expected '{1}' to be thrown, however, '{2}' was thrown.", retryCount, expectedType, actualType); + } + + private static void AssertIsExactInstanceOfInner(Type expectedType, Exception actual, int retryCount) + { + if (actual.InnerException == null) + AssertX.Fail("Retry Count {0}: Expected '{1}' be the inner exception, however, it is null.", retryCount, expectedType); + + Type actualType = actual.InnerException.GetType(); + + AssertX.Same(expectedType, actualType, "Retry Count {0}: Expected '{1}' to be the inner exception, however, '{2}' is.", retryCount, expectedType, actualType); + } + } +} diff --git a/src/System.Composition.Convention/tests/ExportBuilderTests.cs b/src/System.Composition.Convention/tests/ExportBuilderTests.cs new file mode 100644 index 000000000000..ed211e7ddd05 --- /dev/null +++ b/src/System.Composition.Convention/tests/ExportBuilderTests.cs @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition; +using System.Composition.Convention.UnitTests; +using System.Linq; +using System.Composition.Convention; +using System.Reflection; +using Xunit; + +namespace System.Composition.Convention +{ + public class ExportBuilderTests + { + private interface IFoo { } + + private class FooImpl : IFoo { } + + + [Fact] + public void ExportInterfaceWithTypeOf1() + { + var builder = new ConventionBuilder(); + builder.ForType().Export(); + + var exports = builder.GetCustomAttributes(typeof(FooImpl), typeof(FooImpl).GetTypeInfo()).Where(e => e is ExportAttribute).Cast(); + Assert.Equal(1, exports.Count()); + Assert.Equal(exports.First().ContractType, typeof(IFoo)); + } + + [Fact] + public void ExportInterfaceWithTypeOf2() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).Export((c) => c.AsContractType(typeof(IFoo))); + + var exports = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetTypeInfo()).Where(e => e is ExportAttribute).Cast(); + Assert.Equal(1, exports.Count()); + Assert.Equal(exports.First().ContractType, typeof(IFoo)); + } + + + [Fact] + public void AsContractTypeOfT_SetsContractType() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export((e) => e.AsContractType()); + + ExportAttribute exportAtt = GetExportAttribute(builder); + Assert.Equal(typeof(IFoo), exportAtt.ContractType); + Assert.Null(exportAtt.ContractName); + } + + [Fact] + public void AsContractType_SetsContractType() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export((e) => e.AsContractType(typeof(IFoo))); + + ExportAttribute exportAtt = GetExportAttribute(builder); + Assert.Equal(typeof(IFoo), exportAtt.ContractType); + Assert.Null(exportAtt.ContractName); + } + + [Fact] + public void AsContractName_SetsContractName() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export((e) => e.AsContractName("hey")); + + ExportAttribute exportAtt = GetExportAttribute(builder); + Assert.Equal("hey", exportAtt.ContractName); + Assert.Null(exportAtt.ContractType); + } + + [Fact] + public void AsContractName_AndContractType_SetsContractNameAndType() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export((e) => e.AsContractName("hey").AsContractType(typeof(IFoo))); + + ExportAttribute exportAtt = GetExportAttribute(builder); + Assert.Equal("hey", exportAtt.ContractName); + Assert.Equal(typeof(IFoo), exportAtt.ContractType); + } + + [Fact] + public void AsContractName_AndContractType_ComputeContractNameFromType() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export(e => e.AsContractName(t => "Contract:" + t.FullName).AsContractType()); + + ExportAttribute exportAtt = GetExportAttribute(builder); + Assert.Equal("Contract:" + typeof(FooImpl).FullName, exportAtt.ContractName); + Assert.Equal(typeof(IFoo), exportAtt.ContractType); + } + + [Fact] + public void AddMetadata_AddsExportMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export(e => e.AddMetadata("name", "val")); + + ExportMetadataAttribute exportAtt = GetExportMetadataAttribute(builder); + Assert.Equal("name", exportAtt.Name); + Assert.Equal("val", exportAtt.Value); + } + + [Fact] + public void AddMetadataFuncVal_AddsExportMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForTypesDerivedFrom().Export(e => e.AddMetadata("name", t => t.Name)); + + ExportMetadataAttribute exportAtt = GetExportMetadataAttribute(builder); + Assert.Equal("name", exportAtt.Name); + Assert.Equal(typeof(FooImpl).Name, exportAtt.Value); + } + + private static ExportAttribute GetExportAttribute(ConventionBuilder builder) + { + var list = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetTypeInfo()); + Assert.Equal(1, list.Length); + return list[0] as ExportAttribute; + } + + private static ExportMetadataAttribute GetExportMetadataAttribute(ConventionBuilder builder) + { + var list = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetTypeInfo()); + Assert.Equal(2, list.Length); + return list[1] as ExportMetadataAttribute; + } + } +} diff --git a/src/System.Composition.Convention/tests/ExportBuilderUnitTests.cs b/src/System.Composition.Convention/tests/ExportBuilderUnitTests.cs new file mode 100644 index 000000000000..6812157c2454 --- /dev/null +++ b/src/System.Composition.Convention/tests/ExportBuilderUnitTests.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Composition.Convention; +using System.Composition.Convention.UnitTests; +using System.Reflection; +using System.Linq; +using System.Text; +using Xunit; + +namespace System.Composition.Convention +{ + public class ExportBuilderUnitTests + { + public interface IFoo { } + + public class CFoo : IFoo { } + + [Fact] + public void ExportInterfaceWithTypeOf1() + { + var builder = new ConventionBuilder(); + builder.ForType().Export(); + + var exports = builder.GetDeclaredAttributes(typeof(CFoo), typeof(CFoo).GetTypeInfo()).Where(e => e is ExportAttribute).Cast(); + Assert.Equal(1, exports.Count()); + Assert.Equal(exports.First().ContractType, typeof(IFoo)); + } + + [Fact] + public void ExportInterfaceWithTypeOf2() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(CFoo)).Export((c) => c.AsContractType(typeof(IFoo))); + + var exports = builder.GetDeclaredAttributes(typeof(CFoo), typeof(CFoo).GetTypeInfo()).Where(e => e is ExportAttribute).Cast(); + Assert.Equal(1, exports.Count()); + Assert.Equal(exports.First().ContractType, typeof(IFoo)); + } + + [Fact] + public void ExportBuilderApiTestsNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("contractName", () => builder.ForTypesMatching((t) => true).Export(c => c.AsContractName(null as string))); + ExceptionAssert.ThrowsArgument("contractName", () => builder.ForTypesMatching((t) => true).Export(c => c.AsContractName(""))); + ExceptionAssert.ThrowsArgumentNull("getContractNameFromPartType", () => builder.ForTypesMatching((t) => true).Export(c => c.AsContractName(null as Func))); + ExceptionAssert.ThrowsArgumentNull("type", () => builder.ForTypesMatching((t) => true).Export(c => c.AsContractType(null as Type))); + ExceptionAssert.ThrowsArgumentNull("name", () => builder.ForTypesMatching((t) => true).Export(c => c.AddMetadata(null as string, null as object))); + ExceptionAssert.ThrowsArgumentNull("name", () => builder.ForTypesMatching((t) => true).Export(c => c.AddMetadata(null as string, null as Func))); + ExceptionAssert.ThrowsArgumentNull("getValueFromPartType", () => builder.ForTypesMatching((t) => true).Export(c => c.AddMetadata("name", null as Func))); + } + } +} diff --git a/src/System.Composition.Convention/tests/ExportInterfacesContractExclusionTests.cs b/src/System.Composition.Convention/tests/ExportInterfacesContractExclusionTests.cs new file mode 100644 index 000000000000..81c9daee8a5d --- /dev/null +++ b/src/System.Composition.Convention/tests/ExportInterfacesContractExclusionTests.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Convention.UnitTests; +using System.Linq; +using System.Text; +using System.Reflection; +using Xunit; +using System.Composition.UnitTests.Util; + +namespace System.Composition.Convention +{ + public interface IContract1 { } + + public interface IContract2 { } + + public class ClassWithLifetimeConcerns : IContract1, IContract2, IDisposable + { + public void Dispose() + { + } + + public void OnImportsSatisfied() + { + } + } + + internal static class DELETE_ME_TESTER + { + public static PartConventionBuilder ExportInterfaces(this PartConventionBuilder pb) { return null; } + } + public class ExportInterfacesContractExclusionTests + { + private static readonly Type[] s_contractInterfaces = new[] { typeof(IContract1), typeof(IContract2) }; + + [Fact] + public void WhenExportingInterfaces_NoPredicate_OnlyContractInterfacesAreExported() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportInterfaces(); + + var attributes = GetExportAttributes(builder, typeof(ClassWithLifetimeConcerns)); + var exportedContracts = attributes.Select(e => e.ContractType).ToArray(); + AssertX.Equivalent(s_contractInterfaces, exportedContracts); + } + + [Fact] + public void WhenExportingInterfaces_PredicateSpecified_OnlyContractInterfacesAreSeenByThePredicate() + { + var seenInterfaces = new List(); + + var builder = new ConventionBuilder(); + builder.ForType().ExportInterfaces(i => { seenInterfaces.Add(i); return true; }); + + var attributes = GetExportAttributes(builder, typeof(ClassWithLifetimeConcerns)); + AssertX.Equivalent(s_contractInterfaces, seenInterfaces); + } + + private static IEnumerable GetExportAttributes(ConventionBuilder builder, Type type) + { + var list = builder.GetDeclaredAttributes(type, type.GetTypeInfo()); + return list.Cast(); + } + } +} diff --git a/src/System.Composition.Convention/tests/ImportBuilderTests.cs b/src/System.Composition.Convention/tests/ImportBuilderTests.cs new file mode 100644 index 000000000000..ac1e24b6da4d --- /dev/null +++ b/src/System.Composition.Convention/tests/ImportBuilderTests.cs @@ -0,0 +1,130 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition; +using System.Composition.Convention; +using System.Composition.Convention.UnitTests; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace System.ComponentModel.Composition +{ + public class ImportBuilderTests + { + public interface IFoo { } + + public class FooImpl + { + public IFoo IFooProperty { get; private set; } + } + + [Fact] + public void AsContractName_SetsContractName() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AsContractName("hey")); + + ImportAttribute importAtt = GetImportAttribute(builder); + Assert.Equal("hey", importAtt.ContractName); + Assert.False(importAtt.AllowDefault); + } + + [Fact] + public void AsContractName_AndContractType_ComputeContractNameFromType() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, c => c.AsContractName(t => "Contract:" + t.FullName)); + + ImportAttribute importAtt = GetImportAttribute(builder); + Assert.Equal("Contract:" + typeof(IFoo).FullName, importAtt.ContractName); + } + + [Fact] + public void AllowDefault_SetsAllowDefaultProperty() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AllowDefault()); + + ImportAttribute importAtt = GetImportAttribute(builder); + Assert.True(importAtt.AllowDefault); + Assert.Null(importAtt.ContractName); + } + + [Fact] + public void AsContractName_AndContractType_SetsContractNameAndType() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AsContractName("hey")); + + ImportAttribute importAtt = GetImportAttribute(builder); + Assert.Equal("hey", importAtt.ContractName); + } + + [Fact] + public void AsMany_ChangesGeneratedAttributeToImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AsMany()); + + ImportManyAttribute importAtt = GetImportManyAttribute(builder); + Assert.NotNull(importAtt); + Assert.Null(importAtt.ContractName); + } + + [Fact] + public void AsMany_And_ContractName_ChangesGeneratedAttributeToImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AsContractName("hey").AsMany()); + + ImportManyAttribute importAtt = GetImportManyAttribute(builder); + Assert.NotNull(importAtt); + Assert.Equal("hey", importAtt.ContractName); + } + + [Fact] + public void AddImportConstraint_AddsImportConstraintMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AddMetadataConstraint("name", "val")); + + ImportMetadataConstraintAttribute importMetadataConstraint = GetImportMetadataConstraintAttribute(builder); + Assert.Equal("name", importMetadataConstraint.Name); + Assert.Equal("val", importMetadataConstraint.Value); + } + + [Fact] + public void AddImportConstraintFuncVal_AddsImportConstraintMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty((p) => p.IFooProperty, (c) => c.AddMetadataConstraint("name", t => t.Name)); + + ImportMetadataConstraintAttribute importMetadataConstraint = GetImportMetadataConstraintAttribute(builder); + Assert.Equal("name", importMetadataConstraint.Name); + Assert.Equal(typeof(IFoo).Name, importMetadataConstraint.Value); + } + + private static ImportAttribute GetImportAttribute(ConventionBuilder builder) + { + var list = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetRuntimeProperties().Where((m) => m.Name == "IFooProperty").First()); + Assert.Equal(1, list.Length); + return list.OfType().FirstOrDefault(); + } + + private static ImportManyAttribute GetImportManyAttribute(ConventionBuilder builder) + { + var list = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetRuntimeProperties().Where((m) => m.Name == "IFooProperty").First()); + Assert.Equal(1, list.Length); + return list.OfType().FirstOrDefault(); + } + + private static ImportMetadataConstraintAttribute GetImportMetadataConstraintAttribute(ConventionBuilder builder) + { + var list = builder.GetDeclaredAttributes(typeof(FooImpl), typeof(FooImpl).GetRuntimeProperties().Where((m) => m.Name == "IFooProperty").First()); + Assert.Equal(2, list.Length); + return list.OfType().FirstOrDefault(); + } + } +} diff --git a/src/System.Composition.Convention/tests/PartBuilderInheritanceTests.cs b/src/System.Composition.Convention/tests/PartBuilderInheritanceTests.cs new file mode 100644 index 000000000000..c2268d80a91e --- /dev/null +++ b/src/System.Composition.Convention/tests/PartBuilderInheritanceTests.cs @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Convention.UnitTests; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace System.Composition.Convention +{ + public class PartBuilderInheritanceTests + { + private abstract class BaseClass + { + public string P1 { get; set; } + public string P2 { get; set; } + public IEnumerable P3 { get; set; } + } + + private class DerClass : BaseClass + { + public string P4 { get; set; } + public string P5 { get; set; } + } + + [Fact] + public void ImportPropertyTargetingBaseClass_ShouldGenerateImportAttributeForP1Selected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperties((p) => p.Name == "P1"); // P1 is string + + var pAttr = GetAttributeFromMember(builder, typeof(DerClass), "P1") as ImportAttribute; + + Assert.NotNull(pAttr); // Ensure P1 has ImportAttribute (default configured) + Assert.Null(pAttr.ContractName); + } + + [Fact] + public void ImportPropertyTargetingBaseClass_ShouldGenerateImportManyForP3Selected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperties((p) => p.Name == "P3"); // P2 is Enumerable + + var pAttr = GetAttributeFromMember(builder, typeof(DerClass), "P3") as ImportManyAttribute; + + Assert.NotNull(pAttr); // Ensure P3 has ImportManyAttribute (default configured) + Assert.Null(pAttr.ContractName); + } + + + [Fact] + public void ImportPropertyTargetingDerivedClass_ShouldGenerateImportAttributeForP4Selected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperties((p) => p.Name == "P4"); // P1 is string + + var pAttr = GetAttributeFromMember(builder, typeof(DerClass), "P4") as ImportAttribute; + + Assert.NotNull(pAttr); // Ensure P1 has ImportAttribute (default configured) + Assert.Null(pAttr.ContractName); + } + + + [Fact] + public void ExportPropertyTargetingDerivedClass_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperties((p) => p.Name == "P4"); // P1 is string + + var pAttr = GetAttributeFromMember(builder, typeof(DerClass), "P4") as ExportAttribute; + + Assert.NotNull(pAttr); + Assert.Null(pAttr.ContractName); + Assert.Null(pAttr.ContractType); + } + + [Fact] + public void ExportPropertyTargetingBaseClass_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperties((p) => p.Name == "P2"); // P2 is string + + var exportAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P2") as ExportAttribute; + + Assert.NotNull(exportAttribute); + Assert.Null(exportAttribute.ContractName); + Assert.Null(exportAttribute.ContractType); + } + + private static Attribute GetAttributeFromMember(ConventionBuilder builder, Type type, string member) + { + var pi = type.GetRuntimeProperty(member); + var list = builder.GetDeclaredAttributes(type, pi); + return list[0] as Attribute; + } + } +} diff --git a/src/System.Composition.Convention/tests/PartBuilderInterfaceTests.cs b/src/System.Composition.Convention/tests/PartBuilderInterfaceTests.cs new file mode 100644 index 000000000000..82d2687f4e62 --- /dev/null +++ b/src/System.Composition.Convention/tests/PartBuilderInterfaceTests.cs @@ -0,0 +1,176 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition; +using System.Composition.Convention; +using System.Composition.Hosting; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace System.ComponentModel.Composition +{ + public class PartBuilderInterfaceTests + { + public interface IFirst { } + public interface ISecond { } + public interface IThird { } + public interface IFourth { } + public interface IFifth : IFourth { } + + public class Standard : IFirst, ISecond, IThird, IFifth + { + } + + public class Dippy : IFirst, ISecond, IThird, IFifth, IDisposable + { + public void Dispose() { } + } + + public class BareClass { } + + public class Base : IFirst, ISecond { } + + public class Derived : Base, IThird, IFifth { } + + public class Importer + { + [ImportMany] + public IEnumerable First { get; set; } + [ImportMany] + public IEnumerable Second { get; set; } + [ImportMany] + public IEnumerable Third { get; set; } + [ImportMany] + public IEnumerable Fourth { get; set; } + [ImportMany] + public IEnumerable Fifth { get; set; } + + [Import(AllowDefault = true)] + public Base Base { get; set; } + [Import(AllowDefault = true)] + public Derived Derived { get; set; } + [Import(AllowDefault = true)] + public Dippy Dippy { get; set; } + [Import(AllowDefault = true)] + public Standard Standard { get; set; } + [Import(AllowDefault = true)] + public IDisposable Disposable { get; set; } + [Import(AllowDefault = true)] + public BareClass BareClass { get; set; } + } + + [Fact] + public void StandardExportInterfacesShouldWork() + { + // Export all interfaces except IDisposable, Export contracts on types without interfaces. except for disposable types + var builder = new ConventionBuilder(); + builder.ForTypesMatching((t) => true).ExportInterfaces(); + builder.ForTypesMatching((t) => t.GetTypeInfo().ImplementedInterfaces.Where((iface) => iface != typeof(System.IDisposable)).Count() == 0).Export(); + + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + + var importer = new Importer(); + container.SatisfyImports(importer); + + Assert.NotNull(importer.First); + Assert.True(importer.First.Count() == 3); + Assert.NotNull(importer.Second); + Assert.True(importer.Second.Count() == 3); + Assert.NotNull(importer.Third); + Assert.True(importer.Third.Count() == 3); + Assert.NotNull(importer.Fourth); + Assert.True(importer.Fourth.Count() == 3); + Assert.NotNull(importer.Fifth); + Assert.True(importer.Fifth.Count() == 3); + + Assert.Null(importer.Base); + Assert.Null(importer.Derived); + Assert.Null(importer.Dippy); + Assert.Null(importer.Standard); + Assert.Null(importer.Disposable); + Assert.NotNull(importer.BareClass); + } + + + [Fact] + public void StandardExportInterfacesInterfaceFilterDefaultContractShouldWork() + { + //Same test as above only using default export builder + var builder = new ConventionBuilder(); + builder.ForTypesMatching((t) => true).ExportInterfaces((iface) => iface != typeof(System.IDisposable)); + builder.ForTypesMatching((t) => t.GetTypeInfo().ImplementedInterfaces.Where((iface) => iface != typeof(System.IDisposable)).Count() == 0).Export(); + + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + + var importer = new Importer(); + container.SatisfyImports(importer); + + Assert.NotNull(importer.First); + Assert.True(importer.First.Count() == 3); + Assert.NotNull(importer.Second); + Assert.True(importer.Second.Count() == 3); + Assert.NotNull(importer.Third); + Assert.True(importer.Third.Count() == 3); + Assert.NotNull(importer.Fourth); + Assert.True(importer.Fourth.Count() == 3); + Assert.NotNull(importer.Fifth); + Assert.True(importer.Fifth.Count() == 3); + + Assert.Null(importer.Base); + Assert.Null(importer.Derived); + Assert.Null(importer.Dippy); + Assert.Null(importer.Standard); + Assert.Null(importer.Disposable); + Assert.NotNull(importer.BareClass); + } + + [Fact] + public void StandardExportInterfacesInterfaceFilterConfiguredContractShouldWork() + { + //Same test as above only using default export builder + var builder = new ConventionBuilder(); + builder.ForTypesMatching((t) => true).ExportInterfaces((iface) => iface != typeof(System.IDisposable), (iface, bldr) => bldr.AsContractType((Type)iface)); + builder.ForTypesMatching((t) => t.GetTypeInfo().ImplementedInterfaces.Where((iface) => iface != typeof(System.IDisposable)).Count() == 0).Export(); + + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + + var importer = new Importer(); + container.SatisfyImports(importer); + + Assert.NotNull(importer.First); + Assert.True(importer.First.Count() == 3); + Assert.NotNull(importer.Second); + Assert.True(importer.Second.Count() == 3); + Assert.NotNull(importer.Third); + Assert.True(importer.Third.Count() == 3); + Assert.NotNull(importer.Fourth); + Assert.True(importer.Fourth.Count() == 3); + Assert.NotNull(importer.Fifth); + Assert.True(importer.Fifth.Count() == 3); + + Assert.Null(importer.Base); + Assert.Null(importer.Derived); + Assert.Null(importer.Dippy); + Assert.Null(importer.Standard); + Assert.Null(importer.Disposable); + Assert.NotNull(importer.BareClass); + } + } +} diff --git a/src/System.Composition.Convention/tests/PartBuilderOfTInheritanceTests.cs b/src/System.Composition.Convention/tests/PartBuilderOfTInheritanceTests.cs new file mode 100644 index 000000000000..a789c3245ac5 --- /dev/null +++ b/src/System.Composition.Convention/tests/PartBuilderOfTInheritanceTests.cs @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Convention; +using System.Linq; +using System.Reflection; +using System.Composition.Convention.UnitTests; +using Xunit; + +namespace System.Composition.Convention +{ + public class PartBuilderOfTInheritanceTests + { + private abstract class BaseClass + { + public string P1 { get; set; } + public string P2 { get; set; } + public IEnumerable P3 { get; set; } + } + + private class DerClass : BaseClass + { + public string P4 { get; set; } + public string P5 { get; set; } + } + + [Fact] + public void ImportPropertyTargetingBaseClass_ShouldGenerateImportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty(p => p.P2); // P2 is string + + var importAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P2") as ImportAttribute; + + Assert.NotNull(importAttribute); + Assert.Null(importAttribute.ContractName); + } + + [Fact] + public void ImportPropertyTargetingBaseClass_ShouldGenerateImportManyForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty(p => p.P3); // P3 is IEnumerable + + var importManyAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P3") as ImportManyAttribute; + Assert.NotNull(importManyAttribute); + Assert.Null(importManyAttribute.ContractName); + } + + [Fact] + public void ImportPropertyTargetingDerivedClass_ShouldGenerateImportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty(p => p.P4); // P4 is string + + var importAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P4") as ImportAttribute; + + Assert.NotNull(importAttribute); + Assert.Null(importAttribute.ContractName); + } + + [Fact] + public void ExportPropertyTargetingDerivedClass_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperty(p => p.P4); // P4 is string + + var exportAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P4") as ExportAttribute; + + Assert.NotNull(exportAttribute); + Assert.Null(exportAttribute.ContractName); + Assert.Null(exportAttribute.ContractType); + } + + [Fact] + public void ExportPropertyTargetingBaseClass_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperty(p => p.P2); // P2 is string + + var exportAttribute = GetAttributeFromMember(builder, typeof(DerClass), "P2") as ExportAttribute; + + Assert.NotNull(exportAttribute); + Assert.Null(exportAttribute.ContractName); + Assert.Null(exportAttribute.ContractType); + } + + private static Attribute GetAttributeFromMember(ConventionBuilder builder, Type type, string member) + { + var pi = type.GetRuntimeProperty(member); + var list = builder.GetDeclaredAttributes(type, pi); + return list[0] as Attribute; + } + } +} diff --git a/src/System.Composition.Convention/tests/PartBuilderOfTTests.cs b/src/System.Composition.Convention/tests/PartBuilderOfTTests.cs new file mode 100644 index 000000000000..425b30ee9fb6 --- /dev/null +++ b/src/System.Composition.Convention/tests/PartBuilderOfTTests.cs @@ -0,0 +1,554 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Convention.UnitTests; +using System.Composition.Hosting; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace System.Composition.Convention +{ + public class PartBuilderOfTTests + { + public interface IFirst { } + + private interface IFoo { } + private class FooImpl + { + public string P1 { get; set; } + public string P2 { get; set; } + public IEnumerable P3 { get; set; } + } + private class FooImplWithConstructors + { + public FooImplWithConstructors() { } + public FooImplWithConstructors(int id) { } + public FooImplWithConstructors(IEnumerable ids) { } + public FooImplWithConstructors(int id, string name) { } + } + + [Export] + public class OnImportsSatisfiedMultipleClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + public void OnImportsSatisfied1() + { + OnImportsSatisfiedInvoked += 2; + } + + public void OnImportsSatisfied2() + { + OnImportsSatisfiedInvoked += 4; + } + } + + [Export] + public class OnImportsSatisfiedConfiguredClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + [OnImportsSatisfied] + public void OnImportsSatisfied() + { + ++OnImportsSatisfiedInvoked; + } + } + + [Export] + public class OnImportsSatisfiedTestClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + public void OnImportsSatisfied() + { + ++OnImportsSatisfiedInvoked; + } + } + + [Export] + public class OnImportsSatisfiedDerivedClass : OnImportsSatisfiedTestClass + { + } + + public class ExportValues + { + public ExportValues() + { + P1 = "Hello, World from P1"; + P2 = "Hello, World from P2"; + } + + [Export("P1")] + public string P1 { get; set; } + [Export("P2")] + public string P2 { get; set; } + } + + + [Fact] + public void NoOperations_ShouldGenerateNoAttributesOnAnyMember() + { + var builder = new ConventionBuilder(); + builder.ForType(); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportSelf_ShouldGenerateSingleExportAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType().Export(); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ExportAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportOfT_ShouldGenerateSingleExportAttributeWithContractType() + { + var builder = new ConventionBuilder(); + builder.ForType().Export(); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes[0] as ExportAttribute; + Assert.NotNull(exportAttribute); + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void AddMetadata_ShouldGeneratePartMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType().Export().AddPartMetadata("name", "value"); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(2, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + var mdAttribute = attributes.First((t) => t.GetType() == typeof(PartMetadataAttribute)) as PartMetadataAttribute; + Assert.Equal("name", mdAttribute.Name); + Assert.Equal("value", mdAttribute.Value); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void AddMetadataWithFunc_ShouldGeneratePartMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType().Export().AddPartMetadata("name", t => t.Name); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(2, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + var mdAttribute = attributes.First((t) => t.GetType() == typeof(PartMetadataAttribute)) as PartMetadataAttribute; + Assert.Equal("name", mdAttribute.Name); + Assert.Equal(typeof(FooImpl).Name, mdAttribute.Value); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + + [Fact] + public void ExportProperty_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperty(p => p.P1); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Null(exportAttribute.ContractName); + Assert.Null(exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ImportProperty_ShouldGenerateImportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty(p => p.P1); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var importAttribute = attributes.First((t) => t.GetType() == typeof(ImportAttribute)) as ImportAttribute; + Assert.Null(importAttribute.ContractName); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ImportProperty_ShouldGenerateImportForPropertySelected_And_ApplyImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType().ImportProperty(p => p.P3); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(1, attributes.Count()); + + var importAttribute = attributes.First((t) => t.GetType() == typeof(ImportManyAttribute)) as ImportManyAttribute; + Assert.Null(importAttribute.ContractName); + } + + [Fact] + public void ExportPropertyWithConfiguration_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperty(p => p.P1, c => c.AsContractName("hey").AsContractType()); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Same("hey", exportAttribute.ContractName); + Assert.Same(typeof(IFoo), exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportPropertyWithConfiguration_ShouldGenerateExportForAllProperties() + { + var builder = new ConventionBuilder(); + builder.ForType().ExportProperty(p => p.P1, c => c.AsContractName("hey").AsContractType()); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Same("hey", exportAttribute.ContractName); + Assert.Same(typeof(IFoo), exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ConventionSelectsConstructor_SelectsTheOneWithMostParameters() + { + var builder = new ConventionBuilder(); + builder.ForType(); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(2, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(int id, string name) { } + + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ManuallySelectingConstructor_SelectsTheExplicitOne() + { + var builder = new ConventionBuilder(); + builder.ForType().SelectConstructor(param => new FooImplWithConstructors(param.Import())); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(1, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(IEnumerable) { } + + var pi = selectedConstructor.GetParameters()[0]; + Assert.Equal(typeof(int), pi.ParameterType); + + var attributes = builder.GetDeclaredAttributes(typeof(FooImplWithConstructors), pi); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ImportAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImplWithConstructors), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ManuallySelectingConstructor_SelectsTheExplicitOne_IEnumerableParameterBecomesImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType().SelectConstructor(param => new FooImplWithConstructors(param.Import>())); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(1, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(IEnumerable) { } + + var pi = selectedConstructor.GetParameters()[0]; + Assert.Equal(typeof(IEnumerable), pi.ParameterType); + + var attributes = builder.GetDeclaredAttributes(typeof(FooImplWithConstructors), pi); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ImportManyAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImplWithConstructors), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportInterfaceSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("interfaceFilter", () => builder.ForTypesMatching((t) => true).ExportInterfaces(null)); + ExceptionAssert.ThrowsArgumentNull("interfaceFilter", () => builder.ForTypesMatching((t) => true).ExportInterfaces(null, null)); + } + + [Fact] + public void ImportSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ImportProperty(null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ImportProperty(null, null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ImportProperty(null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ImportProperty(null, null)); + } + + [Fact] + public void ConstructorSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("constructorSelector", () => builder.ForTypesMatching((t) => true).SelectConstructor(null)); + ExceptionAssert.ThrowsArgumentNull("importConfiguration", () => builder.ForTypesMatching((t) => true).SelectConstructor(null, null)); + } + + [Fact] + public void ExportSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ExportProperty(null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ExportProperty(null, null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ExportProperty(null)); + ExceptionAssert.ThrowsArgumentNull("propertySelector", () => builder.ForTypesMatching((t) => true).ExportProperty(null, null)); + } + + private static Attribute[] GetAttributesFromMember(ConventionBuilder builder, Type type, string member) + { + if (string.IsNullOrEmpty(member)) + { + var list = builder.GetDeclaredAttributes(null, type.GetTypeInfo()); + return list; + } + else + { + var pi = type.GetRuntimeProperty(member); + var list = builder.GetDeclaredAttributes(type, pi); + return list; + } + } + + private static ConstructorInfo GetSelectedConstructor(ConventionBuilder builder, Type type) + { + ConstructorInfo reply = null; + foreach (var ci in type.GetTypeInfo().DeclaredConstructors) + { + var li = builder.GetDeclaredAttributes(type, ci); + if (li.Length > 0) + { + Assert.True(reply == null); // Fail if we got more than one constructor + reply = ci; + } + } + + return reply; + } + + [Fact] + public void NotifyImportsSatisfied_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied()); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(1, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedAttributeAlreadyApplied_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied()); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(1, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedAttributeAppliedToBaseClass_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied()); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(1, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedAttributeAppliedToDerivedClassExportBase_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied()); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(0, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedTwice_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied1()); + builder.ForType().NotifyImportsSatisfied(p => p.OnImportsSatisfied2()); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(6, test.OnImportsSatisfiedInvoked); + } + } +} diff --git a/src/System.Composition.Convention/tests/PartBuilderTests.cs b/src/System.Composition.Convention/tests/PartBuilderTests.cs new file mode 100644 index 000000000000..958201a16418 --- /dev/null +++ b/src/System.Composition.Convention/tests/PartBuilderTests.cs @@ -0,0 +1,621 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Convention; +using System.Linq; +using System.Reflection; +using System.Composition.Convention.UnitTests; +using Xunit; + +namespace System.Composition.Convention +{ + public class PartBuilderTests + { + private class MyDoNotIncludeAttribute : Attribute { } + + [MyDoNotIncludeAttribute] + public class MyNotToBeIncludedClass { } + + public class MyToBeIncludedClass { } + + public class ImporterOfMyNotTobeIncludedClass + { + [Import(AllowDefault = true)] + public MyNotToBeIncludedClass MyNotToBeIncludedClass { get; set; } + + [Import(AllowDefault = true)] + public MyToBeIncludedClass MyToBeIncludedClass { get; set; } + } + + public interface IFirst { } + + private interface IFoo { } + + private class FooImpl + { + public string P1 { get; set; } + public string P2 { get; set; } + public IEnumerable P3 { get; set; } + } + + [Export] + public class OnImportsSatisfiedTestClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + [OnImportsSatisfied] + public void OnImportsSatisfied() + { + ++OnImportsSatisfiedInvoked; + } + } + + [Export] + public class OnImportsSatisfiedMultipleClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + public void OnImportsSatisfied1() + { + OnImportsSatisfiedInvoked += 2; + } + + public void OnImportsSatisfied2() + { + OnImportsSatisfiedInvoked += 4; + } + } + + [Export] + public class OnImportsSatisfiedConfiguredClass + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + [OnImportsSatisfied] + public void OnImportsSatisfied() + { + ++OnImportsSatisfiedInvoked; + } + } + + [Export] + public class OnImportsSatisfiedDerivedClass : OnImportsSatisfiedTestClass + { + } + + + [Export] + public class OnImportsSatisfiedTestClassPropertiesAndFields + { + public int OnImportsSatisfiedInvoked = 0; + + [Import("P1", AllowDefault = true)] + public string P1 { get; set; } + [Import("P2", AllowDefault = true)] + public string P2 { get; set; } + + public int OnImportsSatisfiedInvalidReturnValue() { return 1; } + public void OnImportsSatisfiedInvalidArgs(int arg1) { } + + public int OnImportsSatisfied3; // Field + public int OnImportsSatisfied4 { get; set; } // Property + } + + public class ExportValues + { + public ExportValues() + { + P1 = "Hello, World from P1"; + P2 = "Hello, World from P2"; + } + + [Export("P1")] + public string P1 { get; set; } + [Export("P2")] + public string P2 { get; set; } + } + + private class FooImplWithConstructors + { + public FooImplWithConstructors() { } + public FooImplWithConstructors(int id) { } + public FooImplWithConstructors(IEnumerable ids) { } + public FooImplWithConstructors(int id, string name) { } + } + private class FooImplWithConstructorsAmbiguous + { + public FooImplWithConstructorsAmbiguous(string name, int id) { } + public FooImplWithConstructorsAmbiguous(int id, string name) { } + } + + [Fact] + public void NoOperations_ShouldGenerateNoAttributes() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportSelf_ShouldGenerateSingleExportAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).Export(); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ExportAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportOfT_ShouldGenerateSingleExportAttributeWithContractType() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).Export(); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes[0] as ExportAttribute; + Assert.NotNull(exportAttribute); + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void AddMetadata_ShouldGeneratePartMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).Export().AddPartMetadata("name", "value"); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(2, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + var mdAttribute = attributes.First((t) => t.GetType() == typeof(PartMetadataAttribute)) as PartMetadataAttribute; + Assert.Equal("name", mdAttribute.Name); + Assert.Equal("value", mdAttribute.Value); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void AddMetadataWithFunc_ShouldGeneratePartMetadataAttribute() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).Export().AddPartMetadata("name", t => t.Name); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(2, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Equal(typeof(IFoo), exportAttribute.ContractType); + Assert.Null(exportAttribute.ContractName); + + var mdAttribute = attributes.First((t) => t.GetType() == typeof(PartMetadataAttribute)) as PartMetadataAttribute; + Assert.Equal("name", mdAttribute.Name); + Assert.Equal(typeof(FooImpl).Name, mdAttribute.Value); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportProperty_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).ExportProperties(p => p.Name == "P1"); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Null(exportAttribute.ContractName); + Assert.Null(exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ImportProperty_ShouldGenerateImportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).ImportProperties(p => p.Name == "P1"); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var importAttribute = attributes.First((t) => t.GetType() == typeof(ImportAttribute)) as ImportAttribute; + Assert.Null(importAttribute.ContractName); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ImportProperties_ShouldGenerateImportForPropertySelected_And_ApplyImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).ImportProperties(p => p.Name == "P3"); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(1, attributes.Count()); + + var importAttribute = attributes.First((t) => t.GetType() == typeof(ImportManyAttribute)) as ImportManyAttribute; + Assert.Null(importAttribute.ContractName); + } + + [Fact] + public void ExportPropertyWithConfiguration_ShouldGenerateExportForPropertySelected() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).ExportProperties(p => p.Name == "P1", (pi, c) => c.AsContractName("hey").AsContractType()); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Same("hey", exportAttribute.ContractName); + Assert.Same(typeof(IFoo), exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportPropertyOfT_ShouldGenerateExportForPropertySelectedWithTAsContractType() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImpl)).ExportProperties(p => p.Name == "P1", (p, c) => c.AsContractType()); + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P1"); + Assert.Equal(1, attributes.Count()); + + var exportAttribute = attributes.First((t) => t.GetType() == typeof(ExportAttribute)) as ExportAttribute; + Assert.Null(exportAttribute.ContractName); + Assert.Same(typeof(IFoo), exportAttribute.ContractType); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P2"); + Assert.Equal(0, attributes.Count()); + + attributes = GetAttributesFromMember(builder, typeof(FooImpl), "P3"); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ConventionSelectsConstructor_SelectsTheOneWithMostParameters() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImplWithConstructors)); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(2, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(int id, string name) { } + + var attributes = GetAttributesFromMember(builder, typeof(FooImpl), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ManuallySelectingConstructor_SelectsTheExplicitOne() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImplWithConstructors)).SelectConstructor(cis => cis.ElementAt(1)); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(1, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(int) { } + + var pi = selectedConstructor.GetParameters()[0]; + Assert.Equal(typeof(int), pi.ParameterType); + + var attributes = builder.GetDeclaredAttributes(typeof(FooImplWithConstructors), pi); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ImportAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImplWithConstructors), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ManuallySelectingConstructor_SelectsTheExplicitOne_IEnumerableParameterBecomesImportMany() + { + var builder = new ConventionBuilder(); + builder.ForType(typeof(FooImplWithConstructors)).SelectConstructor(cis => cis.ElementAt(2)); + + var selectedConstructor = GetSelectedConstructor(builder, typeof(FooImplWithConstructors)); + Assert.NotNull(selectedConstructor); + Assert.Equal(1, selectedConstructor.GetParameters().Length); // Should select public FooImplWithConstructors(IEnumerable) { } + + var pi = selectedConstructor.GetParameters()[0]; + Assert.Equal(typeof(IEnumerable), pi.ParameterType); + + var attributes = builder.GetDeclaredAttributes(typeof(FooImplWithConstructors), pi); + Assert.Equal(1, attributes.Count()); + Assert.NotNull(attributes[0] as ImportManyAttribute); + + attributes = GetAttributesFromMember(builder, typeof(FooImplWithConstructors), null); + Assert.Equal(0, attributes.Count()); + } + + [Fact] + public void ExportInterfaceSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("interfaceFilter", () => builder.ForTypesMatching((t) => true).ExportInterfaces(null)); + ExceptionAssert.ThrowsArgumentNull("interfaceFilter", () => builder.ForTypesMatching((t) => true).ExportInterfaces(null, null)); + } + + [Fact] + public void ImportSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ImportProperties(null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ImportProperties(null, null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ImportProperties(null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ImportProperties(null, null)); + } + + [Fact] + public void ExportSelectorNull_ShouldThrowArgumentNull() + { + var builder = new ConventionBuilder(); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ExportProperties(null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ExportProperties(null, null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ExportProperties(null)); + ExceptionAssert.ThrowsArgumentNull("propertyFilter", () => builder.ForTypesMatching((t) => true).ExportProperties(null, null)); + } + + [Fact] + public void InsideTheLambdaCallGetCustomAttributesShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching((t) => !t.GetTypeInfo().IsDefined(typeof(MyDoNotIncludeAttribute), false)).Export(); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + + var importer = new ImporterOfMyNotTobeIncludedClass(); + container.SatisfyImports(importer); + + Assert.Null(importer.MyNotToBeIncludedClass); + Assert.NotNull(importer.MyToBeIncludedClass); + } + + + [Fact] + public void NotifyImportsSatisfiedAttributeAlreadyApplied_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(1, test.OnImportsSatisfiedInvoked); + } + + + [Fact] + public void NotifyImportsSatisfiedAttributeAppliedToBaseClass_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(1, test.OnImportsSatisfiedInvoked); + } + + + [Fact] + public void NotifyImportsSatisfiedMultipleNotifications_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied1"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(2, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedTwice_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied1" || mi.Name == "OnImportsSatisfied2"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(6, test.OnImportsSatisfiedInvoked); + } + + + [Fact] + public void NotifyImportsSatisfiedInvalidMethod_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied3" || mi.Name == "OnImportsSatisfied4"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(0, test.OnImportsSatisfiedInvoked); + } + + [Fact] + public void NotifyImportsSatisfiedPropertiesAndFields_ShouldSucceed() + { + var builder = new ConventionBuilder(); + builder.ForTypesMatching(t => true).NotifyImportsSatisfied(mi => mi.Name == "OnImportsSatisfied5" || mi.Name == "OnImportsSatisfied6"); + var container = new ContainerConfiguration() + .WithPart(builder) + .WithPart(builder) + .CreateContainer(); + var test = container.GetExport(); + + Assert.NotNull(test.P1); + Assert.NotNull(test.P2); + Assert.Equal(0, test.OnImportsSatisfiedInvoked); + } + + private static Attribute[] GetAttributesFromMember(ConventionBuilder builder, Type type, string member) + { + if (string.IsNullOrEmpty(member)) + { + var list = builder.GetDeclaredAttributes(null, type.GetTypeInfo()); + return list; + } + else + { + var pi = type.GetRuntimeProperty(member); + var list = builder.GetDeclaredAttributes(type, pi); + return list; + } + } + + private static ConstructorInfo GetSelectedConstructor(ConventionBuilder builder, Type type) + { + ConstructorInfo reply = null; + foreach (var ci in type.GetTypeInfo().DeclaredConstructors) + { + var li = builder.GetDeclaredAttributes(type, ci); + if (li.Length > 0) + { + Assert.True(reply == null); // Fail if we got more than one constructor + reply = ci; + } + } + + return reply; + } + } +} diff --git a/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs b/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..79d944e86638 --- /dev/null +++ b/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] diff --git a/src/System.Composition.Convention/tests/RetryMode.cs b/src/System.Composition.Convention/tests/RetryMode.cs new file mode 100644 index 000000000000..6a49f2a8ec51 --- /dev/null +++ b/src/System.Composition.Convention/tests/RetryMode.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition.Convention +{ + public enum RetryMode : int + { + DoNotRetry = 0, + Retry = 1, + } +} diff --git a/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj new file mode 100644 index 000000000000..24ff86521c55 --- /dev/null +++ b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj @@ -0,0 +1,81 @@ + + + + + + {853BB14F-8A5B-42B4-A053-21DE1AEBB335} + Library + Properties + ConventionsUnitTests + System.Composition.Convention.Tests + 512 + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + UnitTest + ..\..\ + true + + + + + + + + + + + Util\AssertX.cs + + + + + + + + + + + + + + + false + + + + + + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + {e6592fad-10b5-4b56-9287-d72dd136992f} + System.Composition.Convention + + + {2b8fecc6-34a1-48fe-ba75-99572d2d6db2} + System.Composition.Hosting + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + {b4b5e15c-e6b9-48ea-94c2-f067484d4d3e} + System.Composition.TypedParts + + + + + + + + \ No newline at end of file diff --git a/src/System.Composition.Convention/tests/project.json b/src/System.Composition.Convention/tests/project.json new file mode 100644 index 000000000000..482857ba6676 --- /dev/null +++ b/src/System.Composition.Convention/tests/project.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "System.Linq.Expressions": "4.0.10-beta-*", + "System.Reflection.Emit.Lightweight": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Serialization.Primitives": "4.0.10-beta-*", + "xunit": "2.1.0-beta3-*", + "xunit.netcore.extensions": "1.0.0-prerelease-*" + }, + "frameworks": { + "dnxcore50": { } + } +} \ No newline at end of file diff --git a/src/System.Composition.Convention/tests/project.lock.json b/src/System.Composition.Convention/tests/project.lock.json new file mode 100644 index 000000000000..1f9e700df677 --- /dev/null +++ b/src/System.Composition.Convention/tests/project.lock.json @@ -0,0 +1,1283 @@ +{ + "locked": true, + "version": -9996, + "targets": { + "DNXCore,Version=v5.0": { + "System.Collections/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Collections.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Collections.dll": {} + } + }, + "System.Diagnostics.Debug/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Diagnostics.Debug.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Diagnostics.Debug.dll": {} + } + }, + "System.Globalization/4.0.10-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Globalization.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Globalization.dll": {} + } + }, + "System.IO/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Text.Encoding": "4.0.0", + "System.Threading.Tasks": "4.0.0" + }, + "compile": { + "ref/dotnet/System.IO.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.IO.dll": {} + } + }, + "System.Linq/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Collections": "4.0.10", + "System.Resources.ResourceManager": "4.0.0", + "System.Diagnostics.Debug": "4.0.10", + "System.Runtime.Extensions": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Linq.dll": {} + }, + "runtime": { + "lib/dotnet/System.Linq.dll": {} + } + }, + "System.Linq.Expressions/4.0.10-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23127", + "System.Resources.ResourceManager": "4.0.0-beta-23127", + "System.Reflection.TypeExtensions": "4.0.0-beta-23127", + "System.Reflection.Primitives": "4.0.0-beta-23127", + "System.Reflection.Emit": "4.0.0-beta-23127", + "System.Linq": "4.0.0-beta-23127", + "System.Reflection.Extensions": "4.0.0-beta-23127", + "System.Collections": "4.0.10-beta-23127", + "System.Diagnostics.Debug": "4.0.10-beta-23127", + "System.Reflection": "4.0.10-beta-23127", + "System.IO": "4.0.10-beta-23127", + "System.ObjectModel": "4.0.10-beta-23127", + "System.Threading": "4.0.10-beta-23127", + "System.Runtime.Extensions": "4.0.10-beta-23127", + "System.Globalization": "4.0.10-beta-23127" + }, + "compile": { + "ref/dotnet/System.Linq.Expressions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Linq.Expressions.dll": {} + } + }, + "System.ObjectModel/4.0.10-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23127", + "System.Resources.ResourceManager": "4.0.0-beta-23127", + "System.Diagnostics.Debug": "4.0.10-beta-23127", + "System.Collections": "4.0.10-beta-23127", + "System.Threading": "4.0.10-beta-23127" + }, + "compile": { + "ref/dotnet/System.ObjectModel.dll": {} + }, + "runtime": { + "lib/dotnet/System.ObjectModel.dll": {} + } + }, + "System.Private.Uri/4.0.0-beta-23127": { + "runtime": { + "lib/DNXCore50/System.Private.Uri.dll": {} + } + }, + "System.Reflection/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.IO": "4.0.0", + "System.Reflection.Primitives": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.dll": {} + } + }, + "System.Reflection.Emit/4.0.0-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23127", + "System.Reflection": "4.0.0-beta-23127", + "System.Reflection.Emit.ILGeneration": "4.0.0-beta-23127", + "System.IO": "4.0.0-beta-23127", + "System.Reflection.Primitives": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.dll": {} + } + }, + "System.Reflection.Emit.ILGeneration/4.0.0-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23127", + "System.Reflection": "4.0.0-beta-23127", + "System.Reflection.Primitives": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.ILGeneration.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.ILGeneration.dll": {} + } + }, + "System.Reflection.Emit.Lightweight/4.0.0-beta-23127": { + "dependencies": { + "System.Reflection": "4.0.0-beta-23127", + "System.Reflection.Primitives": "4.0.0-beta-23127", + "System.Runtime": "4.0.0-beta-23127", + "System.Reflection.Emit.ILGeneration": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.Lightweight.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.Lightweight.dll": {} + } + }, + "System.Reflection.Extensions/4.0.0-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23127", + "System.Reflection": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Reflection.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Extensions.dll": {} + } + }, + "System.Reflection.Primitives/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Primitives.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Primitives.dll": {} + } + }, + "System.Reflection.TypeExtensions/4.0.0-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23127", + "System.Reflection": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Reflection.TypeExtensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.TypeExtensions.dll": {} + } + }, + "System.Resources.ResourceManager/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Globalization": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Resources.ResourceManager.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Resources.ResourceManager.dll": {} + } + }, + "System.Runtime/4.0.20-beta-23127": { + "dependencies": { + "System.Private.Uri": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Runtime.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.dll": {} + } + }, + "System.Runtime.Extensions/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Runtime.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Extensions.dll": {} + } + }, + "System.Runtime.Handles/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.Handles.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Handles.dll": {} + } + }, + "System.Runtime.InteropServices/4.0.20": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Reflection.Primitives": "4.0.0", + "System.Runtime.Handles": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.InteropServices.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.InteropServices.dll": {} + } + }, + "System.Runtime.InteropServices.RuntimeInformation/4.0.0-beta-23213": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Resources.ResourceManager": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll": {} + }, + "runtime": { + "lib/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll": {} + } + }, + "System.Runtime.Serialization.Primitives/4.0.10-beta-23127": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23127", + "System.Resources.ResourceManager": "4.0.0-beta-23127" + }, + "compile": { + "ref/dotnet/System.Runtime.Serialization.Primitives.dll": {} + }, + "runtime": { + "lib/dotnet/System.Runtime.Serialization.Primitives.dll": {} + } + }, + "System.Text.Encoding/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Text.Encoding.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Text.Encoding.dll": {} + } + }, + "System.Threading/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Threading.Tasks": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.dll": {} + } + }, + "System.Threading.Tasks/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.Tasks.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.Tasks.dll": {} + } + }, + "xunit/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.core": "[2.1.0-beta3-build3029]", + "xunit.assert": "[2.1.0-beta3-build3029]" + } + }, + "xunit.abstractions/2.0.0": { + "compile": { + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll": {} + }, + "runtime": { + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll": {} + } + }, + "xunit.assert/2.1.0-beta3-build3029": { + "compile": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll": {} + }, + "runtime": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll": {} + } + }, + "xunit.core/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.extensibility.core": "[2.1.0-beta3-build3029]", + "xunit.extensibility.execution": "[2.1.0-beta3-build3029]" + } + }, + "xunit.extensibility.core/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.abstractions": "[2.0.0]" + }, + "compile": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll": {} + }, + "runtime": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll": {} + } + }, + "xunit.extensibility.execution/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.extensibility.core": "[2.1.0-beta3-build3029]" + }, + "compile": { + "lib/dnxcore50/xunit.execution.dnx.dll": {} + }, + "runtime": { + "lib/dnxcore50/xunit.execution.dnx.dll": {} + } + }, + "xunit.netcore.extensions/1.0.0-prerelease-00079": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10", + "System.IO": "4.0.10", + "System.Linq": "4.0.0", + "System.Reflection": "4.0.10", + "System.Reflection.Primitives": "4.0.0", + "System.Runtime": "4.0.20", + "System.Runtime.Extensions": "4.0.10", + "System.Runtime.Handles": "4.0.0", + "System.Runtime.InteropServices": "4.0.20", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0-beta-23213", + "System.Text.Encoding": "4.0.10", + "System.Threading": "4.0.10", + "System.Threading.Tasks": "4.0.10", + "xunit": "2.1.0-beta3-build3029" + }, + "compile": { + "lib/dotnet/Xunit.NetCore.Extensions.dll": {} + }, + "runtime": { + "lib/dotnet/Xunit.NetCore.Extensions.dll": {} + } + } + } + }, + "libraries": { + "System.Collections/4.0.10": { + "serviceable": true, + "sha512": "ux6ilcZZjV/Gp7JEZpe+2V1eTueq6NuoGRM3eZCFuPM25hLVVgCRuea6STW8hvqreIOE59irJk5/ovpA5xQipw==", + "files": [ + "System.Collections.4.0.10.nupkg", + "System.Collections.4.0.10.nupkg.sha512", + "System.Collections.nuspec", + "lib/DNXCore50/System.Collections.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Collections.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Collections.dll", + "ref/dotnet/System.Collections.xml", + "ref/dotnet/de/System.Collections.xml", + "ref/dotnet/es/System.Collections.xml", + "ref/dotnet/fr/System.Collections.xml", + "ref/dotnet/it/System.Collections.xml", + "ref/dotnet/ja/System.Collections.xml", + "ref/dotnet/ko/System.Collections.xml", + "ref/dotnet/ru/System.Collections.xml", + "ref/dotnet/zh-hans/System.Collections.xml", + "ref/dotnet/zh-hant/System.Collections.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Collections.dll" + ] + }, + "System.Diagnostics.Debug/4.0.10": { + "serviceable": true, + "sha512": "pi2KthuvI2LWV2c2V+fwReDsDiKpNl040h6DcwFOb59SafsPT/V1fCy0z66OKwysurJkBMmp5j5CBe3Um+ub0g==", + "files": [ + "System.Diagnostics.Debug.4.0.10.nupkg", + "System.Diagnostics.Debug.4.0.10.nupkg.sha512", + "System.Diagnostics.Debug.nuspec", + "lib/DNXCore50/System.Diagnostics.Debug.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Diagnostics.Debug.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Diagnostics.Debug.dll", + "ref/dotnet/System.Diagnostics.Debug.xml", + "ref/dotnet/de/System.Diagnostics.Debug.xml", + "ref/dotnet/es/System.Diagnostics.Debug.xml", + "ref/dotnet/fr/System.Diagnostics.Debug.xml", + "ref/dotnet/it/System.Diagnostics.Debug.xml", + "ref/dotnet/ja/System.Diagnostics.Debug.xml", + "ref/dotnet/ko/System.Diagnostics.Debug.xml", + "ref/dotnet/ru/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hans/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hant/System.Diagnostics.Debug.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Diagnostics.Debug.dll" + ] + }, + "System.Globalization/4.0.10-beta-23127": { + "sha512": "DtN6tLsL7WD6s9PEsP/XQ8vkkmKOstNqfbvuoEikyKRlmNhFoXn2VfJgxoEj31W/oSCSqfpiVAR2cTs9ha/7lQ==", + "files": [ + "System.Globalization.4.0.10-beta-23127.nupkg", + "System.Globalization.4.0.10-beta-23127.nupkg.sha512", + "System.Globalization.nuspec", + "lib/DNXCore50/System.Globalization.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Globalization.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Globalization.dll", + "ref/dotnet/System.Globalization.xml", + "ref/dotnet/de/System.Globalization.xml", + "ref/dotnet/es/System.Globalization.xml", + "ref/dotnet/fr/System.Globalization.xml", + "ref/dotnet/it/System.Globalization.xml", + "ref/dotnet/ja/System.Globalization.xml", + "ref/dotnet/ko/System.Globalization.xml", + "ref/dotnet/ru/System.Globalization.xml", + "ref/dotnet/zh-hans/System.Globalization.xml", + "ref/dotnet/zh-hant/System.Globalization.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Globalization.dll" + ] + }, + "System.IO/4.0.10": { + "serviceable": true, + "sha512": "kghf1CeYT+W2lw8a50/GxFz5HR9t6RkL4BvjxtTp1NxtEFWywnMA9W8FH/KYXiDNThcw9u/GOViDON4iJFGXIQ==", + "files": [ + "System.IO.4.0.10.nupkg", + "System.IO.4.0.10.nupkg.sha512", + "System.IO.nuspec", + "lib/DNXCore50/System.IO.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.IO.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.IO.dll", + "ref/dotnet/System.IO.xml", + "ref/dotnet/de/System.IO.xml", + "ref/dotnet/es/System.IO.xml", + "ref/dotnet/fr/System.IO.xml", + "ref/dotnet/it/System.IO.xml", + "ref/dotnet/ja/System.IO.xml", + "ref/dotnet/ko/System.IO.xml", + "ref/dotnet/ru/System.IO.xml", + "ref/dotnet/zh-hans/System.IO.xml", + "ref/dotnet/zh-hant/System.IO.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.IO.dll" + ] + }, + "System.Linq/4.0.0": { + "serviceable": true, + "sha512": "r6Hlc+ytE6m/9UBr+nNRRdoJEWjoeQiT3L3lXYFDHoXk3VYsRBCDNXrawcexw7KPLaH0zamQLiAb6avhZ50cGg==", + "files": [ + "System.Linq.4.0.0.nupkg", + "System.Linq.4.0.0.nupkg.sha512", + "System.Linq.nuspec", + "lib/dotnet/System.Linq.dll", + "lib/net45/_._", + "lib/netcore50/System.Linq.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Linq.dll", + "ref/dotnet/System.Linq.xml", + "ref/dotnet/de/System.Linq.xml", + "ref/dotnet/es/System.Linq.xml", + "ref/dotnet/fr/System.Linq.xml", + "ref/dotnet/it/System.Linq.xml", + "ref/dotnet/ja/System.Linq.xml", + "ref/dotnet/ko/System.Linq.xml", + "ref/dotnet/ru/System.Linq.xml", + "ref/dotnet/zh-hans/System.Linq.xml", + "ref/dotnet/zh-hant/System.Linq.xml", + "ref/net45/_._", + "ref/netcore50/System.Linq.dll", + "ref/netcore50/System.Linq.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._" + ] + }, + "System.Linq.Expressions/4.0.10-beta-23127": { + "serviceable": true, + "sha512": "sTx6tiIJwc9gECz2gv9+2e7hFpRlX0GbRAPowFtD95dcWgm1MlYV+3WF70XismWnPN9k5/ZHTyz4RjEPFY+lBg==", + "files": [ + "runtime.json", + "System.Linq.Expressions.4.0.10-beta-23127.nupkg", + "System.Linq.Expressions.4.0.10-beta-23127.nupkg.sha512", + "System.Linq.Expressions.nuspec", + "lib/DNXCore50/System.Linq.Expressions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Linq.Expressions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Linq.Expressions.dll", + "ref/dotnet/System.Linq.Expressions.xml", + "ref/dotnet/de/System.Linq.Expressions.xml", + "ref/dotnet/es/System.Linq.Expressions.xml", + "ref/dotnet/fr/System.Linq.Expressions.xml", + "ref/dotnet/it/System.Linq.Expressions.xml", + "ref/dotnet/ja/System.Linq.Expressions.xml", + "ref/dotnet/ko/System.Linq.Expressions.xml", + "ref/dotnet/ru/System.Linq.Expressions.xml", + "ref/dotnet/zh-hans/System.Linq.Expressions.xml", + "ref/dotnet/zh-hant/System.Linq.Expressions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Linq.Expressions.dll" + ] + }, + "System.ObjectModel/4.0.10-beta-23127": { + "serviceable": true, + "sha512": "WddIdzpJxPz+UI3wlUPNpeZwMQEX6AxxnT/ycTmSdFVUazsb1sRxE92TeYMDKpIlEu6jRvuv8A36yGsQr5CEkQ==", + "files": [ + "System.ObjectModel.4.0.10-beta-23127.nupkg", + "System.ObjectModel.4.0.10-beta-23127.nupkg.sha512", + "System.ObjectModel.nuspec", + "lib/dotnet/System.ObjectModel.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.ObjectModel.dll", + "ref/dotnet/System.ObjectModel.xml", + "ref/dotnet/de/System.ObjectModel.xml", + "ref/dotnet/es/System.ObjectModel.xml", + "ref/dotnet/fr/System.ObjectModel.xml", + "ref/dotnet/it/System.ObjectModel.xml", + "ref/dotnet/ja/System.ObjectModel.xml", + "ref/dotnet/ko/System.ObjectModel.xml", + "ref/dotnet/ru/System.ObjectModel.xml", + "ref/dotnet/zh-hans/System.ObjectModel.xml", + "ref/dotnet/zh-hant/System.ObjectModel.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Private.Uri/4.0.0-beta-23127": { + "serviceable": true, + "sha512": "KT9JGnTYRf51pwPluZtpewmdBPiROzemamLmpzgzl3Pu3Y0vmH2CBLZktngD4I4YPNFO6ieCupeM0X3R1u26kA==", + "files": [ + "System.Private.Uri.4.0.0-beta-23127.nupkg", + "System.Private.Uri.4.0.0-beta-23127.nupkg.sha512", + "System.Private.Uri.nuspec", + "lib/DNXCore50/System.Private.Uri.dll", + "lib/netcore50/System.Private.Uri.dll", + "ref/dnxcore50/_._", + "ref/netcore50/_._", + "runtimes/win8-aot/lib/netcore50/System.Private.Uri.dll" + ] + }, + "System.Reflection/4.0.10": { + "sha512": "WZ+4lEE4gqGx6mrqLhSiW4oi6QLPWwdNjzhhTONmhELOrW8Cw9phlO9tltgvRUuQUqYtBiliFwhO5S5fCJElVw==", + "files": [ + "System.Reflection.4.0.10.nupkg", + "System.Reflection.4.0.10.nupkg.sha512", + "System.Reflection.nuspec", + "lib/DNXCore50/System.Reflection.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Reflection.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.dll", + "ref/dotnet/System.Reflection.xml", + "ref/dotnet/de/System.Reflection.xml", + "ref/dotnet/es/System.Reflection.xml", + "ref/dotnet/fr/System.Reflection.xml", + "ref/dotnet/it/System.Reflection.xml", + "ref/dotnet/ja/System.Reflection.xml", + "ref/dotnet/ko/System.Reflection.xml", + "ref/dotnet/ru/System.Reflection.xml", + "ref/dotnet/zh-hans/System.Reflection.xml", + "ref/dotnet/zh-hant/System.Reflection.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.dll" + ] + }, + "System.Reflection.Emit/4.0.0-beta-23127": { + "sha512": "v4Fzkc1VvgjK5Y0zqY8a0vFLQvz9XbEDC7wrLi0YLEjgmnUw8gxsWFgFQnOABjUYc28ygwQjz1Zpl+sfnIHgFw==", + "files": [ + "System.Reflection.Emit.4.0.0-beta-23127.nupkg", + "System.Reflection.Emit.4.0.0-beta-23127.nupkg.sha512", + "System.Reflection.Emit.nuspec", + "lib/DNXCore50/System.Reflection.Emit.dll", + "lib/MonoAndroid10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.dll", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.Emit.dll", + "ref/dotnet/System.Reflection.Emit.xml", + "ref/dotnet/de/System.Reflection.Emit.xml", + "ref/dotnet/es/System.Reflection.Emit.xml", + "ref/dotnet/fr/System.Reflection.Emit.xml", + "ref/dotnet/it/System.Reflection.Emit.xml", + "ref/dotnet/ja/System.Reflection.Emit.xml", + "ref/dotnet/ko/System.Reflection.Emit.xml", + "ref/dotnet/ru/System.Reflection.Emit.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.xml", + "ref/MonoAndroid10/_._", + "ref/net45/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Reflection.Emit.ILGeneration/4.0.0-beta-23127": { + "sha512": "Z953hng7bseRmyedsWYyRMXm6VlKYaAizg/h1bN3Yol+dKcdU1PPNgtyM5lFf1poMQQWedqFrB6wP+PrV9MNFQ==", + "files": [ + "System.Reflection.Emit.ILGeneration.4.0.0-beta-23127.nupkg", + "System.Reflection.Emit.ILGeneration.4.0.0-beta-23127.nupkg.sha512", + "System.Reflection.Emit.ILGeneration.nuspec", + "lib/DNXCore50/System.Reflection.Emit.ILGeneration.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", + "lib/wp80/_._", + "ref/dotnet/System.Reflection.Emit.ILGeneration.dll", + "ref/dotnet/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/de/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/es/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/fr/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/it/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ja/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ko/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ru/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.ILGeneration.xml", + "ref/net45/_._", + "ref/wp80/_._" + ] + }, + "System.Reflection.Emit.Lightweight/4.0.0-beta-23127": { + "sha512": "gEy6W3AxCqidpmFNSCn6CdfQ+oUMjVdMWl7sFLFU79dJVraSAV6XvTpBR8ZAyckDv2BXFPPuxTaerqkyUjgP4A==", + "files": [ + "System.Reflection.Emit.Lightweight.4.0.0-beta-23127.nupkg", + "System.Reflection.Emit.Lightweight.4.0.0-beta-23127.nupkg.sha512", + "System.Reflection.Emit.Lightweight.nuspec", + "lib/DNXCore50/System.Reflection.Emit.Lightweight.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.Lightweight.dll", + "lib/wp80/_._", + "ref/dotnet/System.Reflection.Emit.Lightweight.dll", + "ref/dotnet/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/de/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/es/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/fr/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/it/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ja/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ko/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ru/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.Lightweight.xml", + "ref/net45/_._", + "ref/wp80/_._" + ] + }, + "System.Reflection.Extensions/4.0.0-beta-23127": { + "serviceable": true, + "sha512": "aqLWJLH1vBW3M6QSEHXcPuhyIoN+uPVNbcB7D/RoAd5u3OzdaO2MtR98USrD7LIUKlKP8nujoHgvweX0m23Kgw==", + "files": [ + "System.Reflection.Extensions.4.0.0-beta-23127.nupkg", + "System.Reflection.Extensions.4.0.0-beta-23127.nupkg.sha512", + "System.Reflection.Extensions.nuspec", + "lib/DNXCore50/System.Reflection.Extensions.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Extensions.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Reflection.Extensions.dll", + "ref/dotnet/System.Reflection.Extensions.xml", + "ref/dotnet/de/System.Reflection.Extensions.xml", + "ref/dotnet/es/System.Reflection.Extensions.xml", + "ref/dotnet/fr/System.Reflection.Extensions.xml", + "ref/dotnet/it/System.Reflection.Extensions.xml", + "ref/dotnet/ja/System.Reflection.Extensions.xml", + "ref/dotnet/ko/System.Reflection.Extensions.xml", + "ref/dotnet/ru/System.Reflection.Extensions.xml", + "ref/dotnet/zh-hans/System.Reflection.Extensions.xml", + "ref/dotnet/zh-hant/System.Reflection.Extensions.xml", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Extensions.dll", + "ref/netcore50/System.Reflection.Extensions.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.Extensions.dll" + ] + }, + "System.Reflection.Primitives/4.0.0": { + "serviceable": true, + "sha512": "n9S0XpKv2ruc17FSnaiX6nV47VfHTZ1wLjKZlAirUZCvDQCH71mVp+Ohabn0xXLh5pK2PKp45HCxkqu5Fxn/lA==", + "files": [ + "System.Reflection.Primitives.4.0.0.nupkg", + "System.Reflection.Primitives.4.0.0.nupkg.sha512", + "System.Reflection.Primitives.nuspec", + "lib/DNXCore50/System.Reflection.Primitives.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Primitives.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Reflection.Primitives.dll", + "ref/dotnet/System.Reflection.Primitives.xml", + "ref/dotnet/de/System.Reflection.Primitives.xml", + "ref/dotnet/es/System.Reflection.Primitives.xml", + "ref/dotnet/fr/System.Reflection.Primitives.xml", + "ref/dotnet/it/System.Reflection.Primitives.xml", + "ref/dotnet/ja/System.Reflection.Primitives.xml", + "ref/dotnet/ko/System.Reflection.Primitives.xml", + "ref/dotnet/ru/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hans/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hant/System.Reflection.Primitives.xml", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Primitives.dll", + "ref/netcore50/System.Reflection.Primitives.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.Primitives.dll" + ] + }, + "System.Reflection.TypeExtensions/4.0.0-beta-23127": { + "serviceable": true, + "sha512": "vVc+uhYZh6k4+tDxl0QeP31dq3RUySaiDjSmQ2aOEnVfBs7xtbNaxXLXKd5BBAweNQIZBZ5L1Yv0wC2tCa17KQ==", + "files": [ + "System.Reflection.TypeExtensions.4.0.0-beta-23127.nupkg", + "System.Reflection.TypeExtensions.4.0.0-beta-23127.nupkg.sha512", + "System.Reflection.TypeExtensions.nuspec", + "lib/DNXCore50/System.Reflection.TypeExtensions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Reflection.TypeExtensions.dll", + "lib/netcore50/System.Reflection.TypeExtensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.TypeExtensions.dll", + "ref/dotnet/System.Reflection.TypeExtensions.xml", + "ref/dotnet/de/System.Reflection.TypeExtensions.xml", + "ref/dotnet/es/System.Reflection.TypeExtensions.xml", + "ref/dotnet/fr/System.Reflection.TypeExtensions.xml", + "ref/dotnet/it/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ja/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ko/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ru/System.Reflection.TypeExtensions.xml", + "ref/dotnet/zh-hans/System.Reflection.TypeExtensions.xml", + "ref/dotnet/zh-hant/System.Reflection.TypeExtensions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Reflection.TypeExtensions.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.TypeExtensions.dll" + ] + }, + "System.Resources.ResourceManager/4.0.0": { + "serviceable": true, + "sha512": "qmqeZ4BJgjfU+G2JbrZt4Dk1LsMxO4t+f/9HarNY6w8pBgweO6jT+cknUH7c3qIrGvyUqraBhU45Eo6UtA0fAw==", + "files": [ + "System.Resources.ResourceManager.4.0.0.nupkg", + "System.Resources.ResourceManager.4.0.0.nupkg.sha512", + "System.Resources.ResourceManager.nuspec", + "lib/DNXCore50/System.Resources.ResourceManager.dll", + "lib/net45/_._", + "lib/netcore50/System.Resources.ResourceManager.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Resources.ResourceManager.dll", + "ref/dotnet/System.Resources.ResourceManager.xml", + "ref/dotnet/de/System.Resources.ResourceManager.xml", + "ref/dotnet/es/System.Resources.ResourceManager.xml", + "ref/dotnet/fr/System.Resources.ResourceManager.xml", + "ref/dotnet/it/System.Resources.ResourceManager.xml", + "ref/dotnet/ja/System.Resources.ResourceManager.xml", + "ref/dotnet/ko/System.Resources.ResourceManager.xml", + "ref/dotnet/ru/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hans/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hant/System.Resources.ResourceManager.xml", + "ref/net45/_._", + "ref/netcore50/System.Resources.ResourceManager.dll", + "ref/netcore50/System.Resources.ResourceManager.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Resources.ResourceManager.dll" + ] + }, + "System.Runtime/4.0.20-beta-23127": { + "serviceable": true, + "sha512": "naLsXkry4PBYCdXLOGx2r9TRuFWJpdZvV7W9rk4QRTPTS7H9911J09o8KXrhX+NW28YVsCgvcw8Wr0JsFEQdLQ==", + "files": [ + "System.Runtime.4.0.20-beta-23127.nupkg", + "System.Runtime.4.0.20-beta-23127.nupkg.sha512", + "System.Runtime.nuspec", + "lib/DNXCore50/System.Runtime.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.dll", + "ref/dotnet/System.Runtime.xml", + "ref/dotnet/de/System.Runtime.xml", + "ref/dotnet/es/System.Runtime.xml", + "ref/dotnet/fr/System.Runtime.xml", + "ref/dotnet/it/System.Runtime.xml", + "ref/dotnet/ja/System.Runtime.xml", + "ref/dotnet/ko/System.Runtime.xml", + "ref/dotnet/ru/System.Runtime.xml", + "ref/dotnet/zh-hans/System.Runtime.xml", + "ref/dotnet/zh-hant/System.Runtime.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.dll" + ] + }, + "System.Runtime.Extensions/4.0.10": { + "serviceable": true, + "sha512": "5dsEwf3Iml7d5OZeT20iyOjT+r+okWpN7xI2v+R4cgd3WSj4DeRPTvPFjDpacbVW4skCAZ8B9hxXJYgkCFKJ1A==", + "files": [ + "System.Runtime.Extensions.4.0.10.nupkg", + "System.Runtime.Extensions.4.0.10.nupkg.sha512", + "System.Runtime.Extensions.nuspec", + "lib/DNXCore50/System.Runtime.Extensions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Extensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Extensions.dll", + "ref/dotnet/System.Runtime.Extensions.xml", + "ref/dotnet/de/System.Runtime.Extensions.xml", + "ref/dotnet/es/System.Runtime.Extensions.xml", + "ref/dotnet/fr/System.Runtime.Extensions.xml", + "ref/dotnet/it/System.Runtime.Extensions.xml", + "ref/dotnet/ja/System.Runtime.Extensions.xml", + "ref/dotnet/ko/System.Runtime.Extensions.xml", + "ref/dotnet/ru/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hans/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hant/System.Runtime.Extensions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Extensions.dll" + ] + }, + "System.Runtime.Handles/4.0.0": { + "serviceable": true, + "sha512": "638VhpRq63tVcQ6HDb3um3R/J2BtR1Sa96toHo6PcJGPXEPEsleCuqhBgX2gFCz0y0qkutANwW6VPPY5wQu1XQ==", + "files": [ + "System.Runtime.Handles.4.0.0.nupkg", + "System.Runtime.Handles.4.0.0.nupkg.sha512", + "System.Runtime.Handles.nuspec", + "lib/DNXCore50/System.Runtime.Handles.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Handles.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Handles.dll", + "ref/dotnet/System.Runtime.Handles.xml", + "ref/dotnet/de/System.Runtime.Handles.xml", + "ref/dotnet/es/System.Runtime.Handles.xml", + "ref/dotnet/fr/System.Runtime.Handles.xml", + "ref/dotnet/it/System.Runtime.Handles.xml", + "ref/dotnet/ja/System.Runtime.Handles.xml", + "ref/dotnet/ko/System.Runtime.Handles.xml", + "ref/dotnet/ru/System.Runtime.Handles.xml", + "ref/dotnet/zh-hans/System.Runtime.Handles.xml", + "ref/dotnet/zh-hant/System.Runtime.Handles.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Handles.dll" + ] + }, + "System.Runtime.InteropServices/4.0.20": { + "serviceable": true, + "sha512": "ZgDyBYfEnjWoz/viS6VOswA6XOkDSH2DzgbpczbW50RywhnCgTl+w3JEvtAiOGyIh8cyx1NJq80jsNBSUr8Pig==", + "files": [ + "System.Runtime.InteropServices.4.0.20.nupkg", + "System.Runtime.InteropServices.4.0.20.nupkg.sha512", + "System.Runtime.InteropServices.nuspec", + "lib/DNXCore50/System.Runtime.InteropServices.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.InteropServices.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.InteropServices.dll", + "ref/dotnet/System.Runtime.InteropServices.xml", + "ref/dotnet/de/System.Runtime.InteropServices.xml", + "ref/dotnet/es/System.Runtime.InteropServices.xml", + "ref/dotnet/fr/System.Runtime.InteropServices.xml", + "ref/dotnet/it/System.Runtime.InteropServices.xml", + "ref/dotnet/ja/System.Runtime.InteropServices.xml", + "ref/dotnet/ko/System.Runtime.InteropServices.xml", + "ref/dotnet/ru/System.Runtime.InteropServices.xml", + "ref/dotnet/zh-hans/System.Runtime.InteropServices.xml", + "ref/dotnet/zh-hant/System.Runtime.InteropServices.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.InteropServices.dll" + ] + }, + "System.Runtime.InteropServices.RuntimeInformation/4.0.0-beta-23213": { + "serviceable": true, + "sha512": "yzVJM7dF6XqnGTkv2IRufKs8AiqDpfdfBvMT5sVgY2fCtUXdkcjxiIWzaVIau8IYrJUlQDmSpeQ8NV6l1vz0Lg==", + "files": [ + "System.Runtime.InteropServices.RuntimeInformation.4.0.0-beta-23213.nupkg", + "System.Runtime.InteropServices.RuntimeInformation.4.0.0-beta-23213.nupkg.sha512", + "System.Runtime.InteropServices.RuntimeInformation.nuspec", + "lib/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Runtime.Serialization.Primitives/4.0.10-beta-23127": { + "serviceable": true, + "sha512": "NXY/dGChiPXqLz94gOeGN1083ydZtZgxhsEu2MugTT9ou6esWSUyXsUNqNXBApzDDKLm8eqqtMLTQcBPww/pJA==", + "files": [ + "System.Runtime.Serialization.Primitives.4.0.10-beta-23127.nupkg", + "System.Runtime.Serialization.Primitives.4.0.10-beta-23127.nupkg.sha512", + "System.Runtime.Serialization.Primitives.nuspec", + "lib/dotnet/System.Runtime.Serialization.Primitives.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Serialization.Primitives.dll", + "ref/dotnet/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/de/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/es/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/fr/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/it/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/ja/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/ko/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/ru/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/zh-hans/System.Runtime.Serialization.Primitives.xml", + "ref/dotnet/zh-hant/System.Runtime.Serialization.Primitives.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Text.Encoding/4.0.10": { + "sha512": "fNlSFgy4OuDlJrP9SFFxMlaLazq6ipv15sU5TiEgg9UCVnA/OgoVUfymFp4AOk1jOkW5SVxWbeeIUptcM+m/Vw==", + "files": [ + "System.Text.Encoding.4.0.10.nupkg", + "System.Text.Encoding.4.0.10.nupkg.sha512", + "System.Text.Encoding.nuspec", + "lib/DNXCore50/System.Text.Encoding.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Text.Encoding.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Text.Encoding.dll", + "ref/dotnet/System.Text.Encoding.xml", + "ref/dotnet/de/System.Text.Encoding.xml", + "ref/dotnet/es/System.Text.Encoding.xml", + "ref/dotnet/fr/System.Text.Encoding.xml", + "ref/dotnet/it/System.Text.Encoding.xml", + "ref/dotnet/ja/System.Text.Encoding.xml", + "ref/dotnet/ko/System.Text.Encoding.xml", + "ref/dotnet/ru/System.Text.Encoding.xml", + "ref/dotnet/zh-hans/System.Text.Encoding.xml", + "ref/dotnet/zh-hant/System.Text.Encoding.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Text.Encoding.dll" + ] + }, + "System.Threading/4.0.10": { + "serviceable": true, + "sha512": "0w6pRxIEE7wuiOJeKabkDgeIKmqf4ER1VNrs6qFwHnooEE78yHwi/bKkg5Jo8/pzGLm0xQJw0nEmPXt1QBAIUA==", + "files": [ + "System.Threading.4.0.10.nupkg", + "System.Threading.4.0.10.nupkg.sha512", + "System.Threading.nuspec", + "lib/DNXCore50/System.Threading.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.dll", + "ref/dotnet/System.Threading.xml", + "ref/dotnet/de/System.Threading.xml", + "ref/dotnet/es/System.Threading.xml", + "ref/dotnet/fr/System.Threading.xml", + "ref/dotnet/it/System.Threading.xml", + "ref/dotnet/ja/System.Threading.xml", + "ref/dotnet/ko/System.Threading.xml", + "ref/dotnet/ru/System.Threading.xml", + "ref/dotnet/zh-hans/System.Threading.xml", + "ref/dotnet/zh-hant/System.Threading.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.dll" + ] + }, + "System.Threading.Tasks/4.0.10": { + "serviceable": true, + "sha512": "NOwJGDfk79jR0bnzosbXLVD/PdI8KzBeESoa3CofEM5v9R5EBfcI0Jyf18stx+0IYV9okmDIDxVtxq9TbnR9bQ==", + "files": [ + "System.Threading.Tasks.4.0.10.nupkg", + "System.Threading.Tasks.4.0.10.nupkg.sha512", + "System.Threading.Tasks.nuspec", + "lib/DNXCore50/System.Threading.Tasks.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.Tasks.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.Tasks.dll", + "ref/dotnet/System.Threading.Tasks.xml", + "ref/dotnet/de/System.Threading.Tasks.xml", + "ref/dotnet/es/System.Threading.Tasks.xml", + "ref/dotnet/fr/System.Threading.Tasks.xml", + "ref/dotnet/it/System.Threading.Tasks.xml", + "ref/dotnet/ja/System.Threading.Tasks.xml", + "ref/dotnet/ko/System.Threading.Tasks.xml", + "ref/dotnet/ru/System.Threading.Tasks.xml", + "ref/dotnet/zh-hans/System.Threading.Tasks.xml", + "ref/dotnet/zh-hant/System.Threading.Tasks.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.Tasks.dll" + ] + }, + "xunit/2.1.0-beta3-build3029": { + "sha512": "NMFXV0ePe/GrfhMSPGAlWmiUZCzjaatpdAGcavf2B6vYTRyMTpyJT01LI6jemMV/VSDXLrtHp0Ov9xZyR1cLLg==", + "files": [ + "xunit.2.1.0-beta3-build3029.nupkg", + "xunit.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.nuspec" + ] + }, + "xunit.abstractions/2.0.0": { + "sha512": "NAdxKQRzuLnCZ0g++x6i87/8rMBpQoRiRlRNLAqfODm2zJPbteHRoSER3DXfxnqrHXyBJT8rFaZ8uveBeQyaMA==", + "files": [ + "xunit.abstractions.2.0.0.nupkg", + "xunit.abstractions.2.0.0.nupkg.sha512", + "xunit.abstractions.nuspec", + "lib/net35/xunit.abstractions.dll", + "lib/net35/xunit.abstractions.xml", + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll", + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.xml" + ] + }, + "xunit.assert/2.1.0-beta3-build3029": { + "sha512": "AMS7Fv77DayXVRCBMmVEDwOXPcbxk8dCBA/iACsve+6+UQqopMtNyAynyIcXPFRK/peeitUKID4ChOXWisJmUw==", + "files": [ + "xunit.assert.2.1.0-beta3-build3029.nupkg", + "xunit.assert.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.assert.nuspec", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.pdb", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.xml" + ] + }, + "xunit.core/2.1.0-beta3-build3029": { + "sha512": "uDUBbwZSRx226BMwj6VylzXQPVpEIelNIulT+LxbSEH52y2a4btR9d5ptQmkSVjmJXP5/hGCc4cu1DSCu0pgUA==", + "files": [ + "xunit.core.2.1.0-beta3-build3029.nupkg", + "xunit.core.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.core.nuspec", + "build/monoandroid/xunit.core.props", + "build/monoandroid/xunit.execution.MonoAndroid.dll", + "build/monotouch/xunit.core.props", + "build/monotouch/xunit.execution.MonoTouch.dll", + "build/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.props", + "build/portable-win81+wpa81/xunit.core.props", + "build/portable-win81+wpa81/xunit.core.targets", + "build/portable-win81+wpa81/xunit.execution.universal.dll", + "build/portable-win81+wpa81/xunit.execution.universal.pri", + "build/wp8/xunit.core.props", + "build/wp8/xunit.core.targets", + "build/wp8/xunit.execution.wp8.dll", + "build/Xamarin.iOS/xunit.core.props", + "build/Xamarin.iOS/xunit.execution.iOS-Universal.dll", + "build/_Desktop/xunit.execution.desktop.dll" + ] + }, + "xunit.extensibility.core/2.1.0-beta3-build3029": { + "sha512": "lsPro5U3NLasHI/RwqjKzXiRlh9N0IOlR3cluwXYVtihXbGtySeSnU/Fh5MTcWYxh+MVpoNop5zDD0/A2nrHsA==", + "files": [ + "xunit.extensibility.core.2.1.0-beta3-build3029.nupkg", + "xunit.extensibility.core.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.extensibility.core.nuspec", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll.tdnet", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.pdb", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.xml", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.runner.tdnet.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.runner.utility.desktop.dll" + ] + }, + "xunit.extensibility.execution/2.1.0-beta3-build3029": { + "sha512": "WuUYamK4RHrHxihvNuX7NkryMhQrpH1+ziJ/mPIQbm18zevSgre8BwUuVZvmLZa8uVob3xS4dvAah2+HCgLiXg==", + "files": [ + "xunit.extensibility.execution.2.1.0-beta3-build3029.nupkg", + "xunit.extensibility.execution.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.extensibility.execution.nuspec", + "lib/dnx451/xunit.execution.dnx.dll", + "lib/dnx451/xunit.execution.dnx.pdb", + "lib/dnx451/xunit.execution.dnx.xml", + "lib/dnxcore50/xunit.execution.dnx.dll", + "lib/dnxcore50/xunit.execution.dnx.pdb", + "lib/dnxcore50/xunit.execution.dnx.xml", + "lib/monoandroid/xunit.execution.MonoAndroid.dll", + "lib/monoandroid/xunit.execution.MonoAndroid.pdb", + "lib/monoandroid/xunit.execution.MonoAndroid.xml", + "lib/monotouch/xunit.execution.MonoTouch.dll", + "lib/monotouch/xunit.execution.MonoTouch.pdb", + "lib/monotouch/xunit.execution.MonoTouch.xml", + "lib/net45/xunit.execution.desktop.dll", + "lib/net45/xunit.execution.desktop.pdb", + "lib/net45/xunit.execution.desktop.xml", + "lib/portable-wpa81+win81/xunit.execution.universal.dll", + "lib/portable-wpa81+win81/xunit.execution.universal.pdb", + "lib/portable-wpa81+win81/xunit.execution.universal.pri", + "lib/portable-wpa81+win81/xunit.execution.universal.xml", + "lib/wp8/xunit.execution.wp8.dll", + "lib/wp8/xunit.execution.wp8.pdb", + "lib/wp8/xunit.execution.wp8.xml", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.dll", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.pdb", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.xml" + ] + }, + "xunit.netcore.extensions/1.0.0-prerelease-00079": { + "serviceable": true, + "sha512": "YtqpdxTUJ776HVnP1JwpauW+ZXBNiLhoAFW2aG+hYyQDvZjrriakrMsFy/OA4aSYCCNCIU6de1iaoxtzLIbgqg==", + "files": [ + "xunit.netcore.extensions.1.0.0-prerelease-00079.nupkg", + "xunit.netcore.extensions.1.0.0-prerelease-00079.nupkg.sha512", + "xunit.netcore.extensions.nuspec", + "lib/dotnet/Xunit.NetCore.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "": [ + "System.Linq.Expressions >= 4.0.10-beta-*", + "System.Reflection.Emit.Lightweight >= 4.0.0-beta-*", + "System.Runtime >= 4.0.20-beta-*", + "System.Runtime.Serialization.Primitives >= 4.0.10-beta-*", + "xunit >= 2.1.0-beta3-*", + "xunit.netcore.extensions >= 1.0.0-prerelease-*" + ], + "DNXCore,Version=v5.0": [] + } +} \ No newline at end of file diff --git a/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.InternalErrorException.cs b/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.InternalErrorException.cs new file mode 100644 index 000000000000..6a5bf956ede5 --- /dev/null +++ b/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.InternalErrorException.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.Serialization; + +namespace System.Composition.Hosting +{ + internal partial class Assumes + { + // The exception that is thrown when an internal assumption failed. + [SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic")] + private class InternalErrorException : Exception + { + public InternalErrorException(string message) + : base(string.Format(CultureInfo.CurrentCulture, Properties.Resources.Diagnostic_InternalExceptionMessage, message)) + { + } + } + } +} diff --git a/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.cs b/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.cs new file mode 100644 index 000000000000..fd98acf482c4 --- /dev/null +++ b/src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.cs @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.Serialization; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting +{ + internal static partial class Assumes + { + [DebuggerStepThrough] + internal static void NotNull(T value) + where T : class + { + IsTrue(value != null); + } + + [DebuggerStepThrough] + internal static void NotNull(T1 value1, T2 value2) + where T1 : class + where T2 : class + { + NotNull(value1); + NotNull(value2); + } + + [DebuggerStepThrough] + internal static void NotNull(T1 value1, T2 value2, T3 value3) + where T1 : class + where T2 : class + where T3 : class + { + NotNull(value1); + NotNull(value2); + NotNull(value3); + } + + [DebuggerStepThrough] + internal static void NotNullOrEmpty(string value) + { + NotNull(value); + IsTrue(value.Length > 0); + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition) + { + if (!condition) + { + throw UncatchableException(null); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message) + { + if (!condition) + { + throw UncatchableException(message); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0, object arg1) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0, arg1)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, object arg0, object arg1, object arg2) + { + if (!condition) + { + throw UncatchableException(String.Format(message, arg0, arg1, arg2)); + } + } + + [DebuggerStepThrough] + internal static void IsTrue(bool condition, /*[Localizable(false)]*/string message, params object[] args) + { + if (!condition) + { + throw UncatchableException(String.Format(message, args)); + } + } + + [DebuggerStepThrough] + internal static T NotReachable() + { + throw UncatchableException("Code path should never be reached!"); + } + + [DebuggerStepThrough] + private static Exception UncatchableException(/*[Localizable(false)]*/string message) + { + return new InternalErrorException(message); + } + } +} diff --git a/src/System.Composition.Hosting/src/Microsoft/Internal/Requires.cs b/src/System.Composition.Hosting/src/Microsoft/Internal/Requires.cs new file mode 100644 index 000000000000..41ff49992510 --- /dev/null +++ b/src/System.Composition.Hosting/src/Microsoft/Internal/Requires.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Diagnostics; +using System.Composition.Hosting.Properties; + +namespace Microsoft.Internal +{ + internal static class Requires + { + [DebuggerStepThrough] + static public void ArgumentNotNull(T argument, string argumentName) + { + if (argument == null) + { + throw ThrowHelper.ArgumentNullException(argumentName); + } + } + } +} \ No newline at end of file diff --git a/src/System.Composition.Hosting/src/Microsoft/Internal/ThrowHelper.cs b/src/System.Composition.Hosting/src/Microsoft/Internal/ThrowHelper.cs new file mode 100644 index 000000000000..85270bbccf2c --- /dev/null +++ b/src/System.Composition.Hosting/src/Microsoft/Internal/ThrowHelper.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Composition; +using System.Composition.Hosting; +using System.Diagnostics; +using System.Composition.Hosting.Properties; + +namespace Microsoft.Internal +{ + internal static class ThrowHelper + { + private static Exception LogException(Exception e) + { + Debug.WriteLine(Resources.Diagnostic_ThrowingException, e.ToString()); + return e; + } + + static public ArgumentNullException ArgumentNullException(string argument) + { + var e = new ArgumentNullException(argument); + LogException(e); + return e; + } + + static public ArgumentException ArgumentException(string message) + { + var e = new ArgumentException(message); + LogException(e); + return e; + } + + static public CompositionFailedException CardinalityMismatch_TooManyExports(string exportKey) + { + var e = new CompositionFailedException(string.Format(Resources.CardinalityMismatch_TooManyExports, exportKey)); + LogException(e); + return e; + } + + static public CompositionFailedException CompositionException(string message) + { + var e = new CompositionFailedException(message); + LogException(e); + return e; + } + + internal static Exception NotImplemented_MetadataCycles() + { + var e = new NotImplementedException(Resources.NotImplemented_MetadataCycles); + LogException(e); + return e; + } + } +} diff --git a/src/System.Composition.Hosting/src/Properties/AssemblyInfo.cs b/src/System.Composition.Hosting/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..db6cbba2c52d --- /dev/null +++ b/src/System.Composition.Hosting/src/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +[assembly: ComVisible(false)] +[assembly: SecurityTransparent] diff --git a/src/System.Composition.Hosting/src/Properties/Resources.Designer.cs b/src/System.Composition.Hosting/src/Properties/Resources.Designer.cs new file mode 100644 index 000000000000..6dfa925c966d --- /dev/null +++ b/src/System.Composition.Hosting/src/Properties/Resources.Designer.cs @@ -0,0 +1,244 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17625 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace System.Composition.Hosting.Properties { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Composition.Hosting.Properties.Resources", typeof(Resources).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to "Only one export for the contract '{0}' is allowed, multiple implementations were found.". + /// + internal static string CardinalityMismatch_TooManyExports { + get { + return ResourceManager.GetString("CardinalityMismatch_TooManyExports", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The component (unknown) cannot be created outside the {0} sharing boundary.. + /// + internal static string Component_NotCreatableOutsideSharingBoundary { + get { + return ResourceManager.GetString("Component_NotCreatableOutsideSharingBoundary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sharing lock is required. + /// + internal static string CompositionOperation_SharingLockRequired { + get { + return ResourceManager.GetString("CompositionOperation_SharingLockRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No export was found for the contract '{0}'. + /// + internal static string Dependency_ExportNotFound { + get { + return ResourceManager.GetString("Dependency_ExportNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}'. + /// + internal static string Dependency_QuoteParameter { + get { + return ResourceManager.GetString("Dependency_QuoteParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only one export for the contract '{0}' is allowed, but the following parts: {1} export it.. + /// + internal static string Dependency_TooManyExports { + get { + return ResourceManager.GetString("Dependency_TooManyExports", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' on contract '{1}' supplied by {2}. + /// + internal static string Dependency_ToStringFormat { + get { + return ResourceManager.GetString("Dependency_ToStringFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal error occurred. Additional information: '{0}'.. + /// + internal static string Diagnostic_InternalExceptionMessage { + get { + return ResourceManager.GetString("Diagnostic_InternalExceptionMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exception Thrown: {0}\r\n. + /// + internal static string Diagnostic_ThrowingException { + get { + return ResourceManager.GetString("Diagnostic_ThrowingException", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to -> required by initial request for contract '{0}'. + /// + internal static string ExportDescriptor_DependencyErrorContract { + get { + return ResourceManager.GetString("ExportDescriptor_DependencyErrorContract", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to -> required by import '{0}' of part '{1}'. + /// + internal static string ExportDescriptor_DependencyErrorLine { + get { + return ResourceManager.GetString("ExportDescriptor_DependencyErrorLine", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} supplied by {1}. + /// + internal static string ExportDescriptor_ToStringFormat { + get { + return ResourceManager.GetString("ExportDescriptor_ToStringFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detected an unsupported cycle for part '{0}'. To construct a valid cycle, at least one part in the cycle must be shared, and at least one import in the cycle must be non-prerequisite (e.g. a property).. + /// + internal static string ExportDescriptor_UnsupportedCycle { + get { + return ResourceManager.GetString("ExportDescriptor_UnsupportedCycle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export descriptor fulfillment function returned null.. + /// + internal static string ExportDescriptorNull { + get { + return ResourceManager.GetString("ExportDescriptorNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string Formatter_ListSeparatorWithSpace { + get { + return ResourceManager.GetString("Formatter_ListSeparatorWithSpace", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <none>. + /// + internal static string Formatter_None { + get { + return ResourceManager.GetString("Formatter_None", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metadata View Provider. + /// + internal static string Keyword_MetadataViewProvider { + get { + return ResourceManager.GetString("Keyword_MetadataViewProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The type '{0}' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.. + /// + internal static string MetadataViewProvider_InvalidViewImplementation { + get { + return ResourceManager.GetString("MetadataViewProvider_InvalidViewImplementation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export metadata for '{0}' is missing and no default value was supplied.. + /// + internal static string MetadataViewProvider_MissingMetadata { + get { + return ResourceManager.GetString("MetadataViewProvider_MissingMetadata", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Metadata value circularity not possible, use lazy initialization.. + /// + internal static string NotImplemented_MetadataCycles { + get { + return ResourceManager.GetString("NotImplemented_MetadataCycles", resourceCulture); + } + } + } +} diff --git a/src/System.Composition.Hosting/src/Properties/Resources.resx b/src/System.Composition.Hosting/src/Properties/Resources.resx new file mode 100644 index 000000000000..fa6bc904b375 --- /dev/null +++ b/src/System.Composition.Hosting/src/Properties/Resources.resx @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Sharing lock is required + + + No export was found for the contract '{0}' + + + '{0}' + + + Only one export for the contract '{0}' is allowed, but the following parts: {1} export it. + Parameter {1} is a list of items + + + '{0}' on contract '{1}' supplied by {2} + + + Export descriptor fulfillment function returned null. + + + {0} supplied by {1} + + + <none> + + + Internal error occurred. Additional information: '{0}'. + + + Metadata value circularity not possible, use lazy initialization. + + + "Only one export for the contract '{0}' is allowed, multiple implementations were found." + + + Exception Thrown: {0}\r\n + + + -> required by initial request for contract '{0}' + + + -> required by import '{0}' of part '{1}' + + + Detected an unsupported cycle for part '{0}'. To construct a valid cycle, at least one part in the cycle must be shared, and at least one import in the cycle must be non-prerequisite (e.g. a property). + + + The component (unknown) cannot be created outside the {0} sharing boundary. + + + Metadata View Provider + + + The type '{0}' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor. + + + Export metadata for '{0}' is missing and no default value was supplied. + + + , + + \ No newline at end of file diff --git a/src/System.Composition.Hosting/src/System.Composition.Hosting.csproj b/src/System.Composition.Hosting/src/System.Composition.Hosting.csproj new file mode 100644 index 000000000000..04d5fa8cbafe --- /dev/null +++ b/src/System.Composition.Hosting/src/System.Composition.Hosting.csproj @@ -0,0 +1,82 @@ + + + + + + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2} + Library + Properties + System.Composition.Hosting + System.Composition.Hosting + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + true + 11.0 + + + + + + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + + + + + + + + True + True + Resources.resx + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/CompositionHost.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/CompositionHost.cs new file mode 100644 index 000000000000..587f6b0baeab --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/CompositionHost.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Hosting.Providers.CurrentScope; +using System.Composition.Hosting.Providers.ExportFactory; +using System.Composition.Hosting.Providers.ImportMany; +using System.Composition.Hosting.Providers.Lazy; +using System.Composition.Hosting.Providers.Metadata; +using System.Composition.Runtime; +using System.Linq; + +using Microsoft.Internal; + +namespace System.Composition.Hosting +{ + /// + /// Assembles a lightweight composition container from configured + /// providers. + /// + public sealed class CompositionHost : CompositionContext, IDisposable + { + private static readonly string[] s_noBoundaries = new string[0]; + + private readonly LifetimeContext _rootLifetimeContext; + + private CompositionHost(LifetimeContext rootLifetimeContext) + { + Requires.ArgumentNotNull(rootLifetimeContext, "rootLifetimeContext"); + + _rootLifetimeContext = rootLifetimeContext; + } + + /// + /// Create the composition host. + /// + /// The container as an . + public static CompositionHost CreateCompositionHost(params ExportDescriptorProvider[] providers) + { + return CreateCompositionHost((IEnumerable)providers); + } + + /// + /// Create the composition host. + /// + /// The container as an . + public static CompositionHost CreateCompositionHost(IEnumerable providers) + { + Requires.ArgumentNotNull(providers, "providers"); + + var allProviders = new ExportDescriptorProvider[] { + new LazyExportDescriptorProvider(), + new ExportFactoryExportDescriptorProvider(), + new ImportManyExportDescriptorProvider(), + new LazyWithMetadataExportDescriptorProvider(), + new CurrentScopeExportDescriptorProvider(), + new ExportFactoryWithMetadataExportDescriptorProvider() + } + .Concat(providers) + .ToArray(); + + var container = new LifetimeContext(new ExportDescriptorRegistry(allProviders), s_noBoundaries); + return new CompositionHost(container); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The contract to retrieve. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public override bool TryGetExport(CompositionContract contract, out object export) + { + return _rootLifetimeContext.TryGetExport(contract, out export); + } + + /// + /// Release the host and any globally-shared parts. + /// + public void Dispose() + { + _rootLifetimeContext.Dispose(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositeActivator.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositeActivator.cs new file mode 100644 index 000000000000..90def4d88942 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositeActivator.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace System.Composition.Hosting.Core +{ + /// + /// The delegate signature that allows instances of parts and exports to be accessed during + /// a composition operation. + /// + /// The context in which the part or export is being accessed. + /// The operation within which the activation is occuring. + /// The activated part or export. + public delegate object CompositeActivator(LifetimeContext context, CompositionOperation operation); +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionDependency.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionDependency.cs new file mode 100644 index 000000000000..2677a4dd6657 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionDependency.cs @@ -0,0 +1,159 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +// ----------------------------------------------------------------------- +// Copyright © Microsoft Corporation. All rights reserved. +// ----------------------------------------------------------------------- +using System.Composition.Hosting.Util; +using System.Composition.Runtime; +using System.Linq; +using System.Text; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + /// + /// Describes a dependency that a part must have in order to fulfill an + /// . Used by the composition engine during + /// initialization to determine whether the composition can be made, and if not, + /// what error to provide. + /// + public class CompositionDependency + { + private readonly ExportDescriptorPromise _target; + private readonly bool _isPrerequisite; + private readonly object _site; + private readonly CompositionContract _contract; + + // Carrying some information to later use in error messages - + // it may be better to just store the message. + private readonly ExportDescriptorPromise[] _oversuppliedTargets; + + /// + /// Construct a dependency on the specified target. + /// + /// The export descriptor promise from another part + /// that this part is dependent on. + /// True if the dependency is a prerequisite + /// that must be satisfied before any exports can be retrieved from the dependent + /// part; otherwise, false. + /// A marker used to identify the individual dependency among + /// those on the dependent part. + /// The contract required by the dependency. + public static CompositionDependency Satisfied(CompositionContract contract, ExportDescriptorPromise target, bool isPrerequisite, object site) + { + Requires.ArgumentNotNull(target, "target"); + Requires.ArgumentNotNull(site, "site"); + Requires.ArgumentNotNull(contract, "contract"); + + return new CompositionDependency(contract, target, isPrerequisite, site); + } + + /// + /// Construct a placeholder for a missing dependency. Note that this is different + /// from an optional dependency - a missing dependency is an error. + /// + /// A marker used to identify the individual dependency among + /// those on the dependent part. + /// The contract required by the dependency. + public static CompositionDependency Missing(CompositionContract contract, object site) + { + Requires.ArgumentNotNull(contract, "contract"); + Requires.ArgumentNotNull(site, "site"); + + return new CompositionDependency(contract, site); + } + + /// + /// Construct a placeholder for an "exactly one" dependency that cannot be + /// configured because multiple target implementations exist. + /// + /// A marker used to identify the individual dependency among + /// those on the dependent part. + /// The targets found when expecting only one. + /// The contract required by the dependency. + public static CompositionDependency Oversupplied(CompositionContract contract, IEnumerable targets, object site) + { + Requires.ArgumentNotNull(targets, "targets"); + Requires.ArgumentNotNull(site, "site"); + Requires.ArgumentNotNull(contract, "contract"); + + return new CompositionDependency(contract, targets, site); + } + + private CompositionDependency(CompositionContract contract, ExportDescriptorPromise target, bool isPrerequisite, object site) + { + _target = target; + _isPrerequisite = isPrerequisite; + _site = site; + _contract = contract; + } + + private CompositionDependency(CompositionContract contract, object site) + { + _contract = contract; + _site = site; + } + + private CompositionDependency(CompositionContract contract, IEnumerable targets, object site) + { + _oversuppliedTargets = targets.ToArray(); + _site = site; + _contract = contract; + } + + /// + /// The export descriptor promise from another part + /// that this part is dependent on. + /// + public ExportDescriptorPromise Target { get { return _target; } } + + /// + /// True if the dependency is a prerequisite + /// that must be satisfied before any exports can be retrieved from the dependent + /// part; otherwise, false. + /// + public bool IsPrerequisite { get { return _isPrerequisite; } } + + /// + /// A marker used to identify the individual dependency among + /// those on the dependent part. + /// + public object Site { get { return _site; } } + + /// + /// The contract required by the dependency. + /// + public CompositionContract Contract { get { return _contract; } } + + /// + /// Creates a human-readable explanation of the dependency. + /// + /// The dependency represented as a string. + public override string ToString() + { + if (IsError) + return Site.ToString(); + + return string.Format(Properties.Resources.Dependency_ToStringFormat, Site, Target.Contract, Target.Origin); + } + + internal bool IsError { get { return _target == null; } } + + internal void DescribeError(StringBuilder message) + { + Assumes.IsTrue(IsError, "Dependency is not in an error state."); + + if (_oversuppliedTargets != null) + { + var list = Formatters.ReadableList(_oversuppliedTargets.Select(t => string.Format(Properties.Resources.Dependency_QuoteParameter, t.Origin))); + message.AppendFormat(Properties.Resources.Dependency_TooManyExports, Contract, list); + } + else + { + message.AppendFormat(Properties.Resources.Dependency_ExportNotFound, Contract); + } + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionOperation.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionOperation.cs new file mode 100644 index 000000000000..fb7f1cf5650e --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CompositionOperation.cs @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Composition; +using System.Collections.Generic; +using System.Threading; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + /// + /// Represents a single logical graph-building operation. + /// + /// Instances of this class are not safe for access by multiple threads. + public sealed class CompositionOperation : IDisposable + { + private List _nonPrerequisiteActions; + private List _postCompositionActions; + private object _sharingLock; + + // Construct using Run() method. + private CompositionOperation() { } + + /// + /// Execute a new composition operation starting within the specified lifetime + /// context, for the specified activator. + /// + /// Context in which to begin the operation (the operation can flow + /// to the parents of the context if requried). + /// Activator that will drive the operation. + /// The composed object graph. + public static object Run(LifetimeContext outermostLifetimeContext, CompositeActivator compositionRootActivator) + { + Requires.ArgumentNotNull(outermostLifetimeContext, "outermostLifetimeContext"); + Requires.ArgumentNotNull(compositionRootActivator, "compositionRootActivator"); + + using (var operation = new CompositionOperation()) + { + var result = compositionRootActivator(outermostLifetimeContext, operation); + operation.Complete(); + return result; + } + } + + /// + /// Called during the activation process to specify an action that can run after all + /// prerequesite part dependencies have been satisfied. + /// + /// Action to run. + public void AddNonPrerequisiteAction(Action action) + { + if (action == null) + throw new ArgumentNullException("action"); + + if (_nonPrerequisiteActions == null) + _nonPrerequisiteActions = new List(); + + _nonPrerequisiteActions.Add(action); + } + + /// + /// Called during the activation process to specify an action that must run only after + /// all composition has completed. See OnImportsSatisfiedAttribute. + /// + /// Action to run. + public void AddPostCompositionAction(Action action) + { + Requires.ArgumentNotNull(action, "action"); + + if (_postCompositionActions == null) + _postCompositionActions = new List(); + + _postCompositionActions.Add(action); + } + + internal void EnterSharingLock(object sharingLock) + { + Assumes.NotNull(sharingLock, "Sharing lock is required"); + + if (_sharingLock == null) + { + _sharingLock = sharingLock; + Monitor.Enter(sharingLock); + } + + Assumes.IsTrue(_sharingLock == sharingLock, "Sharing lock already taken in this operation."); + } + + private void Complete() + { + while (_nonPrerequisiteActions != null) + RunAndClearActions(); + + if (_postCompositionActions != null) + { + foreach (var action in _postCompositionActions) + action(); + + _postCompositionActions = null; + } + } + + private void RunAndClearActions() + { + var currentActions = _nonPrerequisiteActions; + _nonPrerequisiteActions = null; + + foreach (var action in currentActions) + action(); + } + + /// + /// Release locks held during the operation. + /// + public void Dispose() + { + if (_sharingLock != null) + Monitor.Exit(_sharingLock); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingExportDescriptor.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingExportDescriptor.cs new file mode 100644 index 000000000000..32b4b2b806f1 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingExportDescriptor.cs @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace System.Composition.Hosting.Core +{ + internal class CycleBreakingExportDescriptor : ExportDescriptor + { + private readonly Lazy _exportDescriptor; + + public CycleBreakingExportDescriptor(Lazy exportDescriptor) + { + _exportDescriptor = exportDescriptor; + } + + public override CompositeActivator Activator + { + get + { + if (!_exportDescriptor.IsValueCreated) + return Activate; + + return _exportDescriptor.Value.Activator; + } + } + + public override IDictionary Metadata + { + get + { + if (!_exportDescriptor.IsValueCreated) + return new CycleBreakingMetadataDictionary(_exportDescriptor); + + return _exportDescriptor.Value.Metadata; + } + } + + private object Activate(LifetimeContext context, CompositionOperation operation) + { + Assumes.IsTrue(_exportDescriptor.IsValueCreated, "Activation in progress before all descriptors fully initialized."); + + Debug.WriteLine("[System.Composition] Activating via cycle-breaking proxy."); + return _exportDescriptor.Value.Activator(context, operation); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingMetadataDictionary.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingMetadataDictionary.cs new file mode 100644 index 000000000000..f8a50cb68166 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/CycleBreakingMetadataDictionary.cs @@ -0,0 +1,117 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + internal class CycleBreakingMetadataDictionary : IDictionary + { + private readonly Lazy _exportDescriptor; + + public CycleBreakingMetadataDictionary(Lazy exportDescriptor) + { + _exportDescriptor = exportDescriptor; + } + + private IDictionary ActualMetadata + { + get + { + if (!_exportDescriptor.IsValueCreated) + throw ThrowHelper.NotImplemented_MetadataCycles(); + + return _exportDescriptor.Value.Metadata; + } + } + + public void Add(string key, object value) + { + ActualMetadata.Add(key, value); + } + + public bool ContainsKey(string key) + { + return ActualMetadata.ContainsKey(key); + } + + public ICollection Keys + { + get { return ActualMetadata.Keys; } + } + + public bool Remove(string key) + { + return ActualMetadata.Remove(key); + } + + public bool TryGetValue(string key, out object value) + { + return ActualMetadata.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return ActualMetadata.Values; } + } + + public object this[string key] + { + get + { + return ActualMetadata[key]; + } + set + { + ActualMetadata[key] = value; + } + } + + public void Add(KeyValuePair item) + { + ActualMetadata.Add(item); + } + + public void Clear() + { + ActualMetadata.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return ActualMetadata.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + ActualMetadata.CopyTo(array, arrayIndex); + } + + public int Count + { + get { return ActualMetadata.Count; } + } + + public bool IsReadOnly + { + get { return ActualMetadata.IsReadOnly; } + } + + public bool Remove(KeyValuePair item) + { + return ActualMetadata.Remove(item); + } + + public IEnumerator> GetEnumerator() + { + return ActualMetadata.GetEnumerator(); + } + + Collections.IEnumerator Collections.IEnumerable.GetEnumerator() + { + return ((Collections.IEnumerable)ActualMetadata).GetEnumerator(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DependencyAccessor.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DependencyAccessor.cs new file mode 100644 index 000000000000..6d01c060a4f4 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DependencyAccessor.cs @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Runtime; +using System.Linq; + +namespace System.Composition.Hosting.Core +{ + /// + /// Allows s to locate the dependencies they require. + /// + public abstract class DependencyAccessor + { + /// + /// Get all definitions for a specified . + /// + /// The export key the definitions must supply. + /// The available promises for that export key. + protected abstract IEnumerable GetPromises(CompositionContract exportKey); + + /// + /// Resolve dependencies on all implementations of a contract. + /// + /// A tag describing the dependency site. + /// The contract required by the site. + /// True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false. + /// Dependencies for all implementations of the contact. + public IEnumerable ResolveDependencies(object site, CompositionContract contract, bool isPrerequisite) + { + var all = GetPromises(contract).ToArray(); + var result = new CompositionDependency[all.Length]; + for (var i = 0; i < all.Length; ++i) + result[i] = CompositionDependency.Satisfied(contract, all[i], isPrerequisite, site); + return result; + } + + /// + /// Resolve a required dependency on exactly one implemenation of a contract. + /// + /// A tag describing the dependency site. + /// The contract required by the site. + /// True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false. + /// The dependency. + public CompositionDependency ResolveRequiredDependency(object site, CompositionContract contract, bool isPrerequisite) + { + CompositionDependency result; + if (!TryResolveOptionalDependency(site, contract, isPrerequisite, out result)) + return CompositionDependency.Missing(contract, site); + + return result; + } + + /// + /// Resolve an optional dependency on exactly one implemenation of a contract. + /// + /// A tag describing the dependency site. + /// The contract required by the site. + /// True if the dependency must be satisifed before corresponding exports can be retrieved; otherwise, false. + /// The dependency, or null. + /// True if the dependency could be resolved; otherwise, false. + public bool TryResolveOptionalDependency(object site, CompositionContract contract, bool isPrerequisite, out CompositionDependency dependency) + { + var all = GetPromises(contract).ToArray(); + if (all.Length == 0) + { + dependency = null; + return false; + } + + if (all.Length != 1) + { + dependency = CompositionDependency.Oversupplied(contract, all, site); + return true; + } + + dependency = CompositionDependency.Satisfied(contract, all[0], isPrerequisite, site); + return true; + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DirectExportDescriptor.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DirectExportDescriptor.cs new file mode 100644 index 000000000000..d75d39ea998f --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/DirectExportDescriptor.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + internal class DirectExportDescriptor : ExportDescriptor + { + private readonly CompositeActivator _activator; + private readonly IDictionary _metadata; + + public DirectExportDescriptor(CompositeActivator activator, IDictionary metadata) + { + Requires.ArgumentNotNull(activator, "activator"); + Requires.ArgumentNotNull(metadata, "metadata"); + + _activator = activator; + _metadata = metadata; + } + + public override CompositeActivator Activator { get { return _activator; } } + + public override IDictionary Metadata { get { return _metadata; } } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptor.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptor.cs new file mode 100644 index 000000000000..1c6f0c52fce4 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptor.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; + +namespace System.Composition.Hosting.Core +{ + /// + /// Describes an export of a part known to the composition engine. This is the only runtime + /// overhead that is maintained per-part; all other part-specific information must be discarded once + /// its export descriptors have been retrieved. + /// + public abstract class ExportDescriptor + { + /// + /// The activator used to retrieve instances of the export. + /// + public abstract CompositeActivator Activator { get; } + + /// + /// The Export Metadata associated with the export. + /// + public abstract IDictionary Metadata { get; } + + /// + /// Construct an . + /// + /// The activator used to retrieve instances of the export. + /// The Export Metadata associated with the export. + /// The export descriptor. + public static ExportDescriptor Create(CompositeActivator activator, IDictionary metadata) + { + return new DirectExportDescriptor(activator, metadata); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorPromise.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorPromise.cs new file mode 100644 index 000000000000..138f383562de --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorPromise.cs @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Composition.Runtime; +using System.Linq; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + /// + /// Represents an export descriptor that an available part can provide. + /// + /// This type is central to the cycle-checking, adaptation and + /// compilation features of the container. + public class ExportDescriptorPromise + { + private readonly string _origin; + private readonly bool _isShared; + private readonly Lazy> _dependencies; + private readonly Lazy _descriptor; + private readonly CompositionContract _contract; + + private bool _creating; + + /// + /// Create a promise for an export descriptor. + /// + /// A description of where the export is being provided from (e.g. the part type). + /// Used to provide friendly errors. + /// True if the export is shared within some context, otherwise false. Used in cycle + /// checking. + /// A function providing dependencies required in order to fulfill the promise. + /// A function providing the promise. + /// The contract fulfilled by this promise. + /// . + public ExportDescriptorPromise( + CompositionContract contract, + string origin, + bool isShared, + Func> dependencies, + Func, ExportDescriptor> getDescriptor) + { + _contract = contract; + _origin = origin; + _isShared = isShared; + _dependencies = new Lazy>(() => new ReadOnlyCollection(dependencies().ToList()), false); + _descriptor = new Lazy(() => getDescriptor(_dependencies.Value), false); + } + + /// + /// A description of where the export is being provided from (e.g. the part type). + /// Used to provide friendly errors. + /// + public string Origin { get { return _origin; } } + + /// + /// True if the export is shared within some context, otherwise false. Used in cycle + /// checking. + /// + public bool IsShared { get { return _isShared; } } + + /// + /// The dependencies required in order to fulfill the promise. + /// + public ReadOnlyCollection Dependencies { get { return _dependencies.Value; } } + + /// + /// The contract fulfilled by this promise. + /// + public CompositionContract Contract { get { return _contract; } } + + /// + /// Retrieve the promised export descriptor. + /// + /// The export descriptor. + public ExportDescriptor GetDescriptor() + { + if (_creating && !_descriptor.IsValueCreated) + return new CycleBreakingExportDescriptor(_descriptor); + + _creating = true; + try + { + var reply = _descriptor.Value; + Assumes.IsTrue(reply != null, "Export descriptor fulfillment function returned null."); + return reply; + } + finally + { + _creating = false; + } + } + + /// + /// Describes the promise. + /// + /// A description of the promise. + public override string ToString() + { + return string.Format(Properties.Resources.ExportDescriptor_ToStringFormat, Contract, Origin); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorProvider.cs new file mode 100644 index 000000000000..f786bea4df36 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorProvider.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace System.Composition.Hosting.Core +{ + /// + /// A contributor to the composition. + /// + /// Instances of this class are not required to be safe for concurrent access by + /// multiple threads. + public abstract class ExportDescriptorProvider + { + /// + /// Constant value provided so that subclasses can avoid creating additional duplicate values. + /// + [SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] + protected static readonly IEnumerable NoExportDescriptors = Enumerable.Empty(); + + /// + /// Constant value provided so that subclasses can avoid creating additional duplicate values. + /// + [SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] + protected static readonly IDictionary NoMetadata = new ReadOnlyDictionary(new Dictionary()); + + /// + /// Constant value provided so that subclasses can avoid creating additional duplicate values. + /// + [SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] + protected static readonly Func> NoDependencies = () => Enumerable.Empty(); + + /// + /// Promise export descriptors for the specified export key. + /// + /// The export key required by another component. + /// Accesses the other export descriptors present in the composition. + /// Promises for new export descriptors. + /// + /// A provider will only be queried once for each unique export key. + /// The descriptor accessor can only be queried immediately if the descriptor being promised is an adapter, such as + /// ; otherwise, dependencies should only be queried within execution of the function provided + /// to the . The actual descriptors provided should not close over or reference any + /// aspect of the dependency/promise structure, as this should be able to be GC'ed. + /// + public abstract IEnumerable GetExportDescriptors( + CompositionContract contract, + DependencyAccessor descriptorAccessor); + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistry.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistry.cs new file mode 100644 index 000000000000..ee9406d93f78 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistry.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Runtime; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + internal class ExportDescriptorRegistry + { + private readonly object _thisLock = new object(); + private readonly ExportDescriptorProvider[] _exportDescriptorProviders; + private volatile IDictionary _partDefinitions = new Dictionary(); + + public ExportDescriptorRegistry(ExportDescriptorProvider[] exportDescriptorProviders) + { + _exportDescriptorProviders = exportDescriptorProviders; + } + + public bool TryGetSingleForExport(CompositionContract exportKey, out ExportDescriptor defaultForExport) + { + ExportDescriptor[] allForExport; + if (!_partDefinitions.TryGetValue(exportKey, out allForExport)) + { + lock (_thisLock) + { + if (!_partDefinitions.ContainsKey(exportKey)) + { + var updatedDefinitions = new Dictionary(_partDefinitions); + var updateOperation = new ExportDescriptorRegistryUpdate(updatedDefinitions, _exportDescriptorProviders); + updateOperation.Execute(exportKey); + + _partDefinitions = updatedDefinitions; + } + } + + allForExport = (ExportDescriptor[])_partDefinitions[exportKey]; + } + + if (allForExport.Length == 0) + { + defaultForExport = null; + return false; + } + + // This check is duplicated in the update process- the update operation will catch + // cardinality violations in advance of this in all but a few very rare scenarios. + if (allForExport.Length != 1) + throw ThrowHelper.CardinalityMismatch_TooManyExports(exportKey.ToString()); + + defaultForExport = allForExport[0]; + return true; + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistryUpdate.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistryUpdate.cs new file mode 100644 index 000000000000..3083111a680f --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorRegistryUpdate.cs @@ -0,0 +1,156 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Runtime; +using System.Linq; +using System.Text; +using Microsoft.Internal; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Core +{ + internal class ExportDescriptorRegistryUpdate : DependencyAccessor + { + private readonly IDictionary _partDefinitions; + private readonly ExportDescriptorProvider[] _exportDescriptorProviders; + private readonly IDictionary _updateResults = new Dictionary(); + + private static readonly CompositionDependency[] s_noDependenciesValue = new CompositionDependency[0]; + private static readonly Func s_noDependencies = () => s_noDependenciesValue; + + private bool _updateFinished; + + public ExportDescriptorRegistryUpdate( + IDictionary partDefinitions, + ExportDescriptorProvider[] exportDescriptorProviders) + { + _partDefinitions = partDefinitions; + _exportDescriptorProviders = exportDescriptorProviders; + } + + public void Execute(CompositionContract contract) + { + // Opportunism - we'll miss recursive calls to Execute(), but this will catch some problems + // and the _updateFinished flag is required for other purposes anyway. + if (_updateFinished) throw new InvalidOperationException("The update has already executed."); + + CompositionDependency initial; + if (TryResolveOptionalDependency("initial request", contract, true, out initial)) + { + var @checked = new HashSet(); + var checking = new Stack(); + CheckTarget(initial, @checked, checking); + } + + _updateFinished = true; + + foreach (var result in _updateResults) + { + var resultContract = result.Key; + var descriptors = result.Value.GetResults().Select(cb => cb.GetDescriptor()).ToArray(); + _partDefinitions.Add(resultContract, descriptors); + } + } + + private void CheckTarget(CompositionDependency dependency, HashSet @checked, Stack checking) + { + if (dependency.IsError) + { + var message = new StringBuilder(); + dependency.DescribeError(message); + message.AppendLine(); + message.Append(DescribeCompositionStack(dependency, checking)); + + throw ThrowHelper.CompositionException(message.ToString()); + } + + if (@checked.Contains(dependency.Target)) + return; + + @checked.Add(dependency.Target); + + checking.Push(dependency); + foreach (var dep in dependency.Target.Dependencies) + CheckDependency(dep, @checked, checking); + checking.Pop(); + } + + private void CheckDependency(CompositionDependency dependency, HashSet @checked, Stack checking) + { + if (@checked.Contains(dependency.Target)) + { + var sharedSeen = false; + var nonPrereqSeen = !dependency.IsPrerequisite; + + foreach (var step in checking) + { + if (step.Target.IsShared) + sharedSeen = true; + + if (sharedSeen && nonPrereqSeen) + break; + + if (step.Target.Equals(dependency.Target)) + { + var message = new StringBuilder(); + message.AppendFormat(Properties.Resources.ExportDescriptor_UnsupportedCycle, dependency.Target.Origin); + message.AppendLine(); + message.Append(DescribeCompositionStack(dependency, checking)); + throw ThrowHelper.CompositionException(message.ToString()); + } + + if (!step.IsPrerequisite) + nonPrereqSeen = true; + } + } + + CheckTarget(dependency, @checked, checking); + } + + private StringBuilder DescribeCompositionStack(CompositionDependency import, IEnumerable dependencies) + { + var result = new StringBuilder(); + if (dependencies.FirstOrDefault() == null) + { + return result; + } + + foreach (var step in dependencies) + { + result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorLine, import.Site, step.Target.Origin); + result.AppendLine(); + import = step; + } + + result.AppendFormat(Properties.Resources.ExportDescriptor_DependencyErrorContract, import.Contract); + return result; + } + + protected override IEnumerable GetPromises(CompositionContract contract) + { + Assumes.IsTrue(!_updateFinished, "Update is finished - dependencies should have been requested earlier."); + + ExportDescriptor[] definitions; + if (_partDefinitions.TryGetValue(contract, out definitions)) + return definitions.Select(d => new ExportDescriptorPromise(contract, "Preexisting", false, s_noDependencies, _ => d)).ToArray(); + + UpdateResult updateResult; + if (!_updateResults.TryGetValue(contract, out updateResult)) + { + updateResult = new UpdateResult(_exportDescriptorProviders); + _updateResults.Add(contract, updateResult); + } + + ExportDescriptorProvider nextProvider; + while (updateResult.TryDequeueNextProvider(out nextProvider)) + { + var newDefinitions = nextProvider.GetExportDescriptors(contract, this); + foreach (var definition in newDefinitions) + updateResult.AddPromise(definition); + } + + return updateResult.GetResults(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/LifetimeContext.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/LifetimeContext.cs new file mode 100644 index 000000000000..cdf9805cf1e3 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/LifetimeContext.cs @@ -0,0 +1,222 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting.Util; +using System.Composition.Runtime; +using System.Threading; +using Microsoft.Internal; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Core +{ + /// + /// Represents a node in the lifetime tree. A is the unit of + /// sharing for shared parts, controls the disposal of bound parts, and can be used to retrieve + /// instances either as part of an existing or as the basis of a new + /// composition operation. An individual lifetime context can be marked to contain parts that are + /// constrained by particular sharing boundaries. + /// + /// + /// Contains two pieces of _independently protected_ shared state. Shared part instances is + /// lock-free-readable and does not result in issues if added to during disposal. It is protected + /// by being locked itself. Activation logic is unavoidably called under this lock. + /// Bound part instances is always protected, by locking [this], and should never be written to + /// after disposal and so is set to null under a lock in Dispose(). If it were allowed it would result in + /// diposable parts not being released. Dispose methods on parts are called outside the lock. + /// + /// + public sealed class LifetimeContext : CompositionContext, IDisposable + { + private readonly LifetimeContext _root; + private readonly LifetimeContext _parent; + + // Protects the two members holding shared instances + private readonly object _sharingLock = new object(); + private SmallSparseInitonlyArray _sharedPartInstances, _instancesUndergoingInitialization; + + // Protects the member holding bound instances. + private readonly object _boundPartLock = new object(); + private List _boundPartInstances = new List(0); + + private readonly string[] _sharingBoundaries; + private readonly ExportDescriptorRegistry _partRegistry; + + private static int s_nextSharingId = -1; + + /// + /// Generates an identifier that can be used to locate shared part instances. + /// + /// A new unique identifier. + public static int AllocateSharingId() + { + return Interlocked.Increment(ref s_nextSharingId); + } + + internal LifetimeContext(ExportDescriptorRegistry partRegistry, string[] sharingBoundaries) + { + _root = this; + _sharingBoundaries = sharingBoundaries; + _partRegistry = partRegistry; + } + + internal LifetimeContext(LifetimeContext parent, string[] sharingBoundaries) + { + _parent = parent; + _root = parent._root; + _sharingBoundaries = sharingBoundaries; + _partRegistry = parent._partRegistry; + } + + /// + /// Find the broadest lifetime context within all of the specified sharing boundaries. + /// + /// The sharing boundary to find a lifetime context within. + /// The broadest lifetime context within all of the specified sharing boundaries. + /// Currently, the root cannot be a boundary. + public LifetimeContext FindContextWithin(string sharingBoundary) + { + if (sharingBoundary == null) + return _root; + + var toCheck = this; + while (toCheck != null) + { + foreach (var implemented in toCheck._sharingBoundaries) + { + if (implemented == sharingBoundary) + return toCheck; + } + + toCheck = toCheck._parent; + } + + // To generate acceptable error messages here we're going to need to pass in a description + // of the component, or otherwise find a way to get one. + throw ThrowHelper.CompositionException(string.Format(Properties.Resources.Component_NotCreatableOutsideSharingBoundary, sharingBoundary)); + } + + /// + /// Release the lifetime context and any disposable part instances + /// that are bound to it. + /// + public void Dispose() + { + IEnumerable toDispose = null; + lock (_boundPartLock) + { + if (_boundPartInstances != null) + { + toDispose = _boundPartInstances; + _boundPartInstances = null; + } + } + + if (toDispose != null) + { + foreach (var instance in toDispose) + instance.Dispose(); + } + } + + /// + /// Bind the lifetime of a disposable part to the current + /// lifetime context. + /// + /// The disposable part to bind. + public void AddBoundInstance(IDisposable instance) + { + lock (_boundPartLock) + { + if (_boundPartInstances == null) + throw new ObjectDisposedException(ToString()); + + _boundPartInstances.Add(instance); + } + } + + /// + /// Either retrieve an existing part instance with the specified sharing id, or + /// create and share a new part instance using within + /// . + /// + /// Sharing id for the part in question. + /// Operation in which to activate a new part instance if necessary. + /// Activator that can activate a new part instance if necessary. + /// The part instance corresponding to within this lifetime context. + /// This method is lock-free if the part instance already exists. If the part instance must be created, + /// a lock will be taken that will serialize other writes via this method (concurrent reads will continue to + /// be safe and lock-free). It is important that the composition, and thus lock acquisition, is strictly + /// leaf-to-root in the lifetime tree. + public object GetOrCreate(int sharingId, CompositionOperation operation, CompositeActivator creator) + { + object result; + if (_sharedPartInstances != null && _sharedPartInstances.TryGetValue(sharingId, out result)) + return result; + + // Remains locked for the rest of the operation. + operation.EnterSharingLock(_sharingLock); + + if (_sharedPartInstances == null) + { + _sharedPartInstances = new SmallSparseInitonlyArray(); + _instancesUndergoingInitialization = new SmallSparseInitonlyArray(); + } + else if (_sharedPartInstances.TryGetValue(sharingId, out result)) + { + return result; + } + + // Already being initialized _on the same thread_. + if (_instancesUndergoingInitialization.TryGetValue(sharingId, out result)) + return result; + + result = creator(this, operation); + + _instancesUndergoingInitialization.Add(sharingId, result); + + operation.AddPostCompositionAction(() => + { + _sharedPartInstances.Add(sharingId, result); + }); + + return result; + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The contract to retrieve. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public override bool TryGetExport(CompositionContract contract, out object export) + { + ExportDescriptor defaultForExport; + if (!_partRegistry.TryGetSingleForExport(contract, out defaultForExport)) + { + export = null; + return false; + } + + export = CompositionOperation.Run(this, defaultForExport.Activator); + return true; + } + + /// + /// Describes this lifetime context. + /// + /// A string description. + public override string ToString() + { + if (_parent == null) + return "Root Lifetime Context"; + + if (_sharingBoundaries.Length == 0) + return "Non-sharing Lifetime Context"; + + return "Boundary for " + string.Join(", ", _sharingBoundaries); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/UpdateResult.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/UpdateResult.cs new file mode 100644 index 000000000000..2a2d21fd7dd8 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/UpdateResult.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Linq; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Core +{ + // Update results ensure that providers can query reentrantly for the contract that + // they are being queried for. The UpdateResult type keeps a list of remaining + // providers, with providers being removed from the list before querying. + internal class UpdateResult + { + private static readonly ExportDescriptorPromise[] s_noPromises = new ExportDescriptorPromise[0]; + + private readonly Queue _remainingProviders; + private readonly IList _providedDescriptors = new List(); + private ExportDescriptorPromise[] _results; + + public UpdateResult(IEnumerable providers) + { + _remainingProviders = new Queue(providers); + } + + public bool TryDequeueNextProvider(out ExportDescriptorProvider provider) + { + if (_remainingProviders.Count == 0) + { + provider = null; + return false; + } + + provider = _remainingProviders.Dequeue(); + return true; + } + + public void AddPromise(ExportDescriptorPromise promise) + { + _results = null; + _providedDescriptors.Add(promise); + } + + public ExportDescriptorPromise[] GetResults() + { + if (_results == null) + { + Assumes.IsTrue(_remainingProviders.Count == 0, "Providers remain to be queried."); + + if (_providedDescriptors.Count == 0) + _results = s_noPromises; + + _results = _providedDescriptors.ToArray(); + } + + return _results; + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Constants.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Constants.cs new file mode 100644 index 000000000000..a9f040798d36 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Constants.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace System.Composition.Hosting.Providers +{ + /// + /// Metadata keys used to tie programming model entities into their back-end hosting implementations. + /// + internal static class Constants + { + /// + /// The sharing boundary implemented by an import. + /// + public const string SharingBoundaryImportMetadataConstraintName = "SharingBoundaryNames"; + + /// + /// Marks an import as "many". + /// + public const string ImportManyImportMetadataConstraintName = "IsImportMany"; + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/CurrentScope/CurrentScopeExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/CurrentScope/CurrentScopeExportDescriptorProvider.cs new file mode 100644 index 000000000000..8ab3f36c20b9 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/CurrentScope/CurrentScopeExportDescriptorProvider.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; + +namespace System.Composition.Hosting.Providers.CurrentScope +{ + internal class CurrentScopeExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly CompositionContract s_currentScopeContract = new CompositionContract(typeof(CompositionContext)); + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor) + { + if (!contract.Equals(s_currentScopeContract)) + return NoExportDescriptors; + + return new[] { new ExportDescriptorPromise( + contract, + typeof(CompositionContext).Name, + true, + NoDependencies, + _ => ExportDescriptor.Create((c, o) => c, NoMetadata)) }; + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryExportDescriptorProvider.cs new file mode 100644 index 000000000000..a04b11443d29 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryExportDescriptorProvider.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Linq; +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Collections.Generic; +using System.Composition.Hosting.Util; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Providers.ExportFactory +{ + internal class ExportFactoryExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly MethodInfo s_getExportFactoryDefinitionsMethod = typeof(ExportFactoryExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetExportFactoryDescriptors"); + + public override IEnumerable GetExportDescriptors(CompositionContract exportKey, DependencyAccessor definitionAccessor) + { + if (!exportKey.ContractType.IsConstructedGenericType || exportKey.ContractType.GetGenericTypeDefinition() != typeof(ExportFactory<>)) + return NoExportDescriptors; + + var gld = s_getExportFactoryDefinitionsMethod.MakeGenericMethod(exportKey.ContractType.GenericTypeArguments[0]); + var gldm = gld.CreateStaticDelegate>(); + return (ExportDescriptorPromise[])gldm(exportKey, definitionAccessor); + } + + private static ExportDescriptorPromise[] GetExportFactoryDescriptors(CompositionContract exportFactoryContract, DependencyAccessor definitionAccessor) + { + var productContract = exportFactoryContract.ChangeType(typeof(TProduct)); + var boundaries = new string[0]; + + IEnumerable specifiedBoundaries; + CompositionContract unwrapped; + if (exportFactoryContract.TryUnwrapMetadataConstraint(Constants.SharingBoundaryImportMetadataConstraintName, out specifiedBoundaries, out unwrapped)) + { + productContract = unwrapped.ChangeType(typeof(TProduct)); + boundaries = (specifiedBoundaries ?? new string[0]).ToArray(); + } + + return definitionAccessor.ResolveDependencies("product", productContract, false) + .Select(d => new ExportDescriptorPromise( + exportFactoryContract, + Formatters.Format(typeof(ExportFactory)), + false, + () => new[] { d }, + _ => + { + var dsc = d.Target.GetDescriptor(); + var da = dsc.Activator; + return ExportDescriptor.Create((c, o) => + { + return new ExportFactory(() => + { + var lifetimeContext = new LifetimeContext(c, boundaries); + return Tuple.Create((TProduct)CompositionOperation.Run(lifetimeContext, da), lifetimeContext.Dispose); + }); + }, + dsc.Metadata); + })) + .ToArray(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryWithMetadataExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryWithMetadataExportDescriptorProvider.cs new file mode 100644 index 000000000000..cb7a22495d3a --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ExportFactory/ExportFactoryWithMetadataExportDescriptorProvider.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Composition.Hosting.Util; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Linq; +using System.Threading; +using System.Collections.Generic; +using System.Composition.Hosting.Providers.Metadata; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Providers.ExportFactory +{ + internal class ExportFactoryWithMetadataExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly MethodInfo s_getLazyDefinitionsMethod = + typeof(ExportFactoryWithMetadataExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetExportFactoryDescriptors"); + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor) + { + if (!contract.ContractType.GetTypeInfo().IsGenericType || + contract.ContractType.GetGenericTypeDefinition() != typeof(ExportFactory<,>)) + return NoExportDescriptors; + + var ga = contract.ContractType.GenericTypeArguments; + var gld = s_getLazyDefinitionsMethod.MakeGenericMethod(ga[0], ga[1]); + var gldm = gld.CreateStaticDelegate>(); + return (ExportDescriptorPromise[])gldm(contract, definitionAccessor); + } + + private static ExportDescriptorPromise[] GetExportFactoryDescriptors(CompositionContract exportFactoryContract, DependencyAccessor definitionAccessor) + { + var productContract = exportFactoryContract.ChangeType(typeof(TProduct)); + var boundaries = new string[0]; + + IEnumerable specifiedBoundaries; + CompositionContract unwrapped; + if (exportFactoryContract.TryUnwrapMetadataConstraint(Constants.SharingBoundaryImportMetadataConstraintName, out specifiedBoundaries, out unwrapped)) + { + productContract = unwrapped.ChangeType(typeof(TProduct)); + boundaries = (specifiedBoundaries ?? new string[0]).ToArray(); + } + + var metadataProvider = MetadataViewProvider.GetMetadataViewProvider(); + + return definitionAccessor.ResolveDependencies("product", productContract, false) + .Select(d => new ExportDescriptorPromise( + exportFactoryContract, + typeof(ExportFactory).Name, + false, + () => new[] { d }, + _ => + { + var dsc = d.Target.GetDescriptor(); + return ExportDescriptor.Create((c, o) => + { + return new ExportFactory(() => + { + var lifetimeContext = new LifetimeContext(c, boundaries); + return Tuple.Create((TProduct)CompositionOperation.Run(lifetimeContext, dsc.Activator), lifetimeContext.Dispose); + }, + metadataProvider(dsc.Metadata)); + }, + dsc.Metadata); + })) + .ToArray(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ImportMany/ImportManyExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ImportMany/ImportManyExportDescriptorProvider.cs new file mode 100644 index 000000000000..437cfc75206a --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/ImportMany/ImportManyExportDescriptorProvider.cs @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Composition.Hosting.Util; +using System.Composition.Runtime; +using System.Collections.Generic; +using System.Linq; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Providers.ImportMany +{ + internal class ImportManyExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly MethodInfo s_getImportManyDefinitionMethod = typeof(ImportManyExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetImportManyDescriptor"); + private static readonly Type[] s_supportedContractTypes = new[] { typeof(IList<>), typeof(ICollection<>), typeof(IEnumerable<>) }; + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor) + { + if (!(contract.ContractType.IsArray || + contract.ContractType.IsConstructedGenericType && s_supportedContractTypes.Contains(contract.ContractType.GetGenericTypeDefinition()))) + return NoExportDescriptors; + + bool isImportMany; + CompositionContract unwrapped; + if (!contract.TryUnwrapMetadataConstraint(Constants.ImportManyImportMetadataConstraintName, out isImportMany, out unwrapped)) + return NoExportDescriptors; + + var elementType = contract.ContractType.IsArray ? + contract.ContractType.GetElementType() : + contract.ContractType.GenericTypeArguments[0]; + + var elementContract = unwrapped.ChangeType(elementType); + + var gimd = s_getImportManyDefinitionMethod.MakeGenericMethod(elementType); + var gimdm = gimd.CreateStaticDelegate>(); + return new[] { (ExportDescriptorPromise)gimdm(contract, elementContract, definitionAccessor) }; + } + + private static ExportDescriptorPromise GetImportManyDescriptor(CompositionContract importManyContract, CompositionContract elementContract, DependencyAccessor definitionAccessor) + { + return new ExportDescriptorPromise( + importManyContract, + typeof(TElement[]).Name, + false, + () => definitionAccessor.ResolveDependencies("item", elementContract, true), + d => + { + var dependentDescriptors = d + .Select(el => el.Target.GetDescriptor()) + .ToArray(); + + return ExportDescriptor.Create((c, o) => dependentDescriptors.Select(e => (TElement)e.Activator(c, o)).ToArray(), NoMetadata); + }); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyExportDescriptorProvider.cs new file mode 100644 index 000000000000..1da1645339ba --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyExportDescriptorProvider.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Linq; +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Collections.Generic; +using System.Composition.Hosting.Util; +using System.Composition.Hosting.Properties; + +namespace System.Composition.Hosting.Providers.Lazy +{ + internal class LazyExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly MethodInfo s_getLazyDefinitionsMethod = typeof(LazyExportDescriptorProvider) + .GetTypeInfo().GetDeclaredMethod("GetLazyDefinitions"); + + public override IEnumerable GetExportDescriptors(CompositionContract exportKey, DependencyAccessor definitionAccessor) + { + if (!exportKey.ContractType.IsConstructedGenericType || exportKey.ContractType.GetGenericTypeDefinition() != typeof(Lazy<>)) + return NoExportDescriptors; + + var gld = s_getLazyDefinitionsMethod.MakeGenericMethod(exportKey.ContractType.GenericTypeArguments[0]); + var gldm = gld.CreateStaticDelegate>(); + return (ExportDescriptorPromise[])gldm(exportKey, definitionAccessor); + } + + private static ExportDescriptorPromise[] GetLazyDefinitions(CompositionContract lazyContract, DependencyAccessor definitionAccessor) + { + return definitionAccessor.ResolveDependencies("value", lazyContract.ChangeType(typeof(TValue)), false) + .Select(d => new ExportDescriptorPromise( + lazyContract, + Formatters.Format(typeof(Lazy)), + false, + () => new[] { d }, + _ => + { + var dsc = d.Target.GetDescriptor(); + var da = dsc.Activator; + return ExportDescriptor.Create((c, o) => new Lazy(() => (TValue)CompositionOperation.Run(c, da)), dsc.Metadata); + })) + .ToArray(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyWithMetadataExportDescriptorProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyWithMetadataExportDescriptorProvider.cs new file mode 100644 index 000000000000..a93c7601beef --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Lazy/LazyWithMetadataExportDescriptorProvider.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Linq; +using System.Threading; +using System.Composition.Hosting.Util; +using System.Collections.Generic; +using System.Composition.Hosting.Providers.Metadata; + +namespace System.Composition.Hosting.Providers.Lazy +{ + internal class LazyWithMetadataExportDescriptorProvider : ExportDescriptorProvider + { + private static readonly MethodInfo s_getLazyDefinitionsMethod = typeof(LazyWithMetadataExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetLazyDefinitions"); + + public override IEnumerable GetExportDescriptors(CompositionContract exportKey, DependencyAccessor definitionAccessor) + { + if (!exportKey.ContractType.IsConstructedGenericType || exportKey.ContractType.GetGenericTypeDefinition() != typeof(Lazy<,>)) + return NoExportDescriptors; + + var ga = exportKey.ContractType.GenericTypeArguments; + var gld = s_getLazyDefinitionsMethod.MakeGenericMethod(ga[0], ga[1]); + var gldm = gld.CreateStaticDelegate>(); + return (ExportDescriptorPromise[])gldm(exportKey, definitionAccessor); + } + + private static ExportDescriptorPromise[] GetLazyDefinitions(CompositionContract lazyContract, DependencyAccessor definitionAccessor) + { + var metadataProvider = MetadataViewProvider.GetMetadataViewProvider(); + + return definitionAccessor.ResolveDependencies("value", lazyContract.ChangeType(typeof(TValue)), false) + .Select(d => new ExportDescriptorPromise( + lazyContract, + Formatters.Format(typeof(Lazy)), + false, + () => new[] { d }, + _ => + { + var dsc = d.Target.GetDescriptor(); + var da = dsc.Activator; + return ExportDescriptor.Create((c, o) => + { + return new Lazy(() => (TValue)CompositionOperation.Run(c, da), metadataProvider(dsc.Metadata)); + }, dsc.Metadata); + })) + .ToArray(); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Metadata/MetadataViewProvider.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Metadata/MetadataViewProvider.cs new file mode 100644 index 000000000000..55fdd77383d8 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Providers/Metadata/MetadataViewProvider.cs @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Composition.Hosting.Core; +using System.Composition.Hosting.Util; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Internal; + +namespace System.Composition.Hosting.Providers.Metadata +{ + internal static class MetadataViewProvider + { + private static readonly MethodInfo s_getMetadataValueMethod = typeof(MetadataViewProvider).GetTypeInfo().GetDeclaredMethod("GetMetadataValue"); + + // While not called through the composition pipeline, we use the dependency mechanism to surface errors + // with appropriate context information. + public static Func, TMetadata> GetMetadataViewProvider() + { + if (typeof(TMetadata) == typeof(IDictionary)) + return m => (TMetadata)m; + + if (!typeof(TMetadata).GetTypeInfo().IsClass) + throw new CompositionFailedException(string.Format(Properties.Resources.MetadataViewProvider_InvalidViewImplementation, typeof(TMetadata).Name)); + + var ti = typeof(TMetadata).GetTypeInfo(); + var dictionaryConstructor = ti.DeclaredConstructors.SingleOrDefault(ci => + { + var ps = ci.GetParameters(); + return ci.IsPublic && ps.Length == 1 && ps[0].ParameterType == typeof(IDictionary); + }); + + if (dictionaryConstructor != null) + { + var providerArg = Expression.Parameter(typeof(IDictionary), "metadata"); + return Expression.Lambda, TMetadata>>( + Expression.New(dictionaryConstructor, providerArg), + providerArg) + .Compile(); + } + + var parameterlessConstructor = ti.DeclaredConstructors.SingleOrDefault(ci => ci.IsPublic && ci.GetParameters().Length == 0); + if (parameterlessConstructor != null) + { + var providerArg = Expression.Parameter(typeof(IDictionary), "metadata"); + var resultVar = Expression.Variable(typeof(TMetadata), "result"); + + var blockExprs = new List(); + blockExprs.Add(Expression.Assign(resultVar, Expression.New(parameterlessConstructor))); + + foreach (var prop in typeof(TMetadata).GetTypeInfo().DeclaredProperties + .Where(prop => + prop.GetMethod != null && prop.GetMethod.IsPublic && !prop.GetMethod.IsStatic && + prop.SetMethod != null && prop.SetMethod.IsPublic && !prop.SetMethod.IsStatic)) + { + var dva = Expression.Constant(prop.GetCustomAttribute(false), typeof(DefaultValueAttribute)); + var name = Expression.Constant(prop.Name, typeof(string)); + var m = s_getMetadataValueMethod.MakeGenericMethod(prop.PropertyType); + var assign = Expression.Assign( + Expression.Property(resultVar, prop), + Expression.Call(null, m, providerArg, name, dva)); + blockExprs.Add(assign); + } + + blockExprs.Add(resultVar); + + return Expression.Lambda, TMetadata>>( + Expression.Block(new[] { resultVar }, blockExprs), providerArg) + .Compile(); + } + + throw new CompositionFailedException(string.Format(Properties.Resources.MetadataViewProvider_InvalidViewImplementation, typeof(TMetadata).Name)); + } + + private static TValue GetMetadataValue(IDictionary metadata, string name, DefaultValueAttribute defaultValue) + { + object result; + if (metadata.TryGetValue(name, out result)) + return (TValue)result; + + if (defaultValue != null) + return (TValue)defaultValue.Value; + + // This could be significantly improved by describing the target metadata property. + var message = string.Format(Properties.Resources.MetadataViewProvider_MissingMetadata, name); + throw ThrowHelper.CompositionException(message); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/Formatters.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/Formatters.cs new file mode 100644 index 000000000000..66e4c79733c2 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/Formatters.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +using Microsoft.Internal; + +namespace System.Composition.Hosting.Util +{ + internal static class Formatters + { + public static string ReadableList(IEnumerable items) + { + Assumes.NotNull(items); + + string reply = string.Join(Properties.Resources.Formatter_ListSeparatorWithSpace, items.OrderBy(t => t)); + return !string.IsNullOrEmpty(reply) ? reply : Properties.Resources.Formatter_None; + } + + public static string Format(Type type) + { + Assumes.NotNull(type); + + if (type.IsConstructedGenericType) + { + return FormatClosedGeneric(type); + } + return type.Name; + } + + private static string FormatClosedGeneric(Type closedGenericType) + { + Assumes.NotNull(closedGenericType); + Assumes.IsTrue(closedGenericType.IsConstructedGenericType); + + var name = closedGenericType.Name.Substring(0, closedGenericType.Name.IndexOf("`")); + var args = closedGenericType.GenericTypeArguments.Select(t => Format(t)); + return string.Format("{0}<{1}>", name, string.Join(", ", args)); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/MethodInfoExtensions.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/MethodInfoExtensions.cs new file mode 100644 index 000000000000..16b41731f92b --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/MethodInfoExtensions.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; + +namespace System.Composition.Hosting.Util +{ + internal static class MethodInfoExtensions + { + public static T CreateStaticDelegate(this MethodInfo methodInfo) + { + return (T)(object)methodInfo.CreateDelegate(typeof(T)); + } + } +} diff --git a/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/SmallSparseInitonlyArray.cs b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/SmallSparseInitonlyArray.cs new file mode 100644 index 000000000000..368905743a87 --- /dev/null +++ b/src/System.Composition.Hosting/src/System/Composition/Hosting/Util/SmallSparseInitonlyArray.cs @@ -0,0 +1,101 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Composition.Hosting; + +using Microsoft.Internal; + +namespace System.Composition.Hosting.Util +{ + // Extremely performance-sensitive. + // Always safe for reading, even under concurrent writes, + // only one writer at a time allowed. + internal class SmallSparseInitonlyArray + { + private class Element { public int Index; public object Value; } + + private const int ElementsCapacity = 128; + private const int ElementIndexMask = 127; + private const int LocalOffsetMax = 3; + + private Element[] _elements = null; + private SmallSparseInitonlyArray _overflow; + + public void Add(int index, object value) + { + if (_elements == null) + _elements = new Element[ElementsCapacity]; + + var newElement = new Element { Index = index, Value = value }; + + var elementIndex = index & ElementIndexMask; + var e = _elements[elementIndex]; + if (e == null) + { + _elements[elementIndex] = newElement; + return; + } + + // This overload of IsTrue doesn't call String.Format unless required. + // Do, not switch to other version as it affects performance. + Assumes.IsTrue(e.Index != index, "An item with the key '{0}' has already been added.", index); + + for (int offset = 1; offset <= LocalOffsetMax; ++offset) + { + var nextIndex = (index + offset) & ElementIndexMask; + e = _elements[nextIndex]; + if (e == null) + { + _elements[nextIndex] = newElement; + return; + } + + Assumes.IsTrue(e.Index != index, "An item with the key '{0}' has already been added.", index); + } + + if (_overflow == null) + _overflow = new SmallSparseInitonlyArray(); + + _overflow.Add(index, value); + } + + public bool TryGetValue(int index, out object value) + { + if (_elements == null) + { + value = null; + return false; + } + + var elementIndex = index & ElementIndexMask; + var e = _elements[elementIndex]; + if (e != null && e.Index == index) + { + value = e.Value; + return true; + } + + for (int offset = 1; offset <= LocalOffsetMax; ++offset) + { + e = _elements[(index + offset) & ElementIndexMask]; + if (e == null) + { + value = null; + return false; + } + + if (e.Index == index) + { + value = e.Value; + return true; + } + } + + if (_overflow != null) + return _overflow.TryGetValue(index, out value); + + value = null; + return false; + } + } +} diff --git a/src/System.Composition.Runtime/src/Properties/AssemblyInfo.cs b/src/System.Composition.Runtime/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..db6cbba2c52d --- /dev/null +++ b/src/System.Composition.Runtime/src/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +[assembly: ComVisible(false)] +[assembly: SecurityTransparent] diff --git a/src/System.Composition.Runtime/src/Properties/Resources.Designer.cs b/src/System.Composition.Runtime/src/Properties/Resources.Designer.cs new file mode 100644 index 000000000000..c312a2db4847 --- /dev/null +++ b/src/System.Composition.Runtime/src/Properties/Resources.Designer.cs @@ -0,0 +1,91 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17626 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace System.Composition.Properties { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Composition.Properties.Resources", typeof(Resources).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to No export was found for the contract '{0}'.. + /// + internal static string CompositionContext_NoExportFoundForContract { + get { + return ResourceManager.GetString("CompositionContext_NoExportFoundForContract", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Composition failed.. + /// + internal static string CompositionFailedDefaultExceptionMessage { + get { + return ResourceManager.GetString("CompositionFailedDefaultExceptionMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string Formatter_ListSeparatorWithSpace { + get { + return ResourceManager.GetString("Formatter_ListSeparatorWithSpace", resourceCulture); + } + } + } +} diff --git a/src/System.Composition.Runtime/src/Properties/Resources.resx b/src/System.Composition.Runtime/src/Properties/Resources.resx new file mode 100644 index 000000000000..84eec38aea27 --- /dev/null +++ b/src/System.Composition.Runtime/src/Properties/Resources.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + No export was found for the contract '{0}'. + + + Composition failed. + + + , + + \ No newline at end of file diff --git a/src/System.Composition.Runtime/src/System.Composition.Runtime.csproj b/src/System.Composition.Runtime/src/System.Composition.Runtime.csproj new file mode 100644 index 000000000000..b2bcfe205e8c --- /dev/null +++ b/src/System.Composition.Runtime/src/System.Composition.Runtime.csproj @@ -0,0 +1,52 @@ + + + + + + {2711DFD2-8541-4628-BC53-EB784A14CDCF} + Library + Properties + System.Composition + System.Composition.Runtime + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + true + 11.0 + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + True + True + Resources.resx + + + + + + + + + + + + diff --git a/src/System.Composition.Runtime/src/System/Composition/CompositionContext.cs b/src/System.Composition.Runtime/src/System/Composition/CompositionContext.cs new file mode 100644 index 000000000000..9df109dbf4ca --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/CompositionContext.cs @@ -0,0 +1,212 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Composition.Runtime; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Hosting; + +namespace System.Composition +{ + /// + /// Provides retrieval of exports from the composition. + /// + public abstract class CompositionContext + { + private const string ImportManyImportMetadataConstraintName = "IsImportMany"; + + /// + /// Retrieve the single instance from the + /// . + /// + /// The contract to retrieve. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public abstract bool TryGetExport(CompositionContract contract, out object export); + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// An instance of the export. + /// + public TExport GetExport() + { + return GetExport((string)null); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// Optionally, a discriminator that constrains the selection of the export. + /// An instance of the export. + /// + public TExport GetExport(string contractName) + { + return (TExport)GetExport(typeof(TExport), contractName); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// Optionally, a discriminator that constrains the selection of the export. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public bool TryGetExport(Type exportType, string contractName, out object export) + { + return TryGetExport(new CompositionContract(exportType, contractName), out export); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public bool TryGetExport(Type exportType, out object export) + { + return TryGetExport(exportType, null, out export); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public bool TryGetExport(out TExport export) + { + return TryGetExport(null, out export); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// Optionally, a discriminator that constrains the selection of the export. + /// An instance of the export. + /// The export if available, otherwise, null. + /// + public bool TryGetExport(string contractName, out TExport export) + { + object untypedExport; + if (!TryGetExport(typeof(TExport), contractName, out untypedExport)) + { + export = default(TExport); + return false; + } + + export = (TExport)untypedExport; + return true; + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// An instance of the export. + /// + public object GetExport(Type exportType) + { + return GetExport(exportType, (string)null); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// Optionally, a discriminator that constrains the selection of the export. + /// An instance of the export. + /// + public object GetExport(Type exportType, string contractName) + { + return GetExport(new CompositionContract(exportType, contractName)); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The contract of the export to retrieve. + /// An instance of the export. + /// + public object GetExport(CompositionContract contract) + { + object export; + if (!TryGetExport(contract, out export)) + throw new CompositionFailedException( + string.Format(Properties.Resources.CompositionContext_NoExportFoundForContract, contract)); + + return export; + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// + public IEnumerable GetExports(Type exportType) + { + return GetExports(exportType, (string)null); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The type of the export to retrieve. + /// The discriminator to apply when selecting the export. + /// An instance of the export. + /// + public IEnumerable GetExports(Type exportType, string contractName) + { + var manyContract = new CompositionContract( + exportType.MakeArrayType(), + contractName, + new Dictionary { { ImportManyImportMetadataConstraintName, true } }); + + return (IEnumerable)GetExport(manyContract); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The export type to retrieve. + /// An instance of the export. + /// + public IEnumerable GetExports() + { + return GetExports((string)null); + } + + /// + /// Retrieve the single instance from the + /// . + /// + /// The export type to retrieve. + /// An instance of the export. + /// The discriminator to apply when selecting the export. + /// + public IEnumerable GetExports(string contractName) + { + return (IEnumerable)GetExports(typeof(TExport), contractName); + } + } +} diff --git a/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfT.cs b/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfT.cs new file mode 100644 index 000000000000..0b8e66c64f11 --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfT.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// Can be imported by parts that wish to dynamically create instances of other parts. + /// + /// The contract type of the created parts. + public class ExportFactory + { + private readonly Func> _exportLifetimeContextCreator; + + /// + /// Construct an ExportFactory. + /// + /// Action invoked upon calls to the Create() method. + public ExportFactory(Func> exportCreator) + { + if (exportCreator == null) + { + throw new ArgumentNullException("exportCreator"); + } + + _exportLifetimeContextCreator = exportCreator; + } + + /// + /// Create an instance of the exported part. + /// + /// A handle allowing the created part to be accessed then released. + public Export CreateExport() + { + Tuple untypedLifetimeContext = _exportLifetimeContextCreator.Invoke(); + return new Export(untypedLifetimeContext.Item1, untypedLifetimeContext.Item2); + } + } +} diff --git a/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfTTMetadata.cs b/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfTTMetadata.cs new file mode 100644 index 000000000000..ca08ebc6d04a --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/ExportFactoryOfTTMetadata.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition +{ + /// + /// An ExportFactory that provides metadata describing the created exports. + /// + /// The contract type being created. + /// The metadata required from the export. + public class ExportFactory : ExportFactory + { + private readonly TMetadata _metadata; + + /// + /// Construct an ExportFactory. + /// + /// Action invoked upon calls to the Create() method. + /// The metadata associated with the export. + public ExportFactory(Func> exportCreator, TMetadata metadata) + : base(exportCreator) + { + _metadata = metadata; + } + + /// + /// The metadata associated with the export. + /// + public TMetadata Metadata + { + get { return _metadata; } + } + } +} + diff --git a/src/System.Composition.Runtime/src/System/Composition/ExportOfT.cs b/src/System.Composition.Runtime/src/System/Composition/ExportOfT.cs new file mode 100644 index 000000000000..78248cc08bfb --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/ExportOfT.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Linq; + +namespace System.Composition +{ + /// + /// A handle allowing the graph of parts associated with an exported instance + /// to be released. + /// + /// + public sealed class Export : IDisposable + { + private readonly T _value; + private readonly Action _disposeAction; + + /// + /// Construct an ExportLifetimContext. + /// + /// The value of the export. + /// An action that releases resources associated with the export. + public Export(T value, Action disposeAction) + { + _value = value; + _disposeAction = disposeAction; + } + + /// + /// The exported value. + /// + public T Value + { + get + { + return _value; + } + } + + /// + /// Release the parts associated with the exported value. + /// + public void Dispose() + { + if (_disposeAction != null) + { + _disposeAction.Invoke(); + } + } + } +} + diff --git a/src/System.Composition.Runtime/src/System/Composition/Hosting/CompositionFailedException.cs b/src/System.Composition.Runtime/src/System/Composition/Hosting/CompositionFailedException.cs new file mode 100644 index 000000000000..f03dff2da70c --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/Hosting/CompositionFailedException.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; + +namespace System.Composition.Hosting +{ + /// + /// The exception type thrown when composition problems occur. + /// Exception should be assumed to be fatal for the entire composition/container unless + /// otherwise documented - no production code should throw this exception. + /// + public class CompositionFailedException : Exception + { + /// + /// Construct a with the default message. + /// + public CompositionFailedException() + : base(Properties.Resources.CompositionFailedDefaultExceptionMessage) + { } + + /// + /// Construct a . + /// + /// The exception message. + public CompositionFailedException(string message) + : base(message) + { } + + /// + /// Construct a . + /// + /// The exception message. + /// The inner exception. + public CompositionFailedException(string message, Exception innerException) + : base(message, innerException) + { } + } +} diff --git a/src/System.Composition.Runtime/src/System/Composition/Hosting/Core/CompositionContract.cs b/src/System.Composition.Runtime/src/System/Composition/Hosting/Core/CompositionContract.cs new file mode 100644 index 000000000000..f6ed9669ae77 --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/Hosting/Core/CompositionContract.cs @@ -0,0 +1,248 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Composition.Runtime.Util; +using System.Linq; + +namespace System.Composition.Hosting.Core +{ + /// + /// The link between exports and imports. + /// + public sealed class CompositionContract + { + private readonly Type _contractType; + private readonly string _contractName; + private readonly IDictionary _metadataConstraints; + + /// + /// Construct a . + /// + /// The type shared between the exporter and importer. + public CompositionContract(Type contractType) + : this(contractType, null) + { + } + + /// + /// Construct a . + /// + /// The type shared between the exporter and importer. + /// Optionally, a name that discriminates this contract from others with the same type. + public CompositionContract(Type contractType, string contractName) + : this(contractType, contractName, null) + { + } + + /// + /// Construct a . + /// + /// The type shared between the exporter and importer. + /// Optionally, a name that discriminates this contract from others with the same type. + /// Optionally, a non-empty collection of named constraints that apply to the contract. + public CompositionContract(Type contractType, string contractName, IDictionary metadataConstraints) + { + if (contractType == null) throw new ArgumentNullException("contractType"); + if (metadataConstraints != null && metadataConstraints.Count == 0) throw new ArgumentOutOfRangeException("metadataConstraints"); + + _contractType = contractType; + _contractName = contractName; + _metadataConstraints = metadataConstraints; + } + + /// + /// The type shared between the exporter and importer. + /// + public Type ContractType { get { return _contractType; } } + + /// + /// A name that discriminates this contract from others with the same type. + /// + public string ContractName { get { return _contractName; } } + + /// + /// Constraints applied to the contract. Instead of using this collection + /// directly it is advisable to use the method. + /// + public IEnumerable> MetadataConstraints { get { return _metadataConstraints; } } + + /// + /// Determines equality between two contracts. + /// + /// The contract to test. + /// True if the the contracts are equivalent; otherwise, false. + public override bool Equals(object obj) + { + var contract = obj as CompositionContract; + return contract != null && + contract._contractType.Equals(_contractType) && + (_contractName == null ? contract._contractName == null : _contractName.Equals(contract._contractName)) && + ConstraintEqual(_metadataConstraints, contract._metadataConstraints); + } + + /// + /// Gets a hash code for the contract. + /// + /// The hash code. + public override int GetHashCode() + { + var hc = _contractType.GetHashCode(); + if (_contractName != null) + hc = hc ^ _contractName.GetHashCode(); + if (_metadataConstraints != null) + hc = hc ^ ConstraintHashCode(_metadataConstraints); + return hc; + } + + /// + /// Creates a string representaiton of the contract. + /// + /// A string representaiton of the contract. + public override string ToString() + { + var result = Formatters.Format(_contractType); + + if (_contractName != null) + result += " " + Formatters.Format(_contractName); + + if (_metadataConstraints != null) + result += string.Format(" {{ {0} }}", + string.Join(Properties.Resources.Formatter_ListSeparatorWithSpace, + _metadataConstraints.Select(kv => string.Format("{0} = {1}", kv.Key, Formatters.Format(kv.Value))))); + + return result; + } + + /// + /// Transform the contract into a matching contract with a + /// new contract type (with the same contract name and constraints). + /// + /// The contract type for the new contract. + /// A matching contract with a + /// new contract type. + public CompositionContract ChangeType(Type newContractType) + { + if (newContractType == null) throw new ArgumentNullException("newContractType"); + return new CompositionContract(newContractType, _contractName, _metadataConstraints); + } + + /// + /// Check the contract for a constraint with a particular name and value, and, if it exists, + /// retrieve both the value and the remainder of the contract with the constraint + /// removed. + /// + /// The type of the constraint value. + /// The name of the constraint. + /// The value if it is present and of the correct type, otherwise null. + /// The contract with the constraint removed if present, otherwise null. + /// True if the constraint is present and of the correct type, otherwise false. + public bool TryUnwrapMetadataConstraint(string constraintName, out T constraintValue, out CompositionContract remainingContract) + { + if (constraintName == null) throw new ArgumentNullException("constraintName"); + + constraintValue = default(T); + remainingContract = null; + + if (_metadataConstraints == null) + return false; + + object value; + if (!_metadataConstraints.TryGetValue(constraintName, out value)) + return false; + + if (!(value is T)) + return false; + + constraintValue = (T)value; + if (_metadataConstraints.Count == 1) + { + remainingContract = new CompositionContract(_contractType, _contractName); + } + else + { + var remainingConstraints = new Dictionary(_metadataConstraints); + remainingConstraints.Remove(constraintName); + remainingContract = new CompositionContract(_contractType, _contractName, remainingConstraints); + } + + return true; + } + + internal static bool ConstraintEqual(IDictionary first, IDictionary second) + { + if (first == second) + return true; + + if (first == null || second == null) + return false; + + if (first.Count != second.Count) + return false; + + foreach (var firstItem in first) + { + object secondValue; + if (!second.TryGetValue(firstItem.Key, out secondValue)) + return false; + + if (firstItem.Value == null && secondValue != null || + secondValue == null && firstItem.Value != null) + { + return false; + } + else + { + var firstEnumerable = firstItem.Value as IEnumerable; + if (firstEnumerable != null && !(firstEnumerable is string)) + { + var secondEnumerable = secondValue as IEnumerable; + if (secondEnumerable == null || !Enumerable.SequenceEqual(firstEnumerable.Cast(), secondEnumerable.Cast())) + return false; + } + else if (!firstItem.Value.Equals(secondValue)) + { + return false; + } + } + } + + return true; + } + + private static int ConstraintHashCode(IDictionary metadata) + { + var result = -1; + foreach (var kv in metadata) + { + result ^= kv.Key.GetHashCode(); + if (kv.Value != null) + { + var sval = kv.Value as string; + if (sval != null) + { + result ^= sval.GetHashCode(); + } + else + { + var enumerableValue = kv.Value as IEnumerable; + if (enumerableValue != null) + { + foreach (var ev in enumerableValue) + if (ev != null) + result ^= ev.GetHashCode(); + } + else + { + result ^= kv.Value.GetHashCode(); + } + } + } + } + + return result; + } + } +} diff --git a/src/System.Composition.Runtime/src/System/Composition/Runtime/Util/Formatters.cs b/src/System.Composition.Runtime/src/System/Composition/Runtime/Util/Formatters.cs new file mode 100644 index 000000000000..55a7665d9588 --- /dev/null +++ b/src/System.Composition.Runtime/src/System/Composition/Runtime/Util/Formatters.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace System.Composition.Runtime.Util +{ + internal static class Formatters + { + public static string Format(object value) + { + if (value == null) + throw new ArgumentNullException("value"); + + if (value is string) + return "\"" + value + "\""; + + return value.ToString(); + } + + public static string Format(Type type) + { + if (type == null) throw new ArgumentNullException("type"); + + if (type.IsConstructedGenericType) + return FormatClosedGeneric(type); + + return type.Name; + } + + private static string FormatClosedGeneric(Type closedGenericType) + { + if (closedGenericType == null) throw new ArgumentNullException("closedGenericType"); + if (!closedGenericType.IsConstructedGenericType) throw new ArgumentException(); + var name = closedGenericType.Name.Substring(0, closedGenericType.Name.IndexOf("`")); + var args = closedGenericType.GenericTypeArguments.Select(t => Format(t)); + return string.Format("{0}<{1}>", name, string.Join(Properties.Resources.Formatter_ListSeparatorWithSpace, args)); + } + } +} diff --git a/src/System.Composition.TypedParts/src/Properties/AssemblyInfo.cs b/src/System.Composition.TypedParts/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..db6cbba2c52d --- /dev/null +++ b/src/System.Composition.TypedParts/src/Properties/AssemblyInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +[assembly: ComVisible(false)] +[assembly: SecurityTransparent] diff --git a/src/System.Composition.TypedParts/src/Properties/Resources.Designer.cs b/src/System.Composition.TypedParts/src/Properties/Resources.Designer.cs new file mode 100644 index 000000000000..4c74f5202b39 --- /dev/null +++ b/src/System.Composition.TypedParts/src/Properties/Resources.Designer.cs @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17626 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace System.Composition.Properties { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Composition.Properties.Resources", typeof(Resources).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Missing dependency '{0}' on '{1}'.. + /// + internal static string CompositionContextExtensions_MissingDependency { + get { + return ResourceManager.GetString("CompositionContextExtensions_MissingDependency", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The default conventions for the container configuration have already been set.. + /// + internal static string ContainerConfiguration_DefaultConventionSet { + get { + return ResourceManager.GetString("ContainerConfiguration_DefaultConventionSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple imports have been configured for '{0}'. At most one import can be applied to a single site.. + /// + internal static string ContractHelpers_TooManyImports { + get { + return ResourceManager.GetString("ContractHelpers_TooManyImports", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple importing constructors were found on type '{0}'.. + /// + internal static string DiscoveredPart_MultipleImportingConstructorsFound { + get { + return ResourceManager.GetString("DiscoveredPart_MultipleImportingConstructorsFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No importing constructor was found on type '{0}'.. + /// + internal static string DiscoveredPart_NoImportingConstructorsFound { + get { + return ResourceManager.GetString("DiscoveredPart_NoImportingConstructorsFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The method {0}.{1} has the OnImportsSatisfied attribute applied, but is not a public or internal parameterless instance method returning void.. + /// + internal static string OnImportsSatisfiedFeature_AttributeError { + get { + return ResourceManager.GetString("OnImportsSatisfiedFeature_AttributeError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exported contract '{0}' of open generic part '{1}' does not match the generic arguments of the class.. + /// + internal static string TypeInspector_ArgumentMissmatch { + get { + return ResourceManager.GetString("TypeInspector_ArgumentMissmatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exported contract type '{0}' is not assignable from part '{1}'.. + /// + internal static string TypeInspector_ContractNotAssignable { + get { + return ResourceManager.GetString("TypeInspector_ContractNotAssignable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exported contract type '{0}' is not assignable from property '{1}' of part '{2}'.. + /// + internal static string TypeInspector_ExportedContractTypeNotAssignable { + get { + return ResourceManager.GetString("TypeInspector_ExportedContractTypeNotAssignable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The open generic export '{0}' on part '{1}' is not compatible with the contract '{2}'.. + /// + internal static string TypeInspector_ExportNotCompatible { + get { + return ResourceManager.GetString("TypeInspector_ExportNotCompatible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open generic part '{0}' cannot export non-generic contract '{1}'.. + /// + internal static string TypeInspector_NoExportNonGenericContract { + get { + return ResourceManager.GetString("TypeInspector_NoExportNonGenericContract", resourceCulture); + } + } + } +} diff --git a/src/System.Composition.TypedParts/src/Properties/Resources.resx b/src/System.Composition.TypedParts/src/Properties/Resources.resx new file mode 100644 index 000000000000..fc7386ee5924 --- /dev/null +++ b/src/System.Composition.TypedParts/src/Properties/Resources.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Missing dependency '{0}' on '{1}'. + + + The default conventions for the container configuration have already been set. + + + Multiple imports have been configured for '{0}'. At most one import can be applied to a single site. + + + Multiple importing constructors were found on type '{0}'. + + + No importing constructor was found on type '{0}'. + + + The method {0}.{1} has the OnImportsSatisfied attribute applied, but is not a public or internal parameterless instance method returning void. + + + Exported contract '{0}' of open generic part '{1}' does not match the generic arguments of the class. + + + Exported contract type '{0}' is not assignable from part '{1}'. + + + Exported contract type '{0}' is not assignable from property '{1}' of part '{2}'. + + + The open generic export '{0}' on part '{1}' is not compatible with the contract '{2}'. + + + Open generic part '{0}' cannot export non-generic contract '{1}'. + + \ No newline at end of file diff --git a/src/System.Composition.TypedParts/src/System.Composition.TypedParts.csproj b/src/System.Composition.TypedParts/src/System.Composition.TypedParts.csproj new file mode 100644 index 000000000000..e18506b97671 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System.Composition.TypedParts.csproj @@ -0,0 +1,83 @@ + + + + + + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E} + Library + Properties + System.Composition + System.Composition.TypedParts + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + true + 11.0 + + + + + + + true + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + {2b8fecc6-34a1-48fe-ba75-99572d2d6db2} + System.Composition.Hosting + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + + + + True + True + Resources.resx + + + + + + + + + + + + + + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + diff --git a/src/System.Composition.TypedParts/src/System/Composition/CompositionContextExtensions.cs b/src/System.Composition.TypedParts/src/System/Composition/CompositionContextExtensions.cs new file mode 100644 index 000000000000..3f6eb62a8e78 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/CompositionContextExtensions.cs @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Composition.Convention; +using System.Composition.Hosting; +using System.Composition.Runtime; +using System.Composition.TypedParts; +using System.Composition.TypedParts.ActivationFeatures; +using System.Composition.TypedParts.Util; +using System.Linq; +using System.Reflection; + +namespace System.Composition +{ + /// + /// Adds methods to that are specific to the + /// typed part model. + /// + public static class CompositionContextExtensions + { + private static readonly DirectAttributeContext s_directAttributeContext = new DirectAttributeContext(); + + /// + /// Set public properties decorated with the . + /// + /// Uses reflection, is slow - caching would help here. + /// An object with decorated with import attributes. + /// Export provider that will supply imported values. + public static void SatisfyImports(this CompositionContext compositionContext, object objectWithLooseImports) + { + SatisfyImportsInternal(compositionContext, objectWithLooseImports, s_directAttributeContext); + } + + /// + /// Set public properties decorated with the . + /// + /// Uses reflection, is slow - caching would help here. + /// Conventions to apply when satisfying loose imports. + /// An object with decorated with import attributes. + /// Export provider that will supply imported values. + public static void SatisfyImports(this CompositionContext compositionContext, object objectWithLooseImports, AttributedModelProvider conventions) + { + SatisfyImportsInternal(compositionContext, objectWithLooseImports, conventions); + } + + private static void SatisfyImportsInternal(this CompositionContext exportProvider, object objectWithLooseImports, AttributedModelProvider conventions) + { + if (exportProvider == null) throw new ArgumentNullException("exportProvider"); + if (objectWithLooseImports == null) throw new ArgumentNullException("objectWithLooseImports"); + if (conventions == null) throw new ArgumentNullException("conventions"); + + var objType = objectWithLooseImports.GetType(); + + foreach (var pi in objType.GetRuntimeProperties()) + { + ImportInfo importInfo; + var site = new PropertyImportSite(pi); + if (ContractHelpers.TryGetExplicitImportInfo(pi.PropertyType, conventions.GetDeclaredAttributes(pi.DeclaringType, pi), site, out importInfo)) + { + object value; + if (exportProvider.TryGetExport(importInfo.Contract, out value)) + { + pi.SetValue(objectWithLooseImports, value); + } + else if (!importInfo.AllowDefault) + { + throw new CompositionFailedException(string.Format( + Properties.Resources.CompositionContextExtensions_MissingDependency, pi.Name, objectWithLooseImports)); + } + } + } + + var importsSatisfiedMethods = objectWithLooseImports.GetType().GetRuntimeMethods().Where(m => + m.CustomAttributes.Any(ca => ca.AttributeType == typeof(OnImportsSatisfiedAttribute))); + + foreach (var ois in importsSatisfiedMethods) + ois.Invoke(objectWithLooseImports, null); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/Convention/AttributedModelProviderExtensions.cs b/src/System.Composition.TypedParts/src/System/Composition/Convention/AttributedModelProviderExtensions.cs new file mode 100644 index 000000000000..57be0d8de28a --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/Convention/AttributedModelProviderExtensions.cs @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Convention; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace System.Composition.Convention +{ + /// + /// Helper extension methods for retrieving attributes from objects implementing IAttributedModelConvention + /// + internal static class AttributedModelProviderExtensions + { + public static TAttribute GetDeclaredAttribute(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, member).OfType().SingleOrDefault(); + } + + public static Attribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) + { + return convention.GetCustomAttributes(reflectedType, member).ToArray(); + } + + public static TAttribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, MemberInfo member) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, member).OfType().ToArray(); + } + + public static TAttribute GetDeclaredAttribute(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().SingleOrDefault(); + } + + public static Attribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().ToArray(); + } + + public static TAttribute[] GetDeclaredAttributes(this AttributedModelProvider convention, Type reflectedType, ParameterInfo parameter) where TAttribute : Attribute + { + return convention.GetCustomAttributes(reflectedType, parameter).OfType().ToArray(); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/Debugging/ContainerConfigurationDebuggerProxy.cs b/src/System.Composition.TypedParts/src/System/Composition/Debugging/ContainerConfigurationDebuggerProxy.cs new file mode 100644 index 000000000000..bc67aa4f2499 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/Debugging/ContainerConfigurationDebuggerProxy.cs @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.TypedParts; +using System.Composition.TypedParts.Discovery; +using System.Composition.TypedParts.Util; +using System.Diagnostics; +using System.Reflection; + +namespace System.Composition.Debugging +{ + internal class ContainerConfigurationDebuggerProxy + { + private readonly ContainerConfiguration _configuration; + private DiscoveredPart[] _discoveredParts; + private Type[] _ignoredTypes; + + public ContainerConfigurationDebuggerProxy(ContainerConfiguration configuration) + { + _configuration = configuration; + } + + [DebuggerDisplay("Added Providers")] + public ExportDescriptorProvider[] AddedExportDescriptorProviders + { + get { return _configuration.DebugGetAddedExportDescriptorProviders(); } + } + + [DebuggerDisplay("Discovered Parts")] + public DiscoveredPart[] DiscoveredParts + { + get + { + InitDiscovery(); + return _discoveredParts; + } + } + + [DebuggerDisplay("Ignored Types")] + public Type[] IgnoredTypes + { + get + { + InitDiscovery(); + return _ignoredTypes; + } + } + + private void InitDiscovery() + { + if (_discoveredParts != null) + return; + + var types = _configuration.DebugGetRegisteredTypes(); + var defaultAttributeContext = _configuration.DebugGetDefaultAttributeContext() ?? new DirectAttributeContext(); + var discovered = new List(); + var ignored = new List(); + + foreach (var typeSet in types) + { + var ac = typeSet.Item2 ?? defaultAttributeContext; + var activationFeatures = TypedPartExportDescriptorProvider.DebugGetActivationFeatures(ac); + var inspector = new TypeInspector(ac, activationFeatures); + + foreach (var type in typeSet.Item1) + { + DiscoveredPart part; + if (inspector.InspectTypeForPart(type.GetTypeInfo(), out part)) + discovered.Add(part); + else + ignored.Add(type); + } + } + + _discoveredParts = discovered.ToArray(); + _ignoredTypes = ignored.ToArray(); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/Debugging/DiscoveredPartDebuggerProxy.cs b/src/System.Composition.TypedParts/src/System/Composition/Debugging/DiscoveredPartDebuggerProxy.cs new file mode 100644 index 000000000000..86faa65ac77e --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/Debugging/DiscoveredPartDebuggerProxy.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.TypedParts.Discovery; +using System.Linq; +using System.Reflection; + +namespace System.Composition.Debugging +{ + internal class DiscoveredPartDebuggerProxy + { + private readonly DiscoveredPart _discoveredPart; + + public DiscoveredPartDebuggerProxy(DiscoveredPart discoveredPart) + { + _discoveredPart = discoveredPart; + } + + public Type PartType + { + get { return _discoveredPart.PartType.AsType(); } + } + + public DiscoveredExport[] Exports + { + get { return _discoveredPart.DiscoveredExports.ToArray(); } + } + + public IDictionary PartMetadata + { + get { return _discoveredPart.GetPartMetadata(PartType.GetTypeInfo()); } + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/Hosting/ContainerConfiguration.cs b/src/System.Composition.TypedParts/src/System/Composition/Hosting/ContainerConfiguration.cs new file mode 100644 index 000000000000..27a026a68b3e --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/Hosting/ContainerConfiguration.cs @@ -0,0 +1,220 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Convention; +using System.Composition.Debugging; +using System.Composition.Hosting.Core; +using System.Composition.TypedParts; +using System.Composition.TypedParts.Util; +using System.Diagnostics; +using System.Linq; +using System.Reflection; + +namespace System.Composition.Hosting +{ + /// + /// Configures and constructs a lightweight container. + /// + [DebuggerTypeProxy(typeof(ContainerConfigurationDebuggerProxy))] + public class ContainerConfiguration + { + private AttributedModelProvider _defaultAttributeContext; + private readonly IList _addedSources = new List(); + private readonly IList, AttributedModelProvider>> _types = new List, AttributedModelProvider>>(); + + /// + /// Create the container. The value returned from this method provides + /// the exports in the container, as well as a means to dispose the container. + /// + /// The container. + public CompositionHost CreateContainer() + { + var providers = _addedSources.ToList(); + + foreach (var typeSet in _types) + { + var ac = typeSet.Item2 ?? _defaultAttributeContext ?? new DirectAttributeContext(); + + providers.Add(new TypedPartExportDescriptorProvider(typeSet.Item1, ac)); + } + + return CompositionHost.CreateCompositionHost(providers.ToArray()); + } + + /// + /// Add an export descriptor provider to the container. + /// + /// An export descriptor provider. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithProvider(ExportDescriptorProvider exportDescriptorProvider) + { + if (exportDescriptorProvider == null) throw new ArgumentNullException("ExportDescriptorProvider"); + _addedSources.Add(exportDescriptorProvider); + return this; + } + + /// + /// Add conventions defined using a to the container. + /// These will be used as the default conventions; types and assemblies added with a + /// specific convention will use their own. + /// + /// + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithDefaultConventions(AttributedModelProvider conventions) + { + if (conventions == null) throw new ArgumentNullException("conventions"); + + if (_defaultAttributeContext != null) + throw new InvalidOperationException(System.Composition.Properties.Resources.ContainerConfiguration_DefaultConventionSet); + + _defaultAttributeContext = conventions; + return this; + } + + /// + /// Add a part type to the container. If the part type does not have any exports it + /// will be ignored. + /// + /// The part type. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithPart(Type partType) + { + return WithPart(partType, null); + } + + /// + /// Add a part type to the container. If the part type does not have any exports it + /// will be ignored. + /// + /// The part type. + /// Conventions represented by a , or null. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithPart(Type partType, AttributedModelProvider conventions) + { + if (partType == null) throw new ArgumentNullException("partType"); + return WithParts(new[] { partType }, conventions); + } + + /// + /// Add a part type to the container. If the part type does not have any exports it + /// will be ignored. + /// + /// The part type. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithPart() + { + return WithPart(null); + } + + /// + /// Add a part type to the container. If the part type does not have any exports it + /// will be ignored. + /// + /// The part type. + /// Conventions represented by a , or null. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithPart(AttributedModelProvider conventions) + { + return WithPart(typeof(TPart), conventions); + } + + /// + /// Add part types to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// The part types. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithParts(params Type[] partTypes) + { + return WithParts((IEnumerable)partTypes); + } + + /// + /// Add part types to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// The part types. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithParts(IEnumerable partTypes) + { + return WithParts(partTypes, null); + } + + /// + /// Add part types to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// The part types. + /// Conventions represented by a , or null. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithParts(IEnumerable partTypes, AttributedModelProvider conventions) + { + if (partTypes == null) throw new ArgumentNullException("partTypes"); + _types.Add(Tuple.Create(partTypes, conventions)); + return this; + } + + /// + /// Add part types from an assembly to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// The assembly from which to add part types. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithAssembly(Assembly assembly) + { + return WithAssembly(assembly, null); + } + + /// + /// Add part types from an assembly to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// The assembly from which to add part types. + /// Conventions represented by a , or null. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithAssembly(Assembly assembly, AttributedModelProvider conventions) + { + return WithAssemblies(new[] { assembly }, conventions); + } + + /// + /// Add part types from a list of assemblies to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// Assemblies containing part types. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithAssemblies(IEnumerable assemblies) + { + return WithAssemblies(assemblies, null); + } + + /// + /// Add part types from a list of assemblies to the container. If a part type does not have any exports it + /// will be ignored. + /// + /// Assemblies containing part types. + /// Conventions represented by a , or null. + /// A configuration object allowing configuration to continue. + public ContainerConfiguration WithAssemblies(IEnumerable assemblies, AttributedModelProvider conventions) + { + if (assemblies == null) throw new ArgumentNullException("assemblies"); + return WithParts(assemblies.SelectMany(a => a.DefinedTypes.Select(dt => dt.AsType())), conventions); + } + + internal ExportDescriptorProvider[] DebugGetAddedExportDescriptorProviders() + { + return _addedSources.ToArray(); + } + + internal Tuple, AttributedModelProvider>[] DebugGetRegisteredTypes() + { + return _types.ToArray(); + } + + internal AttributedModelProvider DebugGetDefaultAttributeContext() + { + return _defaultAttributeContext; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/ActivationFeature.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/ActivationFeature.cs new file mode 100644 index 000000000000..e8a59c435a2b --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/ActivationFeature.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Reflection; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Allows modification of the activators generated for typed parts. + /// + internal abstract class ActivationFeature + { + /// + /// A constant shared for subclass use. + /// + protected static readonly CompositionDependency[] NoDependencies = new CompositionDependency[0]; + + /// + /// Participate in the activator creation process. + /// + /// The part type being activated. + /// The activator body so far. + /// Metadata associated with the part being activated. + /// Dependencies returned by a previous call to . + /// A new activator body, or the one already provided. + public abstract CompositeActivator RewriteActivator( + TypeInfo partType, + CompositeActivator activator, + IDictionary partMetadata, + IEnumerable dependencies); + + /// + /// Describe the dependencies required by this activation feature. + /// + /// The part type being activated. + /// The definition accessor. + /// Dependencies. + public virtual IEnumerable GetDependencies(TypeInfo partType, DependencyAccessor definitionAccessor) + { + return NoDependencies; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/DisposalFeature.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/DisposalFeature.cs new file mode 100644 index 000000000000..ca8e5d7fc73c --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/DisposalFeature.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Reflection; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Modifies the activator so that disposable instances are bound to the appropriate scope. + /// + internal class DisposalFeature : ActivationFeature + { + public override CompositeActivator RewriteActivator( + TypeInfo partType, + CompositeActivator activator, + IDictionary partMetadata, + IEnumerable dependencies) + { + if (!typeof(IDisposable).GetTypeInfo().IsAssignableFrom(partType)) + return activator; + + return (c, o) => + { + var inst = (IDisposable)activator(c, o); + c.AddBoundInstance(inst); + return inst; + }; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/LifetimeFeature.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/LifetimeFeature.cs new file mode 100644 index 000000000000..e053c5ab53a8 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/LifetimeFeature.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Reflection; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Modifies the activators of parts so that they a) get associated with the correct + /// scope, and b) obtain their dependencies from the correct scope. + /// + internal class LifetimeFeature : ActivationFeature + { + public const string SharingBoundaryPartMetadataName = "SharingBoundary"; + + public override CompositeActivator RewriteActivator( + TypeInfo partType, + CompositeActivator activatorBody, + IDictionary partMetadata, + IEnumerable dependencies) + { + if (!ContractHelpers.IsShared(partMetadata)) + return activatorBody; + + object sharingBoundaryMetadata; + if (!partMetadata.TryGetValue(SharingBoundaryPartMetadataName, out sharingBoundaryMetadata)) + sharingBoundaryMetadata = null; + + var sharingBoundary = (string)sharingBoundaryMetadata; + var sharingKey = LifetimeContext.AllocateSharingId(); + + return (c, o) => + { + var scope = c.FindContextWithin(sharingBoundary); + if (object.ReferenceEquals(scope, c)) + return scope.GetOrCreate(sharingKey, o, activatorBody); + else + return CompositionOperation.Run(scope, (c1, o1) => c1.GetOrCreate(sharingKey, o1, activatorBody)); + }; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/OnImportsSatisfiedFeature.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/OnImportsSatisfiedFeature.cs new file mode 100644 index 000000000000..bdddc461e190 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/OnImportsSatisfiedFeature.cs @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Convention; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Modifies activators of parts that have so that + /// their [OnImportsSatisfied] method is correctly called. + /// + internal class OnImportsSatisfiedFeature : ActivationFeature + { + private readonly AttributedModelProvider _attributeContext; + + public OnImportsSatisfiedFeature(AttributedModelProvider attributeContext) + { + if (attributeContext == null) throw new ArgumentNullException("attributeContext"); + _attributeContext = attributeContext; + } + + public override CompositeActivator RewriteActivator( + TypeInfo partType, + CompositeActivator activator, + IDictionary partMetadata, + IEnumerable dependencies) + { + var result = activator; + + var partTypeAsType = partType.AsType(); + var importsSatisfiedMethods = partTypeAsType.GetRuntimeMethods() + .Where(mi => _attributeContext.GetDeclaredAttribute(mi.DeclaringType, mi) != null); + + foreach (var m in importsSatisfiedMethods) + { + if (!(m.IsPublic || m.IsAssembly) | m.IsStatic || m.ReturnType != typeof(void) || + m.IsGenericMethodDefinition || m.GetParameters().Length != 0) + { + var message = string.Format( + Properties.Resources.OnImportsSatisfiedFeature_AttributeError, + partType, m.Name); + throw new CompositionFailedException(message); + } + + var ois = Expression.Parameter(typeof(object), "ois"); + var call = Expression.Lambda>( + Expression.Call(Expression.Convert(ois, partType.AsType()), m), ois).Compile(); + + var prev = result; + result = (c, o) => + { + var psn = prev(c, o); + o.AddPostCompositionAction(() => call(psn)); + return psn; + }; + } + + return result; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyImportSite.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyImportSite.cs new file mode 100644 index 000000000000..65a282a5e241 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyImportSite.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Represents a part property that is configured as an import. + /// + internal class PropertyImportSite + { + private readonly PropertyInfo _pi; + + public PropertyImportSite(PropertyInfo pi) + { + _pi = pi; + } + + public PropertyInfo Property { get { return _pi; } } + + public override string ToString() + { + return _pi.Name; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyInjectionFeature.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyInjectionFeature.cs new file mode 100644 index 000000000000..e1a6b21b41ac --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ActivationFeatures/PropertyInjectionFeature.cs @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Composition.Convention; + +namespace System.Composition.TypedParts.ActivationFeatures +{ + /// + /// Modifies activators of parts with property imports so that the properties + /// are set appropriately. + /// + internal class PropertyInjectionFeature : ActivationFeature + { + private readonly AttributedModelProvider _attributeContext; + private static readonly MethodInfo s_activatorInvokeMethod = typeof(CompositeActivator).GetTypeInfo().GetDeclaredMethod("Invoke"); + + public PropertyInjectionFeature(AttributedModelProvider attributeContext) + { + _attributeContext = attributeContext; + } + + public override IEnumerable GetDependencies(TypeInfo partType, DependencyAccessor definitionAccessor) + { + var partTypeAsType = partType.AsType(); + var imports = (from pi in partTypeAsType.GetRuntimeProperties() + .Where(pi => pi.CanWrite && pi.SetMethod.IsPublic && !(pi.SetMethod.IsStatic)) + let attrs = _attributeContext.GetDeclaredAttributes(pi.DeclaringType, pi).ToArray() + let site = new PropertyImportSite(pi) + where attrs.Any(a => a is ImportAttribute || a is ImportManyAttribute) + select new { Site = site, ImportInfo = ContractHelpers.GetImportInfo(pi.PropertyType, attrs, site) }).ToArray(); + + if (imports.Length == 0) + return NoDependencies; + + var result = new List(); + + foreach (var i in imports) + { + if (!i.ImportInfo.AllowDefault) + { + result.Add(definitionAccessor.ResolveRequiredDependency(i.Site, i.ImportInfo.Contract, false)); + } + else + { + CompositionDependency optional; + if (definitionAccessor.TryResolveOptionalDependency(i.Site, i.ImportInfo.Contract, false, out optional)) + result.Add(optional); + // Variation from CompositionContainer behaviour: we don't have to support recomposition + // so we don't require that defaultable imports be set to null. + } + } + + return result; + } + + public override CompositeActivator RewriteActivator( + TypeInfo partType, + CompositeActivator activator, + IDictionary partMetadata, + IEnumerable dependencies) + { + var propertyDependencies = dependencies + .Where(dep => dep.Site is PropertyImportSite) + .ToDictionary(d => ((PropertyImportSite)d.Site).Property); + + if (propertyDependencies.Count == 0) + return activator; + + var lc = Expression.Parameter(typeof(LifetimeContext)); + var op = Expression.Parameter(typeof(CompositionOperation)); + var inst = Expression.Parameter(typeof(object)); + var typed = Expression.Variable(partType.AsType()); + + var statements = new List(); + var assignTyped = Expression.Assign(typed, Expression.Convert(inst, partType.AsType())); + statements.Add(assignTyped); + + foreach (var d in propertyDependencies) + { + var property = d.Key; + + var assignment = Expression.Assign( + Expression.MakeMemberAccess(typed, property), + Expression.Convert( + Expression.Call( + Expression.Constant(d.Value.Target.GetDescriptor().Activator), + s_activatorInvokeMethod, + lc, + op), + property.PropertyType)); + + statements.Add(assignment); + } + + statements.Add(inst); + + var setAll = Expression.Block(new[] { typed }, statements); + var setAction = Expression.Lambda>( + setAll, inst, lc, op).Compile(); + + return (c, o) => + { + var i = activator(c, o); + o.AddNonPrerequisiteAction(() => setAction(i, c, o)); + return i; + }; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ContractHelpers.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ContractHelpers.cs new file mode 100644 index 000000000000..69d6e838e680 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ContractHelpers.cs @@ -0,0 +1,102 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.TypedParts.ActivationFeatures; +using System.Composition.Hosting; + +namespace System.Composition.TypedParts +{ + internal static class ContractHelpers + { + private const string ImportManyImportMetadataConstraintName = "IsImportMany"; + + public static bool TryGetExplicitImportInfo(Type memberType, object[] attributes, object site, out ImportInfo importInfo) + { + if (attributes.Any(a => a is ImportAttribute || a is ImportManyAttribute)) + { + importInfo = GetImportInfo(memberType, attributes, site); + return true; + } + + importInfo = null; + return false; + } + + public static ImportInfo GetImportInfo(Type memberType, object[] attributes, object site) + { + var importedContract = new CompositionContract(memberType); + IDictionary importMetadata = null; + var allowDefault = false; + var explicitImportsApplied = 0; + + foreach (var attr in attributes) + { + var ia = attr as ImportAttribute; + if (ia != null) + { + importedContract = new CompositionContract(memberType, ia.ContractName); + allowDefault = ia.AllowDefault; + explicitImportsApplied++; + } + else + { + var ima = attr as ImportManyAttribute; + if (ima != null) + { + importMetadata = importMetadata ?? new Dictionary(); + importMetadata.Add(ImportManyImportMetadataConstraintName, true); + importedContract = new CompositionContract(memberType, ima.ContractName); + explicitImportsApplied++; + } + else + { + var imca = attr as ImportMetadataConstraintAttribute; + if (imca != null) + { + importMetadata = importMetadata ?? new Dictionary(); + importMetadata.Add(imca.Name, imca.Value); + } + } + } + + var attrType = attr.GetType(); + // Note, we don't support ReflectionContext in this scenario + if (attrType.GetTypeInfo().GetCustomAttribute(true) != null) + { + // We don't coalesce to collections here the way export metadata does + foreach (var prop in attrType + .GetRuntimeProperties() + .Where(p => p.GetMethod.IsPublic && p.DeclaringType == attrType && p.CanRead)) + { + importMetadata = importMetadata ?? new Dictionary(); + importMetadata.Add(prop.Name, prop.GetValue(attr, null)); + } + } + } + + if (explicitImportsApplied > 1) + { + var message = string.Format(Properties.Resources.ContractHelpers_TooManyImports, site); + throw new CompositionFailedException(message); + } + + if (importMetadata != null) + { + importedContract = new CompositionContract(importedContract.ContractType, importedContract.ContractName, importMetadata); + } + + return new ImportInfo(importedContract, allowDefault); + } + + public static bool IsShared(IDictionary partMetadata) + { + return partMetadata.ContainsKey(LifetimeFeature.SharingBoundaryPartMetadataName); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredExport.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredExport.cs new file mode 100644 index 000000000000..3fdd1e99618b --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredExport.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Diagnostics; +using System.Linq; +using System.Reflection; + +namespace System.Composition.TypedParts.Discovery +{ + [DebuggerDisplay("{Contract}")] + internal abstract class DiscoveredExport + { + private readonly CompositionContract _exportKey; + private readonly IDictionary _metadata; + private DiscoveredPart _part; + + public DiscoveredExport(CompositionContract exportKey, IDictionary metadata) + { + _exportKey = exportKey; + _metadata = metadata; + } + + public CompositionContract Contract { get { return _exportKey; } } + + public IDictionary Metadata { get { return _metadata; } } + + public DiscoveredPart Part { get { return _part; } set { _part = value; } } + + public ExportDescriptorPromise GetExportDescriptorPromise( + CompositionContract contract, + DependencyAccessor definitionAccessor) + { + return new ExportDescriptorPromise( + contract, + Part.PartType.Name, + Part.IsShared, + () => Part.GetDependencies(definitionAccessor), + deps => + { + var activator = Part.GetActivator(definitionAccessor, deps); + return GetExportDescriptor(activator); + }); + } + + protected abstract ExportDescriptor GetExportDescriptor(CompositeActivator partActivator); + + public abstract DiscoveredExport CloseGenericExport(TypeInfo closedPartType, Type[] genericArguments); + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredInstanceExport.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredInstanceExport.cs new file mode 100644 index 000000000000..a7a53f2f9c5e --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredInstanceExport.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Reflection; + +namespace System.Composition.TypedParts.Discovery +{ + internal class DiscoveredInstanceExport : DiscoveredExport + { + public DiscoveredInstanceExport(CompositionContract contract, IDictionary metadata) + : base(contract, metadata) + { + } + + protected override ExportDescriptor GetExportDescriptor(CompositeActivator partActivator) + { + return ExportDescriptor.Create(partActivator, Metadata); + } + + public override DiscoveredExport CloseGenericExport(TypeInfo closedPartType, Type[] genericArguments) + { + var closedContractType = Contract.ContractType.MakeGenericType(genericArguments); + var newContract = Contract.ChangeType(closedContractType); + return new DiscoveredInstanceExport(newContract, Metadata); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPart.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPart.cs new file mode 100644 index 000000000000..b91ae1171c27 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPart.cs @@ -0,0 +1,219 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Linq.Expressions; +using System.Diagnostics; +using System.Composition.Debugging; +using System.Composition.TypedParts.ActivationFeatures; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.Convention; +using System.Composition.Hosting; + +namespace System.Composition.TypedParts.Discovery +{ + [DebuggerDisplay("{PartType.Name}")] + [DebuggerTypeProxy(typeof(DiscoveredPartDebuggerProxy))] + internal class DiscoveredPart + { + private readonly TypeInfo _partType; + private readonly AttributedModelProvider _attributeContext; + private readonly ICollection _exports = new List(); + private readonly ActivationFeature[] _activationFeatures; + private readonly Lazy> _partMetadata; + + // This is unbounded so potentially a source of memory consumption, + // but in reality unlikely to be a problem. + private readonly IList _appliedArguments = new List(); + + // Lazyily initialised among potentially many exports + private ConstructorInfo _constructor; + private CompositeActivator _partActivator; + + private static readonly IDictionary s_noMetadata = new Dictionary(); + private static readonly MethodInfo s_activatorInvoke = typeof(CompositeActivator).GetTypeInfo().GetDeclaredMethod("Invoke"); + + private DiscoveredPart( + TypeInfo partType, + AttributedModelProvider attributeContext, + ActivationFeature[] activationFeatures, + Lazy> partMetadata) + { + _partType = partType; + _attributeContext = attributeContext; + _activationFeatures = activationFeatures; + _partMetadata = partMetadata; + } + + public DiscoveredPart( + TypeInfo partType, + AttributedModelProvider attributeContext, + ActivationFeature[] activationFeatures) + { + _partType = partType; + _attributeContext = attributeContext; + _activationFeatures = activationFeatures; + _partMetadata = new Lazy>(() => GetPartMetadata(partType)); + } + + public TypeInfo PartType { get { return _partType; } } + + public bool IsShared { get { return ContractHelpers.IsShared(_partMetadata.Value); } } + + public void AddDiscoveredExport(DiscoveredExport export) + { + _exports.Add(export); + export.Part = this; + } + + public CompositionDependency[] GetDependencies(DependencyAccessor definitionAccessor) + { + return GetPartActivatorDependencies(definitionAccessor) + .Concat(_activationFeatures + .SelectMany(feature => feature.GetDependencies(_partType, definitionAccessor))) + .Where(a => a != null) + .ToArray(); + } + + private IEnumerable GetPartActivatorDependencies(DependencyAccessor definitionAccessor) + { + var partTypeAsType = _partType.AsType(); + + if (_constructor == null) + { + foreach (var c in _partType.DeclaredConstructors.Where(ci => ci.IsPublic && !(ci.IsStatic))) + { + if (_attributeContext.GetDeclaredAttribute(partTypeAsType, c) != null) + { + if (_constructor != null) + { + var message = string.Format(Properties.Resources.DiscoveredPart_MultipleImportingConstructorsFound, _partType); + throw new CompositionFailedException(message); + } + + _constructor = c; + } + } + + if (_constructor == null) + _constructor = _partType.DeclaredConstructors + .FirstOrDefault(ci => ci.IsPublic && !(ci.IsStatic || ci.GetParameters().Any())); + + if (_constructor == null) + { + var message = string.Format(Properties.Resources.DiscoveredPart_NoImportingConstructorsFound, _partType); + throw new CompositionFailedException(message); + } + } + + var cps = _constructor.GetParameters(); + + for (var i = 0; i < cps.Length; ++i) + { + var pi = cps[i]; + var site = new ParameterImportSite(pi); + + var importInfo = ContractHelpers.GetImportInfo(pi.ParameterType, _attributeContext.GetDeclaredAttributes(partTypeAsType, pi), site); + if (!importInfo.AllowDefault) + { + yield return definitionAccessor.ResolveRequiredDependency(site, importInfo.Contract, true); + } + else + { + CompositionDependency optional; + if (definitionAccessor.TryResolveOptionalDependency(site, importInfo.Contract, true, out optional)) + yield return optional; + } + } + } + + public CompositeActivator GetActivator(DependencyAccessor definitionAccessor, IEnumerable dependencies) + { + if (_partActivator != null) return _partActivator; + + var contextParam = Expression.Parameter(typeof(LifetimeContext), "cc"); + var operationParm = Expression.Parameter(typeof(CompositionOperation), "op"); + + var cps = _constructor.GetParameters(); + Expression[] paramActivatorCalls = new Expression[cps.Length]; + + var partActivatorDependencies = dependencies + .Where(dep => dep.Site is ParameterImportSite) + .ToDictionary(d => ((ParameterImportSite)d.Site).Parameter); + + for (var i = 0; i < cps.Length; ++i) + { + var pi = cps[i]; + CompositionDependency dep; + + if (partActivatorDependencies.TryGetValue(pi, out dep)) + { + var a = dep.Target.GetDescriptor().Activator; + paramActivatorCalls[i] = + Expression.Convert(Expression.Call(Expression.Constant(a), s_activatorInvoke, contextParam, operationParm), pi.ParameterType); + } + else + { + paramActivatorCalls[i] = Expression.Default(pi.ParameterType); + } + } + + Expression body = Expression.Convert(Expression.New(_constructor, paramActivatorCalls), typeof(object)); + + var activator = Expression + .Lambda(body, contextParam, operationParm) + .Compile(); + + foreach (var activationFeature in _activationFeatures) + activator = activationFeature.RewriteActivator(_partType, activator, _partMetadata.Value, dependencies); + + _partActivator = activator; + return _partActivator; + } + + public IDictionary GetPartMetadata(TypeInfo partType) + { + var partMetadata = new Dictionary(); + foreach (var attr in _attributeContext.GetDeclaredAttributes(partType.AsType(), partType)) + { + if (attr is PartMetadataAttribute) + { + var ma = (PartMetadataAttribute)attr; + partMetadata.Add(ma.Name, ma.Value); + } + } + + return partMetadata.Count == 0 ? s_noMetadata : partMetadata; + } + + public bool TryCloseGenericPart(Type[] typeArguments, out DiscoveredPart closed) + { + if (_appliedArguments.Any(args => Enumerable.SequenceEqual(args, typeArguments))) + { + closed = null; + return false; + } + + _appliedArguments.Add(typeArguments); + + var closedType = _partType.MakeGenericType(typeArguments).GetTypeInfo(); + + var result = new DiscoveredPart(closedType, _attributeContext, _activationFeatures, _partMetadata); + + foreach (var export in _exports) + { + var closedExport = export.CloseGenericExport(closedType, typeArguments); + result.AddDiscoveredExport(closedExport); + } + + closed = result; + return true; + } + + public IEnumerable DiscoveredExports { get { return _exports; } } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPropertyExport.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPropertyExport.cs new file mode 100644 index 000000000000..03965d268349 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/DiscoveredPropertyExport.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace System.Composition.TypedParts.Discovery +{ + internal class DiscoveredPropertyExport : DiscoveredExport + { + private static readonly MethodInfo s_activatorInvoke = typeof(CompositeActivator).GetRuntimeMethod("Invoke", new[] { typeof(LifetimeContext), typeof(CompositionOperation) }); + + private readonly PropertyInfo _property; + + public DiscoveredPropertyExport(CompositionContract contract, IDictionary metadata, PropertyInfo property) + : base(contract, metadata) + { + _property = property; + } + + protected override ExportDescriptor GetExportDescriptor(CompositeActivator partActivator) + { + var args = new[] { Expression.Parameter(typeof(LifetimeContext)), Expression.Parameter(typeof(CompositionOperation)) }; + + var activator = Expression.Lambda( + Expression.Property( + Expression.Convert(Expression.Call(Expression.Constant(partActivator), s_activatorInvoke, args), _property.DeclaringType), + _property), + args); + + return ExportDescriptor.Create(activator.Compile(), Metadata); + } + + public override DiscoveredExport CloseGenericExport(TypeInfo closedPartType, Type[] genericArguments) + { + var closedContractType = Contract.ContractType.MakeGenericType(genericArguments); + var newContract = Contract.ChangeType(closedContractType); + var property = closedPartType.AsType().GetRuntimeProperty(_property.Name); + return new DiscoveredPropertyExport(newContract, Metadata, property); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/ParameterImportSite.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/ParameterImportSite.cs new file mode 100644 index 000000000000..d350ee32eafb --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/ParameterImportSite.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; + +namespace System.Composition.TypedParts.Discovery +{ + internal class ParameterImportSite + { + private readonly ParameterInfo _pi; + + public ParameterImportSite(ParameterInfo pi) + { + _pi = pi; + } + + public ParameterInfo Parameter { get { return _pi; } } + + public override string ToString() + { + return _pi.Name; + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/TypeInspector.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/TypeInspector.cs new file mode 100644 index 000000000000..288c47fb79ba --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Discovery/TypeInspector.cs @@ -0,0 +1,239 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Convention; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.TypedParts.ActivationFeatures; +using System.Linq; +using System.Reflection; + +namespace System.Composition.TypedParts.Discovery +{ + internal class TypeInspector + { + private static readonly IDictionary s_noMetadata = new Dictionary(); + + private readonly ActivationFeature[] _activationFeatures; + private readonly AttributedModelProvider _attributeContext; + + public TypeInspector(AttributedModelProvider attributeContext, ActivationFeature[] activationFeatures) + { + _attributeContext = attributeContext; + _activationFeatures = activationFeatures; + } + + public bool InspectTypeForPart(TypeInfo type, out DiscoveredPart part) + { + part = null; + + if (type.IsAbstract || !type.IsClass || _attributeContext.GetDeclaredAttribute(type.AsType(), type) != null) + return false; + + foreach (var export in DiscoverExports(type)) + { + part = part ?? new DiscoveredPart(type, _attributeContext, _activationFeatures); + part.AddDiscoveredExport(export); + } + + return part != null; + } + + private IEnumerable DiscoverExports(TypeInfo partType) + { + foreach (var export in DiscoverInstanceExports(partType)) + yield return export; + + foreach (var export in DiscoverPropertyExports(partType)) + yield return export; + } + + private IEnumerable DiscoverInstanceExports(TypeInfo partType) + { + var partTypeAsType = partType.AsType(); + foreach (var export in _attributeContext.GetDeclaredAttributes(partTypeAsType, partType)) + { + IDictionary metadata = new Dictionary(); + ReadMetadataAttribute(export, metadata); + + var applied = _attributeContext.GetDeclaredAttributes(partTypeAsType, partType); + ReadLooseMetadata(applied, metadata); + + var contractType = export.ContractType ?? partTypeAsType; + CheckInstanceExportCompatibility(partType, contractType.GetTypeInfo()); + + var exportKey = new CompositionContract(contractType, export.ContractName); + + if (metadata.Count == 0) + metadata = s_noMetadata; + + yield return new DiscoveredInstanceExport(exportKey, metadata); + } + } + + private IEnumerable DiscoverPropertyExports(TypeInfo partType) + { + var partTypeAsType = partType.AsType(); + foreach (var property in partTypeAsType.GetRuntimeProperties() + .Where(pi => pi.CanRead && pi.GetMethod.IsPublic && !pi.GetMethod.IsStatic)) + { + foreach (var export in _attributeContext.GetDeclaredAttributes(partTypeAsType, property)) + { + IDictionary metadata = new Dictionary(); + ReadMetadataAttribute(export, metadata); + + var applied = _attributeContext.GetDeclaredAttributes(partTypeAsType, property); + ReadLooseMetadata(applied, metadata); + + var contractType = export.ContractType ?? property.PropertyType; + CheckPropertyExportCompatibility(partType, property, contractType.GetTypeInfo()); + + var exportKey = new CompositionContract(export.ContractType ?? property.PropertyType, export.ContractName); + + if (metadata.Count == 0) + metadata = s_noMetadata; + + yield return new DiscoveredPropertyExport(exportKey, metadata, property); + } + } + } + + private void ReadLooseMetadata(object[] appliedAttributes, IDictionary metadata) + { + foreach (var attribute in appliedAttributes) + { + if (attribute is ExportAttribute) + continue; + + var ema = attribute as ExportMetadataAttribute; + if (ema != null) + { + AddMetadata(metadata, ema.Name, ema.Value); + } + else + { + ReadMetadataAttribute((Attribute)attribute, metadata); + } + } + } + + private void AddMetadata(IDictionary metadata, string name, object value) + { + object existingValue; + if (!metadata.TryGetValue(name, out existingValue)) + { + metadata.Add(name, value); + return; + } + + var valueType = existingValue.GetType(); + if (valueType.IsArray) + { + var existingArray = (Array)existingValue; + var newArray = Array.CreateInstance(value.GetType(), existingArray.Length + 1); + Array.Copy(existingArray, newArray, existingArray.Length); + newArray.SetValue(value, existingArray.Length); + metadata[name] = newArray; + } + else + { + var newArray = Array.CreateInstance(value.GetType(), 2); + newArray.SetValue(existingValue, 0); + newArray.SetValue(value, 1); + metadata[name] = newArray; + } + } + + private void ReadMetadataAttribute(Attribute attribute, IDictionary metadata) + { + var attrType = attribute.GetType(); + + // Note, we don't support ReflectionContext in this scenario as + if (attrType.GetTypeInfo().GetCustomAttribute(true) == null) + return; + + foreach (var prop in attrType + .GetRuntimeProperties() + .Where(p => p.DeclaringType == attrType && p.CanRead)) + { + AddMetadata(metadata, prop.Name, prop.GetValue(attribute, null)); + } + } + + private static void CheckPropertyExportCompatibility(TypeInfo partType, PropertyInfo property, TypeInfo contractType) + { + if (partType.IsGenericTypeDefinition) + { + CheckGenericContractCompatibility(partType, property.PropertyType.GetTypeInfo(), contractType); + } + else if (!contractType.IsAssignableFrom(property.PropertyType.GetTypeInfo())) + { + var message = string.Format(Properties.Resources.TypeInspector_ExportedContractTypeNotAssignable, + contractType.Name, property.Name, partType.Name); + throw new CompositionFailedException(message); + } + } + + private static void CheckGenericContractCompatibility(TypeInfo partType, TypeInfo exportingMemberType, TypeInfo contractType) + { + if (!contractType.IsGenericTypeDefinition) + { + var message = string.Format(Properties.Resources.TypeInspector_NoExportNonGenericContract, partType.Name, contractType.Name); + throw new CompositionFailedException(message); + } + + var compatible = false; + + foreach (var ifce in GetAssignableTypes(exportingMemberType)) + { + if (ifce == contractType || (ifce.IsGenericType && ifce.GetGenericTypeDefinition() == contractType.AsType())) + { + var mappedType = ifce; + if (!(mappedType == partType || mappedType.GenericTypeArguments.SequenceEqual(partType.GenericTypeParameters))) + { + var message = string.Format(Properties.Resources.TypeInspector_ArgumentMissmatch, contractType.Name, partType.Name); + throw new CompositionFailedException(message); + } + + compatible = true; + break; + } + } + + if (!compatible) + { + var message = string.Format(Properties.Resources.TypeInspector_ExportNotCompatible, exportingMemberType.Name, partType.Name, contractType.Name); + throw new CompositionFailedException(message); + } + } + + private static IEnumerable GetAssignableTypes(TypeInfo exportingMemberType) + { + foreach (var ifce in exportingMemberType.ImplementedInterfaces) + yield return ifce.GetTypeInfo(); + + var b = exportingMemberType; + while (b != null) + { + yield return b; + b = b.BaseType.GetTypeInfo(); + } + } + + private static void CheckInstanceExportCompatibility(TypeInfo partType, TypeInfo contractType) + { + if (partType.IsGenericTypeDefinition) + { + CheckGenericContractCompatibility(partType, partType, contractType); + } + else if (!contractType.IsAssignableFrom(partType)) + { + var message = string.Format(Properties.Resources.TypeInspector_ContractNotAssignable, contractType.Name, partType.Name); + throw new CompositionFailedException(message); + } + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ImportInfo.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ImportInfo.cs new file mode 100644 index 000000000000..5875f4ce73c5 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/ImportInfo.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Composition.Hosting.Core; + +namespace System.Composition.TypedParts +{ + internal class ImportInfo + { + private readonly CompositionContract _exportKey; + private readonly bool _allowDefault; + + public ImportInfo(CompositionContract exportKey, bool allowDefault) + { + _exportKey = exportKey; + _allowDefault = allowDefault; + } + + public bool AllowDefault { get { return _allowDefault; } } + + public CompositionContract Contract { get { return _exportKey; } } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/TypedPartExportDescriptorProvider.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/TypedPartExportDescriptorProvider.cs new file mode 100644 index 000000000000..f26cd15ee24d --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/TypedPartExportDescriptorProvider.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Convention; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.TypedParts.ActivationFeatures; +using System.Composition.TypedParts.Discovery; +using System.Linq; +using System.Reflection; + +namespace System.Composition.TypedParts +{ + internal class TypedPartExportDescriptorProvider : ExportDescriptorProvider + { + private readonly IDictionary> _discoveredParts = new Dictionary>(); + + public TypedPartExportDescriptorProvider(IEnumerable types, AttributedModelProvider attributeContext) + { + var activationFeatures = CreateActivationFeatures(attributeContext); + var typeInspector = new TypeInspector(attributeContext, activationFeatures); + + foreach (var type in types) + { + DiscoveredPart part; + if (typeInspector.InspectTypeForPart(type.GetTypeInfo(), out part)) + { + AddDiscoveredPart(part); + } + } + } + + private void AddDiscoveredPart(DiscoveredPart part) + { + foreach (var export in part.DiscoveredExports) + { + AddDiscoveredExport(export); + } + } + + private void AddDiscoveredExport(DiscoveredExport export, CompositionContract contract = null) + { + var actualContract = contract ?? export.Contract; + + ICollection forKey; + if (!_discoveredParts.TryGetValue(actualContract, out forKey)) + { + forKey = new List(); + _discoveredParts.Add(actualContract, forKey); + } + + forKey.Add(export); + } + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor) + { + DiscoverGenericParts(contract); + DiscoverConstrainedParts(contract); + + ICollection forKey; + if (!_discoveredParts.TryGetValue(contract, out forKey)) + return NoExportDescriptors; + + // Exports with metadata may be matched via metadata constraints. + // It should be possible to do this more aggressively by changing the way + // exports are stored. + if (!forKey.Any(x => x.Metadata.Any())) + { + // Allow some garbage to be collected + _discoveredParts.Remove(contract); + } + + return forKey.Select(de => de.GetExportDescriptorPromise(contract, definitionAccessor)).ToArray(); + } + + // If the contract has metadata constraints, look for exports with matching metadata. + private void DiscoverConstrainedParts(CompositionContract contract) + { + if (contract.MetadataConstraints != null) + { + var unconstrained = new CompositionContract(contract.ContractType, contract.ContractName); + DiscoverGenericParts(unconstrained); + + ICollection forKey; + if (_discoveredParts.TryGetValue(unconstrained, out forKey)) + { + foreach (var export in forKey) + { + var subsettedConstraints = contract.MetadataConstraints.Where(c => export.Metadata.ContainsKey(c.Key)).ToDictionary(c => c.Key, c => export.Metadata[c.Key]); + if (subsettedConstraints.Count != 0) + { + var constrainedSubset = new CompositionContract(unconstrained.ContractType, unconstrained.ContractName, subsettedConstraints); + + if (constrainedSubset.Equals(contract)) + AddDiscoveredExport(export, contract); + } + } + } + } + } + + // If the contract is a closed generic, look for open generics + // that close it. + private void DiscoverGenericParts(CompositionContract contract) + { + if (!contract.ContractType.IsConstructedGenericType) + return; + + var gtd = contract.ContractType.GetGenericTypeDefinition(); + var openGenericContract = contract.ChangeType(gtd); + ICollection openGenericParts; + if (!_discoveredParts.TryGetValue(openGenericContract, out openGenericParts)) + return; + + var typeArguments = contract.ContractType.GenericTypeArguments; + foreach (var open in openGenericParts) + { + DiscoveredPart closed; + if (open.Part.TryCloseGenericPart(typeArguments, out closed)) + AddDiscoveredPart(closed); + } + } + + private static ActivationFeature[] CreateActivationFeatures(AttributedModelProvider attributeContext) + { + return new ActivationFeature[] { + new DisposalFeature(), + new PropertyInjectionFeature(attributeContext), + new OnImportsSatisfiedFeature(attributeContext), + new LifetimeFeature(), + }; + } + + internal static ActivationFeature[] DebugGetActivationFeatures(AttributedModelProvider attributeContext) + { + return CreateActivationFeatures(attributeContext); + } + } +} diff --git a/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Util/DirectAttributeContext.cs b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Util/DirectAttributeContext.cs new file mode 100644 index 000000000000..b675a510bf61 --- /dev/null +++ b/src/System.Composition.TypedParts/src/System/Composition/TypedParts/Util/DirectAttributeContext.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Composition.Convention; + +namespace System.Composition.TypedParts.Util +{ + internal class DirectAttributeContext : AttributedModelProvider + { + public override IEnumerable GetCustomAttributes(Type reflectedType, Reflection.MemberInfo member) + { + if (reflectedType == null) throw new ArgumentNullException("reflectedType"); + if (member == null) throw new ArgumentNullException("member"); + + if (!(member is TypeInfo) && member.DeclaringType != reflectedType) + return new Attribute[0]; + + return member.GetCustomAttributes(false); + } + + public override IEnumerable GetCustomAttributes(Type reflectedType, Reflection.ParameterInfo parameter) + { + if (reflectedType == null) throw new ArgumentNullException("reflectedType"); + if (parameter == null) throw new ArgumentNullException("parameter"); + return parameter.GetCustomAttributes(false); + } + } +} diff --git a/src/System.Composition/System.Composition.sln b/src/System.Composition/System.Composition.sln new file mode 100644 index 000000000000..493d24dc5522 --- /dev/null +++ b/src/System.Composition/System.Composition.sln @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.TypedParts", "..\System.Composition.TypedParts\src\System.Composition.TypedParts.csproj", "{B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.AttributedModel", "..\System.Composition.AttributedModel\src\System.Composition.AttributedModel.csproj", "{C6257381-C624-494A-A9D9-5586E60856EA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Hosting", "..\System.Composition.Hosting\src\System.Composition.Hosting.csproj", "{2B8FECC6-34A1-48FE-BA75-99572D2D6DB2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Runtime", "..\System.Composition.Runtime\src\System.Composition.Runtime.csproj", "{2711DFD2-8541-4628-BC53-EB784A14CDCF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Convention", "..\System.Composition.Convention\src\System.Composition.Convention.csproj", "{E6592FAD-10B5-4B56-9287-D72DD136992F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B99B3931-53D0-490B-B27D-7247715EA621}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{5996586D-AAD0-4D69-A96C-D81A3816AD0B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Convention.Tests", "..\System.Composition.Convention\tests\System.Composition.Convention.Tests.csproj", "{853BB14F-8A5B-42B4-A053-21DE1AEBB335}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Composition.Demos.ExtendedCollectionImports", "demos\Microsoft.Composition.Demos.ExtendedCollectionImports\Microsoft.Composition.Demos.ExtendedCollectionImports.csproj", "{44C7E52C-3873-4C64-875C-8A23A8376D60}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Composition.ThroughputHarness", "perftests\Microsoft.Composition.ThroughputHarness.csproj", "{E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLibrary", "scenarios\TestLibrary\TestLibrary.csproj", "{DA6841A5-0344-4CC7-98B0-89CBEE18DEE3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Composition.Tests", "tests\System.Composition.Tests.csproj", "{4852A19F-C05C-478D-BFA0-59FD03DE0E3F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E}.Release|Any CPU.Build.0 = Release|Any CPU + {C6257381-C624-494A-A9D9-5586E60856EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6257381-C624-494A-A9D9-5586E60856EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6257381-C624-494A-A9D9-5586E60856EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6257381-C624-494A-A9D9-5586E60856EA}.Release|Any CPU.Build.0 = Release|Any CPU + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2}.Release|Any CPU.Build.0 = Release|Any CPU + {2711DFD2-8541-4628-BC53-EB784A14CDCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2711DFD2-8541-4628-BC53-EB784A14CDCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2711DFD2-8541-4628-BC53-EB784A14CDCF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2711DFD2-8541-4628-BC53-EB784A14CDCF}.Release|Any CPU.Build.0 = Release|Any CPU + {E6592FAD-10B5-4B56-9287-D72DD136992F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6592FAD-10B5-4B56-9287-D72DD136992F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6592FAD-10B5-4B56-9287-D72DD136992F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6592FAD-10B5-4B56-9287-D72DD136992F}.Release|Any CPU.Build.0 = Release|Any CPU + {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Debug|Any CPU.Build.0 = Debug|Any CPU + {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.ActiveCfg = Release|Any CPU + {853BB14F-8A5B-42B4-A053-21DE1AEBB335}.Release|Any CPU.Build.0 = Release|Any CPU + {44C7E52C-3873-4C64-875C-8A23A8376D60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44C7E52C-3873-4C64-875C-8A23A8376D60}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44C7E52C-3873-4C64-875C-8A23A8376D60}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44C7E52C-3873-4C64-875C-8A23A8376D60}.Release|Any CPU.Build.0 = Release|Any CPU + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3}.Release|Any CPU.Build.0 = Release|Any CPU + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3}.Release|Any CPU.Build.0 = Release|Any CPU + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {B4B5E15C-E6B9-48EA-94C2-F067484D4D3E} = {B99B3931-53D0-490B-B27D-7247715EA621} + {C6257381-C624-494A-A9D9-5586E60856EA} = {B99B3931-53D0-490B-B27D-7247715EA621} + {2B8FECC6-34A1-48FE-BA75-99572D2D6DB2} = {B99B3931-53D0-490B-B27D-7247715EA621} + {2711DFD2-8541-4628-BC53-EB784A14CDCF} = {B99B3931-53D0-490B-B27D-7247715EA621} + {E6592FAD-10B5-4B56-9287-D72DD136992F} = {B99B3931-53D0-490B-B27D-7247715EA621} + {853BB14F-8A5B-42B4-A053-21DE1AEBB335} = {5996586D-AAD0-4D69-A96C-D81A3816AD0B} + {44C7E52C-3873-4C64-875C-8A23A8376D60} = {5996586D-AAD0-4D69-A96C-D81A3816AD0B} + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3} = {5996586D-AAD0-4D69-A96C-D81A3816AD0B} + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3} = {5996586D-AAD0-4D69-A96C-D81A3816AD0B} + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F} = {5996586D-AAD0-4D69-A96C-D81A3816AD0B} + EndGlobalSection +EndGlobal diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Dictionaries/DictionaryExportDescriptorProvider.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Dictionaries/DictionaryExportDescriptorProvider.cs new file mode 100644 index 000000000000..c3e9aca65cf0 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Dictionaries/DictionaryExportDescriptorProvider.cs @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Linq; +using System.Reflection; +using Microsoft.Composition.Demos.ExtendedCollectionImports.Util; + +namespace Microsoft.Composition.Demos.ExtendedCollectionImports.Dictionaries +{ + public class DictionaryExportDescriptorProvider : ExportDescriptorProvider + { + /// + /// Identifies the metadata used as key for a dictionary import. + /// + private const string KeyByMetadataImportMetadataConstraintName = "KeyMetadataName"; + + private static readonly MethodInfo s_getDictionaryDefinitionsMethod = typeof(DictionaryExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetDictionaryDefinition"); + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor) + { + if (!(contract.ContractType.IsConstructedGenericType && contract.ContractType.GetGenericTypeDefinition() == typeof(IDictionary<,>))) + return NoExportDescriptors; + + CompositionContract unwrapped; + string keyByMetadataName; + if (!contract.TryUnwrapMetadataConstraint(KeyByMetadataImportMetadataConstraintName, out keyByMetadataName, out unwrapped)) + return NoExportDescriptors; + + var args = contract.ContractType.GenericTypeArguments; + var keyType = args[0]; + var valueType = args[1]; + + var valueContract = unwrapped.ChangeType(valueType); + + var gdd = s_getDictionaryDefinitionsMethod.MakeGenericMethod(keyType, valueType); + + return new[] { (ExportDescriptorPromise)gdd.Invoke(null, new object[] { contract, valueContract, descriptorAccessor, keyByMetadataName }) }; + } + + private static ExportDescriptorPromise GetDictionaryDefinition(CompositionContract dictionaryContract, CompositionContract valueContract, DependencyAccessor definitionAccessor, string keyByMetadataName) + { + return new ExportDescriptorPromise( + dictionaryContract, + typeof(IDictionary).Name, + false, + () => definitionAccessor.ResolveDependencies("value", valueContract, true), + deps => + { + var items = deps.Select(d => Tuple.Create(d.Target.Origin, d.Target.GetDescriptor())).ToArray(); + var isValidated = false; + return ExportDescriptor.Create((c, o) => + { + if (!isValidated) + { + Validate(items, keyByMetadataName); + isValidated = true; + } + + return items.ToDictionary( + item => (TKey)item.Item2.Metadata[keyByMetadataName], + item => (TValue)item.Item2.Activator(c, o)); + }, + NoMetadata); + }); + } + + private static void Validate(Tuple[] partsWithMatchedDescriptors, string keyByMetadataName) + { + var missing = partsWithMatchedDescriptors.Where(p => !p.Item2.Metadata.ContainsKey(keyByMetadataName)).ToArray(); + if (missing.Length != 0) + { + var problems = Formatters.ReadableQuotedList(missing.Select(p => p.Item1)); + var message = string.Format("The metadata '{0}' cannot be used as a dictionary import key because it is missing from exports on part(s) {1}.", keyByMetadataName, problems); + throw new CompositionFailedException(message); + } + + var wrongType = partsWithMatchedDescriptors.Where(p => !(p.Item2.Metadata[keyByMetadataName] is TKey)).ToArray(); + if (wrongType.Length != 0) + { + var problems = Formatters.ReadableQuotedList(wrongType.Select(p => p.Item1)); + var message = string.Format("The metadata '{0}' cannot be used as a dictionary import key of type '{1}' because the value(s) supplied by {2} are of the wrong type.", keyByMetadataName, typeof(TKey).Name, problems); + throw new CompositionFailedException(message); + } + + var firstDuplicated = partsWithMatchedDescriptors.GroupBy(p => (TKey)p.Item2.Metadata[keyByMetadataName]).Where(g => g.Count() > 1).FirstOrDefault(); + if (firstDuplicated != null) + { + var problems = Formatters.ReadableQuotedList(firstDuplicated.Select(p => p.Item1)); + var message = string.Format("The metadata '{0}' cannot be used as a dictionary import key because the value '{1}' is associated with exports from parts {2}.", keyByMetadataName, firstDuplicated.Key, problems); + throw new CompositionFailedException(message); + } + } + } +} diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/KeyByMetadataAttribute.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/KeyByMetadataAttribute.cs new file mode 100644 index 000000000000..daf2fcad512a --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/KeyByMetadataAttribute.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; + +namespace Microsoft.Composition.Demos.ExtendedCollectionImports +{ + /// + /// Used in conjunction with an import of type , + /// specifies the metadata item associated with each value that will be used as the + /// key within the dictionary. + /// + /// + /// The exporters provide a metadata item, here "HandledState": + /// + /// [Export(typeof(ModemStateImplementation)), + /// ExportMetadata("HandledState", ModemState.On)] + /// public class OnState : ModemStateImplementation + /// { + /// + /// The importer requests that its imports are keyed according to the same metadata item. + /// + /// [ImportingConstructor] + /// public Modem( + /// [KeyByMetadata("HandledState")] + /// IDictionary<ModemState, Lazy<ModemStateImplementation>> states) + /// { + /// + /// + [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] + [MetadataAttribute] + public sealed class KeyByMetadataAttribute : Attribute + { + private readonly string _metadataKey; + + private const string KeyByMetadataImportMetadataConstraintName = "KeyMetadataName"; + + /// + /// Construct a for the specified metadata name. + /// + /// The name of the metadata item to use as the key of the dictionary. + public KeyByMetadataAttribute(string keyMetadataName) + { + _metadataKey = keyMetadataName; + } + + /// + /// The name of the metadata item to use as the key of the dictionary. + /// + public string KeyMetadataName { get { return _metadataKey; } } + } +} diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Microsoft.Composition.Demos.ExtendedCollectionImports.csproj b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Microsoft.Composition.Demos.ExtendedCollectionImports.csproj new file mode 100644 index 000000000000..89888ffcbe92 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Microsoft.Composition.Demos.ExtendedCollectionImports.csproj @@ -0,0 +1,51 @@ + + + + + + {44C7E52C-3873-4C64-875C-8A23A8376D60} + Library + Properties + Microsoft.Composition.Demos.ExtendedCollectionImports + Microsoft.Composition.Demos.ExtendedCollectionImports + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + + + + + + + + + + + + + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + {2b8fecc6-34a1-48fe-ba75-99572d2d6db2} + System.Composition.Hosting + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + + + diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedCollections/OrderedImportManyExportDescriptorProvider.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedCollections/OrderedImportManyExportDescriptorProvider.cs new file mode 100644 index 000000000000..cd9685f44c15 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedCollections/OrderedImportManyExportDescriptorProvider.cs @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Composition.Hosting.Core; +using System.Collections.Generic; +using System.Linq; +using System; +using Microsoft.Composition.Demos.ExtendedCollectionImports.Util; +using System.Composition.Hosting; + +namespace Microsoft.Composition.Demos.ExtendedCollectionImports.OrderedCollections +{ + public class OrderedImportManyExportDescriptorProvider : ExportDescriptorProvider + { + /// + /// Identifies the metadata used to order a "many" import. + /// + private const string OrderByMetadataImportMetadataConstraintName = "OrderMetadataName"; + + private static readonly MethodInfo s_getImportManyDefinitionMethod = typeof(OrderedImportManyExportDescriptorProvider).GetTypeInfo().GetDeclaredMethod("GetImportManyDescriptor"); + private static readonly Type[] s_supportedContractTypes = new[] { typeof(IList<>), typeof(ICollection<>), typeof(IEnumerable<>) }; + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor) + { + if (!(contract.ContractType.IsArray || + contract.ContractType.IsConstructedGenericType && s_supportedContractTypes.Contains(contract.ContractType.GetGenericTypeDefinition()))) + return NoExportDescriptors; + + string keyToOrderBy; + CompositionContract orderUnwrappedContract; + if (!contract.TryUnwrapMetadataConstraint(OrderByMetadataImportMetadataConstraintName, out keyToOrderBy, out orderUnwrappedContract)) + return NoExportDescriptors; + + var elementType = contract.ContractType.IsArray ? + contract.ContractType.GetElementType() : + contract.ContractType.GenericTypeArguments[0]; + + var elementContract = orderUnwrappedContract.ChangeType(elementType); + + var gimd = s_getImportManyDefinitionMethod.MakeGenericMethod(elementType); + + return new[] { (ExportDescriptorPromise)gimd.Invoke(null, new object[] { contract, elementContract, definitionAccessor, keyToOrderBy }) }; + } + + private static ExportDescriptorPromise GetImportManyDescriptor(CompositionContract importManyContract, CompositionContract elementContract, DependencyAccessor definitionAccessor, string keyToOrderBy) + { + return new ExportDescriptorPromise( + importManyContract, + typeof(TElement[]).Name, + false, + () => definitionAccessor.ResolveDependencies("item", elementContract, true), + d => + { + var dependentDescriptors = (keyToOrderBy != null) ? + OrderDependentDescriptors(d, keyToOrderBy) : + d.Select(el => el.Target.GetDescriptor()).ToArray(); + + return ExportDescriptor.Create((c, o) => dependentDescriptors.Select(e => (TElement)e.Activator(c, o)).ToArray(), NoMetadata); + }); + } + + private static IEnumerable OrderDependentDescriptors(IEnumerable dependentDescriptors, string keyToOrderBy) + { + var targets = dependentDescriptors.Select(d => d.Target).ToArray(); + var missing = targets.Where(t => !t.GetDescriptor().Metadata.ContainsKey(keyToOrderBy) || + t.GetDescriptor().Metadata[keyToOrderBy] == null).ToArray(); + if (missing.Length != 0) + { + var origins = Formatters.ReadableQuotedList(missing.Select(m => m.Origin)); + var message = string.Format("The metadata '{0}' cannot be used for ordering because it is missing from exports on part(s) {1}.", keyToOrderBy, origins); + throw new CompositionFailedException(message); + } + + return targets.Select(t => t.GetDescriptor()).OrderBy(d => d.Metadata[keyToOrderBy]).ToArray(); + } + } +} diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedImportManyAttribute.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedImportManyAttribute.cs new file mode 100644 index 000000000000..50a698d0d1e6 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/OrderedImportManyAttribute.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Composition; + +namespace Microsoft.Composition.Demos.ExtendedCollectionImports +{ + /// + /// Used in conjunction with an ImportMany import, + /// specifies the metadata item associated with each value that will be used to + /// order the result. + /// + [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] + [MetadataAttribute] + public sealed class OrderedImportManyAttribute : ImportAttribute + { + private readonly string _metadataKey; + + private const string OrderByMetadataImportMetadataConstraintName = "OrderMetadataName"; + + /// + /// Construct a for the specified metadata name. + /// + /// The name of the metadata item to use to order the collection. + public OrderedImportManyAttribute(string orderMetadataName) + { + _metadataKey = orderMetadataName; + } + + /// + /// The name of the metadata item to use as the key of the dictionary. + /// + public string OrderMetadataName { get { return _metadataKey; } } + } +} diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Properties/AssemblyInfo.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..846ca3c6ca22 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Properties/AssemblyInfo.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] diff --git a/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Util/Formatters.cs b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Util/Formatters.cs new file mode 100644 index 000000000000..9850f5077197 --- /dev/null +++ b/src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Util/Formatters.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Composition.Demos.ExtendedCollectionImports.Util +{ + internal static class Formatters + { + public static string Format(object value) + { + if (value == null) + throw new ArgumentNullException("value"); + + if (value is string) + return "\"" + value + "\""; + + return value.ToString(); + } + + public static string ReadableQuotedList(IEnumerable items) + { + return ReadableList(items.Select(i => "'" + i + "'")); + } + + public static string ReadableList(IEnumerable items) + { + var itemArray = items.ToArray(); + if (itemArray.Length == 0) + return ""; + + if (itemArray.Length == 1) + return itemArray[0]; + + var ordered = itemArray.OrderByDescending(t => t).ToArray(); + var commaSeparated = ordered.Skip(1).Reverse(); + var last = ordered.First(); + return string.Join(", ", commaSeparated) + " and " + last; + } + } +} diff --git a/src/System.Composition/perftests/App.config b/src/System.Composition/perftests/App.config new file mode 100644 index 000000000000..713d642ad3b5 --- /dev/null +++ b/src/System.Composition/perftests/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/System.Composition/perftests/Benchmark.cs b/src/System.Composition/perftests/Benchmark.cs new file mode 100644 index 000000000000..6fcf3ef72ffc --- /dev/null +++ b/src/System.Composition/perftests/Benchmark.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal abstract class Benchmark + { + public abstract Action GetOperation(); + public abstract bool SelfTest(); + public virtual string Description { get { return GetType().Name.Replace("Benchmark", ""); } } + public virtual Version Version { get { return new Version(0, 0); } } + } +} diff --git a/src/System.Composition/perftests/ControlBenchmark.cs b/src/System.Composition/perftests/ControlBenchmark.cs new file mode 100644 index 000000000000..ca57d3d6f7cd --- /dev/null +++ b/src/System.Composition/perftests/ControlBenchmark.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal class ControlBenchmark : Benchmark + { + public override Action GetOperation() + { + return () => { }; + } + + public override string Description + { + get { return "Control (Empty)"; } + } + + public override bool SelfTest() + { + return true; + } + } +} diff --git a/src/System.Composition/perftests/FiftyPerSecondTestBenchmark.cs b/src/System.Composition/perftests/FiftyPerSecondTestBenchmark.cs new file mode 100644 index 000000000000..d849aad43591 --- /dev/null +++ b/src/System.Composition/perftests/FiftyPerSecondTestBenchmark.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal class FiftyPerSecondTestBenchmark : Benchmark + { + public override bool SelfTest() + { + return true; + } + + public override string Description + { + get + { + return "Timing test 50/s"; + } + } + + public override Action GetOperation() + { + return () => Thread.Sleep(1000 / 50); + } + } +} diff --git a/src/System.Composition/perftests/HugeGraph4Scenario.cs b/src/System.Composition/perftests/HugeGraph4Scenario.cs new file mode 100644 index 000000000000..79feb8a8360b --- /dev/null +++ b/src/System.Composition/perftests/HugeGraph4Scenario.cs @@ -0,0 +1,13277 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.IO; +using System.Composition; + +namespace CompositionThroughput.HugeGraph4 +{ + [Export] + public class TestClassA1 + { + [ImportingConstructor] + public TestClassA1(TestClassA2 testclassa2, TestClassA3 testclassa3, TestClassA4 testclassa4, TestClassA5 testclassa5, TestClassA6 testclassa6, TestClassA7 testclassa7, TestClassA8 testclassa8, TestClassA9 testclassa9, TestClassA10 testclassa10, TestClassA11 testclassa11, TestClassA12 testclassa12, TestClassA13 testclassa13) + { + } + } + [Export] + public class TestClassA2 + { + [ImportingConstructor] + public TestClassA2(TestClassA14 testclassa14, TestClassA15 testclassa15, TestClassA16 testclassa16, TestClassA17 testclassa17, TestClassA18 testclassa18, TestClassA19 testclassa19, TestClassA20 testclassa20, TestClassA21 testclassa21, TestClassA22 testclassa22, TestClassA23 testclassa23, TestClassA24 testclassa24, TestClassA25 testclassa25) + { + } + } + [Export] + public class TestClassA3 + { + [ImportingConstructor] + public TestClassA3(TestClassA26 testclassa26, TestClassA27 testclassa27, TestClassA28 testclassa28, TestClassA29 testclassa29, TestClassA30 testclassa30, TestClassA31 testclassa31, TestClassA32 testclassa32, TestClassA33 testclassa33, TestClassA34 testclassa34, TestClassA35 testclassa35, TestClassA36 testclassa36, TestClassA37 testclassa37) + { + } + } + [Export] + public class TestClassA4 + { + [ImportingConstructor] + public TestClassA4(TestClassA38 testclassa38, TestClassA39 testclassa39, TestClassA40 testclassa40, TestClassA41 testclassa41, TestClassA42 testclassa42, TestClassA43 testclassa43, TestClassA44 testclassa44, TestClassA45 testclassa45, TestClassA46 testclassa46, TestClassA47 testclassa47, TestClassA48 testclassa48, TestClassA49 testclassa49) + { + } + } + [Export] + public class TestClassA5 + { + [ImportingConstructor] + public TestClassA5(TestClassA50 testclassa50, TestClassA51 testclassa51, TestClassA52 testclassa52, TestClassA53 testclassa53, TestClassA54 testclassa54, TestClassA55 testclassa55, TestClassA56 testclassa56, TestClassA57 testclassa57, TestClassA58 testclassa58, TestClassA59 testclassa59, TestClassA60 testclassa60, TestClassA61 testclassa61) + { + } + } + [Export] + public class TestClassA6 + { + [ImportingConstructor] + public TestClassA6(TestClassA62 testclassa62, TestClassA63 testclassa63, TestClassA64 testclassa64, TestClassA65 testclassa65, TestClassA66 testclassa66, TestClassA67 testclassa67, TestClassA68 testclassa68, TestClassA69 testclassa69, TestClassA70 testclassa70, TestClassA71 testclassa71, TestClassA72 testclassa72, TestClassA73 testclassa73) + { + } + } + [Export] + public class TestClassA7 + { + [ImportingConstructor] + public TestClassA7(TestClassA74 testclassa74, TestClassA75 testclassa75, TestClassA76 testclassa76, TestClassA77 testclassa77, TestClassA78 testclassa78, TestClassA79 testclassa79, TestClassA80 testclassa80, TestClassA81 testclassa81, TestClassA82 testclassa82, TestClassA83 testclassa83, TestClassA84 testclassa84, TestClassA85 testclassa85) + { + } + } + [Export] + public class TestClassA8 + { + [ImportingConstructor] + public TestClassA8(TestClassA86 testclassa86, TestClassA87 testclassa87, TestClassA88 testclassa88, TestClassA89 testclassa89, TestClassA90 testclassa90, TestClassA91 testclassa91, TestClassA92 testclassa92, TestClassA93 testclassa93, TestClassA94 testclassa94, TestClassA95 testclassa95, TestClassA96 testclassa96, TestClassA97 testclassa97) + { + } + } + [Export] + public class TestClassA9 + { + [ImportingConstructor] + public TestClassA9(TestClassA98 testclassa98, TestClassA99 testclassa99, TestClassA100 testclassa100, TestClassA101 testclassa101, TestClassA102 testclassa102, TestClassA103 testclassa103, TestClassA104 testclassa104, TestClassA105 testclassa105, TestClassA106 testclassa106, TestClassA107 testclassa107, TestClassA108 testclassa108, TestClassA109 testclassa109) + { + } + } + [Export] + public class TestClassA10 + { + [ImportingConstructor] + public TestClassA10(TestClassA110 testclassa110, TestClassA111 testclassa111, TestClassA112 testclassa112, TestClassA113 testclassa113, TestClassA114 testclassa114, TestClassA115 testclassa115, TestClassA116 testclassa116, TestClassA117 testclassa117, TestClassA118 testclassa118, TestClassA119 testclassa119, TestClassA120 testclassa120, TestClassA121 testclassa121) + { + } + } + [Export] + public class TestClassA11 + { + [ImportingConstructor] + public TestClassA11(TestClassA122 testclassa122, TestClassA123 testclassa123, TestClassA124 testclassa124, TestClassA125 testclassa125, TestClassA126 testclassa126, TestClassA127 testclassa127, TestClassA128 testclassa128, TestClassA129 testclassa129, TestClassA130 testclassa130, TestClassA131 testclassa131, TestClassA132 testclassa132, TestClassA133 testclassa133) + { + } + } + [Export] + public class TestClassA12 + { + [ImportingConstructor] + public TestClassA12(TestClassA134 testclassa134, TestClassA135 testclassa135, TestClassA136 testclassa136, TestClassA137 testclassa137, TestClassA138 testclassa138, TestClassA139 testclassa139, TestClassA140 testclassa140, TestClassA141 testclassa141, TestClassA142 testclassa142, TestClassA143 testclassa143, TestClassA144 testclassa144, TestClassA145 testclassa145) + { + } + } + [Export] + public class TestClassA13 + { + [ImportingConstructor] + public TestClassA13(TestClassA146 testclassa146, TestClassA147 testclassa147, TestClassA148 testclassa148, TestClassA149 testclassa149, TestClassA150 testclassa150, TestClassA151 testclassa151, TestClassA152 testclassa152, TestClassA153 testclassa153, TestClassA154 testclassa154, TestClassA155 testclassa155, TestClassA156 testclassa156, TestClassA157 testclassa157) + { + } + } + [Export] + public class TestClassA14 + { + [ImportingConstructor] + public TestClassA14(TestClassA158 testclassa158, TestClassA159 testclassa159, TestClassA160 testclassa160, TestClassA161 testclassa161, TestClassA162 testclassa162, TestClassA163 testclassa163, TestClassA164 testclassa164, TestClassA165 testclassa165, TestClassA166 testclassa166, TestClassA167 testclassa167, TestClassA168 testclassa168, TestClassA169 testclassa169) + { + } + } + [Export] + public class TestClassA15 + { + [ImportingConstructor] + public TestClassA15(TestClassA170 testclassa170, TestClassA171 testclassa171, TestClassA172 testclassa172, TestClassA173 testclassa173, TestClassA174 testclassa174, TestClassA175 testclassa175, TestClassA176 testclassa176, TestClassA177 testclassa177, TestClassA178 testclassa178, TestClassA179 testclassa179, TestClassA180 testclassa180, TestClassA181 testclassa181) + { + } + } + [Export] + public class TestClassA16 + { + [ImportingConstructor] + public TestClassA16(TestClassA182 testclassa182, TestClassA183 testclassa183, TestClassA184 testclassa184, TestClassA185 testclassa185, TestClassA186 testclassa186, TestClassA187 testclassa187, TestClassA188 testclassa188, TestClassA189 testclassa189, TestClassA190 testclassa190, TestClassA191 testclassa191, TestClassA192 testclassa192, TestClassA193 testclassa193) + { + } + } + [Export] + public class TestClassA17 + { + [ImportingConstructor] + public TestClassA17(TestClassA194 testclassa194, TestClassA195 testclassa195, TestClassA196 testclassa196, TestClassA197 testclassa197, TestClassA198 testclassa198, TestClassA199 testclassa199, TestClassA200 testclassa200, TestClassA201 testclassa201, TestClassA202 testclassa202, TestClassA203 testclassa203, TestClassA204 testclassa204, TestClassA205 testclassa205) + { + } + } + [Export] + public class TestClassA18 + { + [ImportingConstructor] + public TestClassA18(TestClassA206 testclassa206, TestClassA207 testclassa207, TestClassA208 testclassa208, TestClassA209 testclassa209, TestClassA210 testclassa210, TestClassA211 testclassa211, TestClassA212 testclassa212, TestClassA213 testclassa213, TestClassA214 testclassa214, TestClassA215 testclassa215, TestClassA216 testclassa216, TestClassA217 testclassa217) + { + } + } + [Export] + public class TestClassA19 + { + [ImportingConstructor] + public TestClassA19(TestClassA218 testclassa218, TestClassA219 testclassa219, TestClassA220 testclassa220, TestClassA221 testclassa221, TestClassA222 testclassa222, TestClassA223 testclassa223, TestClassA224 testclassa224, TestClassA225 testclassa225, TestClassA226 testclassa226, TestClassA227 testclassa227, TestClassA228 testclassa228, TestClassA229 testclassa229) + { + } + } + [Export] + public class TestClassA20 + { + [ImportingConstructor] + public TestClassA20(TestClassA230 testclassa230, TestClassA231 testclassa231, TestClassA232 testclassa232, TestClassA233 testclassa233, TestClassA234 testclassa234, TestClassA235 testclassa235, TestClassA236 testclassa236, TestClassA237 testclassa237, TestClassA238 testclassa238, TestClassA239 testclassa239, TestClassA240 testclassa240, TestClassA241 testclassa241) + { + } + } + [Export] + public class TestClassA21 + { + [ImportingConstructor] + public TestClassA21(TestClassA242 testclassa242, TestClassA243 testclassa243, TestClassA244 testclassa244, TestClassA245 testclassa245, TestClassA246 testclassa246, TestClassA247 testclassa247, TestClassA248 testclassa248, TestClassA249 testclassa249, TestClassA250 testclassa250, TestClassA251 testclassa251, TestClassA252 testclassa252, TestClassA253 testclassa253) + { + } + } + [Export] + public class TestClassA22 + { + [ImportingConstructor] + public TestClassA22(TestClassA254 testclassa254, TestClassA255 testclassa255, TestClassA256 testclassa256, TestClassA257 testclassa257, TestClassA258 testclassa258, TestClassA259 testclassa259, TestClassA260 testclassa260, TestClassA261 testclassa261, TestClassA262 testclassa262, TestClassA263 testclassa263, TestClassA264 testclassa264, TestClassA265 testclassa265) + { + } + } + [Export] + public class TestClassA23 + { + [ImportingConstructor] + public TestClassA23(TestClassA266 testclassa266, TestClassA267 testclassa267, TestClassA268 testclassa268, TestClassA269 testclassa269, TestClassA270 testclassa270, TestClassA271 testclassa271, TestClassA272 testclassa272, TestClassA273 testclassa273, TestClassA274 testclassa274, TestClassA275 testclassa275, TestClassA276 testclassa276, TestClassA277 testclassa277) + { + } + } + [Export] + public class TestClassA24 + { + [ImportingConstructor] + public TestClassA24(TestClassA278 testclassa278, TestClassA279 testclassa279, TestClassA280 testclassa280, TestClassA281 testclassa281, TestClassA282 testclassa282, TestClassA283 testclassa283, TestClassA284 testclassa284, TestClassA285 testclassa285, TestClassA286 testclassa286, TestClassA287 testclassa287, TestClassA288 testclassa288, TestClassA289 testclassa289) + { + } + } + [Export] + public class TestClassA25 + { + [ImportingConstructor] + public TestClassA25(TestClassA290 testclassa290, TestClassA291 testclassa291, TestClassA292 testclassa292, TestClassA293 testclassa293, TestClassA294 testclassa294, TestClassA295 testclassa295, TestClassA296 testclassa296, TestClassA297 testclassa297, TestClassA298 testclassa298, TestClassA299 testclassa299, TestClassA300 testclassa300, TestClassA301 testclassa301) + { + } + } + [Export] + public class TestClassA26 + { + [ImportingConstructor] + public TestClassA26(TestClassA302 testclassa302, TestClassA303 testclassa303, TestClassA304 testclassa304, TestClassA305 testclassa305, TestClassA306 testclassa306, TestClassA307 testclassa307, TestClassA308 testclassa308, TestClassA309 testclassa309, TestClassA310 testclassa310, TestClassA311 testclassa311, TestClassA312 testclassa312, TestClassA313 testclassa313) + { + } + } + [Export] + public class TestClassA27 + { + [ImportingConstructor] + public TestClassA27(TestClassA314 testclassa314, TestClassA315 testclassa315, TestClassA316 testclassa316, TestClassA317 testclassa317, TestClassA318 testclassa318, TestClassA319 testclassa319, TestClassA320 testclassa320, TestClassA321 testclassa321, TestClassA322 testclassa322, TestClassA323 testclassa323, TestClassA324 testclassa324, TestClassA325 testclassa325) + { + } + } + [Export] + public class TestClassA28 + { + [ImportingConstructor] + public TestClassA28(TestClassA326 testclassa326, TestClassA327 testclassa327, TestClassA328 testclassa328, TestClassA329 testclassa329, TestClassA330 testclassa330, TestClassA331 testclassa331, TestClassA332 testclassa332, TestClassA333 testclassa333, TestClassA334 testclassa334, TestClassA335 testclassa335, TestClassA336 testclassa336, TestClassA337 testclassa337) + { + } + } + [Export] + public class TestClassA29 + { + [ImportingConstructor] + public TestClassA29(TestClassA338 testclassa338, TestClassA339 testclassa339, TestClassA340 testclassa340, TestClassA341 testclassa341, TestClassA342 testclassa342, TestClassA343 testclassa343, TestClassA344 testclassa344, TestClassA345 testclassa345, TestClassA346 testclassa346, TestClassA347 testclassa347, TestClassA348 testclassa348, TestClassA349 testclassa349) + { + } + } + [Export] + public class TestClassA30 + { + [ImportingConstructor] + public TestClassA30(TestClassA350 testclassa350, TestClassA351 testclassa351, TestClassA352 testclassa352, TestClassA353 testclassa353, TestClassA354 testclassa354, TestClassA355 testclassa355, TestClassA356 testclassa356, TestClassA357 testclassa357, TestClassA358 testclassa358, TestClassA359 testclassa359, TestClassA360 testclassa360, TestClassA361 testclassa361) + { + } + } + [Export] + public class TestClassA31 + { + [ImportingConstructor] + public TestClassA31(TestClassA362 testclassa362, TestClassA363 testclassa363, TestClassA364 testclassa364, TestClassA365 testclassa365, TestClassA366 testclassa366, TestClassA367 testclassa367, TestClassA368 testclassa368, TestClassA369 testclassa369, TestClassA370 testclassa370, TestClassA371 testclassa371, TestClassA372 testclassa372, TestClassA373 testclassa373) + { + } + } + [Export] + public class TestClassA32 + { + [ImportingConstructor] + public TestClassA32(TestClassA374 testclassa374, TestClassA375 testclassa375, TestClassA376 testclassa376, TestClassA377 testclassa377, TestClassA378 testclassa378, TestClassA379 testclassa379, TestClassA380 testclassa380, TestClassA381 testclassa381, TestClassA382 testclassa382, TestClassA383 testclassa383, TestClassA384 testclassa384, TestClassA385 testclassa385) + { + } + } + [Export] + public class TestClassA33 + { + [ImportingConstructor] + public TestClassA33(TestClassA386 testclassa386, TestClassA387 testclassa387, TestClassA388 testclassa388, TestClassA389 testclassa389, TestClassA390 testclassa390, TestClassA391 testclassa391, TestClassA392 testclassa392, TestClassA393 testclassa393, TestClassA394 testclassa394, TestClassA395 testclassa395, TestClassA396 testclassa396, TestClassA397 testclassa397) + { + } + } + [Export] + public class TestClassA34 + { + [ImportingConstructor] + public TestClassA34(TestClassA398 testclassa398, TestClassA399 testclassa399, TestClassA400 testclassa400, TestClassA401 testclassa401, TestClassA402 testclassa402, TestClassA403 testclassa403, TestClassA404 testclassa404, TestClassA405 testclassa405, TestClassA406 testclassa406, TestClassA407 testclassa407, TestClassA408 testclassa408, TestClassA409 testclassa409) + { + } + } + [Export] + public class TestClassA35 + { + [ImportingConstructor] + public TestClassA35(TestClassA410 testclassa410, TestClassA411 testclassa411, TestClassA412 testclassa412, TestClassA413 testclassa413, TestClassA414 testclassa414, TestClassA415 testclassa415, TestClassA416 testclassa416, TestClassA417 testclassa417, TestClassA418 testclassa418, TestClassA419 testclassa419, TestClassA420 testclassa420, TestClassA421 testclassa421) + { + } + } + [Export] + public class TestClassA36 + { + [ImportingConstructor] + public TestClassA36(TestClassA422 testclassa422, TestClassA423 testclassa423, TestClassA424 testclassa424, TestClassA425 testclassa425, TestClassA426 testclassa426, TestClassA427 testclassa427, TestClassA428 testclassa428, TestClassA429 testclassa429, TestClassA430 testclassa430, TestClassA431 testclassa431, TestClassA432 testclassa432, TestClassA433 testclassa433) + { + } + } + [Export] + public class TestClassA37 + { + [ImportingConstructor] + public TestClassA37(TestClassA434 testclassa434, TestClassA435 testclassa435, TestClassA436 testclassa436, TestClassA437 testclassa437, TestClassA438 testclassa438, TestClassA439 testclassa439, TestClassA440 testclassa440, TestClassA441 testclassa441, TestClassA442 testclassa442, TestClassA443 testclassa443, TestClassA444 testclassa444, TestClassA445 testclassa445) + { + } + } + [Export] + public class TestClassA38 + { + [ImportingConstructor] + public TestClassA38(TestClassA446 testclassa446, TestClassA447 testclassa447, TestClassA448 testclassa448, TestClassA449 testclassa449, TestClassA450 testclassa450, TestClassA451 testclassa451, TestClassA452 testclassa452, TestClassA453 testclassa453, TestClassA454 testclassa454, TestClassA455 testclassa455, TestClassA456 testclassa456, TestClassA457 testclassa457) + { + } + } + [Export] + public class TestClassA39 + { + [ImportingConstructor] + public TestClassA39(TestClassA458 testclassa458, TestClassA459 testclassa459, TestClassA460 testclassa460, TestClassA461 testclassa461, TestClassA462 testclassa462, TestClassA463 testclassa463, TestClassA464 testclassa464, TestClassA465 testclassa465, TestClassA466 testclassa466, TestClassA467 testclassa467, TestClassA468 testclassa468, TestClassA469 testclassa469) + { + } + } + [Export] + public class TestClassA40 + { + [ImportingConstructor] + public TestClassA40(TestClassA470 testclassa470, TestClassA471 testclassa471, TestClassA472 testclassa472, TestClassA473 testclassa473, TestClassA474 testclassa474, TestClassA475 testclassa475, TestClassA476 testclassa476, TestClassA477 testclassa477, TestClassA478 testclassa478, TestClassA479 testclassa479, TestClassA480 testclassa480, TestClassA481 testclassa481) + { + } + } + [Export] + public class TestClassA41 + { + [ImportingConstructor] + public TestClassA41(TestClassA482 testclassa482, TestClassA483 testclassa483, TestClassA484 testclassa484, TestClassA485 testclassa485, TestClassA486 testclassa486, TestClassA487 testclassa487, TestClassA488 testclassa488, TestClassA489 testclassa489, TestClassA490 testclassa490, TestClassA491 testclassa491, TestClassA492 testclassa492, TestClassA493 testclassa493) + { + } + } + [Export] + public class TestClassA42 + { + [ImportingConstructor] + public TestClassA42(TestClassA494 testclassa494, TestClassA495 testclassa495, TestClassA496 testclassa496, TestClassA497 testclassa497, TestClassA498 testclassa498, TestClassA499 testclassa499, TestClassA500 testclassa500, TestClassA501 testclassa501, TestClassA502 testclassa502, TestClassA503 testclassa503, TestClassA504 testclassa504, TestClassA505 testclassa505) + { + } + } + [Export] + public class TestClassA43 + { + [ImportingConstructor] + public TestClassA43(TestClassA506 testclassa506, TestClassA507 testclassa507, TestClassA508 testclassa508, TestClassA509 testclassa509, TestClassA510 testclassa510, TestClassA511 testclassa511, TestClassA512 testclassa512, TestClassA513 testclassa513, TestClassA514 testclassa514, TestClassA515 testclassa515, TestClassA516 testclassa516, TestClassA517 testclassa517) + { + } + } + [Export] + public class TestClassA44 + { + [ImportingConstructor] + public TestClassA44(TestClassA518 testclassa518, TestClassA519 testclassa519, TestClassA520 testclassa520, TestClassA521 testclassa521, TestClassA522 testclassa522, TestClassA523 testclassa523, TestClassA524 testclassa524, TestClassA525 testclassa525, TestClassA526 testclassa526, TestClassA527 testclassa527, TestClassA528 testclassa528, TestClassA529 testclassa529) + { + } + } + [Export] + public class TestClassA45 + { + [ImportingConstructor] + public TestClassA45(TestClassA530 testclassa530, TestClassA531 testclassa531, TestClassA532 testclassa532, TestClassA533 testclassa533, TestClassA534 testclassa534, TestClassA535 testclassa535, TestClassA536 testclassa536, TestClassA537 testclassa537, TestClassA538 testclassa538, TestClassA539 testclassa539, TestClassA540 testclassa540, TestClassA541 testclassa541) + { + } + } + [Export] + public class TestClassA46 + { + [ImportingConstructor] + public TestClassA46(TestClassA542 testclassa542, TestClassA543 testclassa543, TestClassA544 testclassa544, TestClassA545 testclassa545, TestClassA546 testclassa546, TestClassA547 testclassa547, TestClassA548 testclassa548, TestClassA549 testclassa549, TestClassA550 testclassa550, TestClassA551 testclassa551, TestClassA552 testclassa552, TestClassA553 testclassa553) + { + } + } + [Export] + public class TestClassA47 + { + [ImportingConstructor] + public TestClassA47(TestClassA554 testclassa554, TestClassA555 testclassa555, TestClassA556 testclassa556, TestClassA557 testclassa557, TestClassA558 testclassa558, TestClassA559 testclassa559, TestClassA560 testclassa560, TestClassA561 testclassa561, TestClassA562 testclassa562, TestClassA563 testclassa563, TestClassA564 testclassa564, TestClassA565 testclassa565) + { + } + } + [Export] + public class TestClassA48 + { + [ImportingConstructor] + public TestClassA48(TestClassA566 testclassa566, TestClassA567 testclassa567, TestClassA568 testclassa568, TestClassA569 testclassa569, TestClassA570 testclassa570, TestClassA571 testclassa571, TestClassA572 testclassa572, TestClassA573 testclassa573, TestClassA574 testclassa574, TestClassA575 testclassa575, TestClassA576 testclassa576, TestClassA577 testclassa577) + { + } + } + [Export] + public class TestClassA49 + { + [ImportingConstructor] + public TestClassA49(TestClassA578 testclassa578, TestClassA579 testclassa579, TestClassA580 testclassa580, TestClassA581 testclassa581, TestClassA582 testclassa582, TestClassA583 testclassa583, TestClassA584 testclassa584, TestClassA585 testclassa585, TestClassA586 testclassa586, TestClassA587 testclassa587, TestClassA588 testclassa588, TestClassA589 testclassa589) + { + } + } + [Export] + public class TestClassA50 + { + [ImportingConstructor] + public TestClassA50(TestClassA590 testclassa590, TestClassA591 testclassa591, TestClassA592 testclassa592, TestClassA593 testclassa593, TestClassA594 testclassa594, TestClassA595 testclassa595, TestClassA596 testclassa596, TestClassA597 testclassa597, TestClassA598 testclassa598, TestClassA599 testclassa599, TestClassA600 testclassa600, TestClassA601 testclassa601) + { + } + } + [Export] + public class TestClassA51 + { + [ImportingConstructor] + public TestClassA51(TestClassA602 testclassa602, TestClassA603 testclassa603, TestClassA604 testclassa604, TestClassA605 testclassa605, TestClassA606 testclassa606, TestClassA607 testclassa607, TestClassA608 testclassa608, TestClassA609 testclassa609, TestClassA610 testclassa610, TestClassA611 testclassa611, TestClassA612 testclassa612, TestClassA613 testclassa613) + { + } + } + [Export] + public class TestClassA52 + { + [ImportingConstructor] + public TestClassA52(TestClassA614 testclassa614, TestClassA615 testclassa615, TestClassA616 testclassa616, TestClassA617 testclassa617, TestClassA618 testclassa618, TestClassA619 testclassa619, TestClassA620 testclassa620, TestClassA621 testclassa621, TestClassA622 testclassa622, TestClassA623 testclassa623, TestClassA624 testclassa624, TestClassA625 testclassa625) + { + } + } + [Export] + public class TestClassA53 + { + [ImportingConstructor] + public TestClassA53(TestClassA626 testclassa626, TestClassA627 testclassa627, TestClassA628 testclassa628, TestClassA629 testclassa629, TestClassA630 testclassa630, TestClassA631 testclassa631, TestClassA632 testclassa632, TestClassA633 testclassa633, TestClassA634 testclassa634, TestClassA635 testclassa635, TestClassA636 testclassa636, TestClassA637 testclassa637) + { + } + } + [Export] + public class TestClassA54 + { + [ImportingConstructor] + public TestClassA54(TestClassA638 testclassa638, TestClassA639 testclassa639, TestClassA640 testclassa640, TestClassA641 testclassa641, TestClassA642 testclassa642, TestClassA643 testclassa643, TestClassA644 testclassa644, TestClassA645 testclassa645, TestClassA646 testclassa646, TestClassA647 testclassa647, TestClassA648 testclassa648, TestClassA649 testclassa649) + { + } + } + [Export] + public class TestClassA55 + { + [ImportingConstructor] + public TestClassA55(TestClassA650 testclassa650, TestClassA651 testclassa651, TestClassA652 testclassa652, TestClassA653 testclassa653, TestClassA654 testclassa654, TestClassA655 testclassa655, TestClassA656 testclassa656, TestClassA657 testclassa657, TestClassA658 testclassa658, TestClassA659 testclassa659, TestClassA660 testclassa660, TestClassA661 testclassa661) + { + } + } + [Export] + public class TestClassA56 + { + [ImportingConstructor] + public TestClassA56(TestClassA662 testclassa662, TestClassA663 testclassa663, TestClassA664 testclassa664, TestClassA665 testclassa665, TestClassA666 testclassa666, TestClassA667 testclassa667, TestClassA668 testclassa668, TestClassA669 testclassa669, TestClassA670 testclassa670, TestClassA671 testclassa671, TestClassA672 testclassa672, TestClassA673 testclassa673) + { + } + } + [Export] + public class TestClassA57 + { + [ImportingConstructor] + public TestClassA57(TestClassA674 testclassa674, TestClassA675 testclassa675, TestClassA676 testclassa676, TestClassA677 testclassa677, TestClassA678 testclassa678, TestClassA679 testclassa679, TestClassA680 testclassa680, TestClassA681 testclassa681, TestClassA682 testclassa682, TestClassA683 testclassa683, TestClassA684 testclassa684, TestClassA685 testclassa685) + { + } + } + [Export] + public class TestClassA58 + { + [ImportingConstructor] + public TestClassA58(TestClassA686 testclassa686, TestClassA687 testclassa687, TestClassA688 testclassa688, TestClassA689 testclassa689, TestClassA690 testclassa690, TestClassA691 testclassa691, TestClassA692 testclassa692, TestClassA693 testclassa693, TestClassA694 testclassa694, TestClassA695 testclassa695, TestClassA696 testclassa696, TestClassA697 testclassa697) + { + } + } + [Export] + public class TestClassA59 + { + [ImportingConstructor] + public TestClassA59(TestClassA698 testclassa698, TestClassA699 testclassa699, TestClassA700 testclassa700, TestClassA701 testclassa701, TestClassA702 testclassa702, TestClassA703 testclassa703, TestClassA704 testclassa704, TestClassA705 testclassa705, TestClassA706 testclassa706, TestClassA707 testclassa707, TestClassA708 testclassa708, TestClassA709 testclassa709) + { + } + } + [Export] + public class TestClassA60 + { + [ImportingConstructor] + public TestClassA60(TestClassA710 testclassa710, TestClassA711 testclassa711, TestClassA712 testclassa712, TestClassA713 testclassa713, TestClassA714 testclassa714, TestClassA715 testclassa715, TestClassA716 testclassa716, TestClassA717 testclassa717, TestClassA718 testclassa718, TestClassA719 testclassa719, TestClassA720 testclassa720, TestClassA721 testclassa721) + { + } + } + [Export] + public class TestClassA61 + { + [ImportingConstructor] + public TestClassA61(TestClassA722 testclassa722, TestClassA723 testclassa723, TestClassA724 testclassa724, TestClassA725 testclassa725, TestClassA726 testclassa726, TestClassA727 testclassa727, TestClassA728 testclassa728, TestClassA729 testclassa729, TestClassA730 testclassa730, TestClassA731 testclassa731, TestClassA732 testclassa732, TestClassA733 testclassa733) + { + } + } + [Export] + public class TestClassA62 + { + [ImportingConstructor] + public TestClassA62(TestClassA734 testclassa734, TestClassA735 testclassa735, TestClassA736 testclassa736, TestClassA737 testclassa737, TestClassA738 testclassa738, TestClassA739 testclassa739, TestClassA740 testclassa740, TestClassA741 testclassa741, TestClassA742 testclassa742, TestClassA743 testclassa743, TestClassA744 testclassa744, TestClassA745 testclassa745) + { + } + } + [Export] + public class TestClassA63 + { + [ImportingConstructor] + public TestClassA63(TestClassA746 testclassa746, TestClassA747 testclassa747, TestClassA748 testclassa748, TestClassA749 testclassa749, TestClassA750 testclassa750, TestClassA751 testclassa751, TestClassA752 testclassa752, TestClassA753 testclassa753, TestClassA754 testclassa754, TestClassA755 testclassa755, TestClassA756 testclassa756, TestClassA757 testclassa757) + { + } + } + [Export] + public class TestClassA64 + { + [ImportingConstructor] + public TestClassA64(TestClassA758 testclassa758, TestClassA759 testclassa759, TestClassA760 testclassa760, TestClassA761 testclassa761, TestClassA762 testclassa762, TestClassA763 testclassa763, TestClassA764 testclassa764, TestClassA765 testclassa765, TestClassA766 testclassa766, TestClassA767 testclassa767, TestClassA768 testclassa768, TestClassA769 testclassa769) + { + } + } + [Export] + public class TestClassA65 + { + [ImportingConstructor] + public TestClassA65(TestClassA770 testclassa770, TestClassA771 testclassa771, TestClassA772 testclassa772, TestClassA773 testclassa773, TestClassA774 testclassa774, TestClassA775 testclassa775, TestClassA776 testclassa776, TestClassA777 testclassa777, TestClassA778 testclassa778, TestClassA779 testclassa779, TestClassA780 testclassa780, TestClassA781 testclassa781) + { + } + } + [Export] + public class TestClassA66 + { + [ImportingConstructor] + public TestClassA66(TestClassA782 testclassa782, TestClassA783 testclassa783, TestClassA784 testclassa784, TestClassA785 testclassa785, TestClassA786 testclassa786, TestClassA787 testclassa787, TestClassA788 testclassa788, TestClassA789 testclassa789, TestClassA790 testclassa790, TestClassA791 testclassa791, TestClassA792 testclassa792, TestClassA793 testclassa793) + { + } + } + [Export] + public class TestClassA67 + { + [ImportingConstructor] + public TestClassA67(TestClassA794 testclassa794, TestClassA795 testclassa795, TestClassA796 testclassa796, TestClassA797 testclassa797, TestClassA798 testclassa798, TestClassA799 testclassa799, TestClassA800 testclassa800, TestClassA801 testclassa801, TestClassA802 testclassa802, TestClassA803 testclassa803, TestClassA804 testclassa804, TestClassA805 testclassa805) + { + } + } + [Export] + public class TestClassA68 + { + [ImportingConstructor] + public TestClassA68(TestClassA806 testclassa806, TestClassA807 testclassa807, TestClassA808 testclassa808, TestClassA809 testclassa809, TestClassA810 testclassa810, TestClassA811 testclassa811, TestClassA812 testclassa812, TestClassA813 testclassa813, TestClassA814 testclassa814, TestClassA815 testclassa815, TestClassA816 testclassa816, TestClassA817 testclassa817) + { + } + } + [Export] + public class TestClassA69 + { + [ImportingConstructor] + public TestClassA69(TestClassA818 testclassa818, TestClassA819 testclassa819, TestClassA820 testclassa820, TestClassA821 testclassa821, TestClassA822 testclassa822, TestClassA823 testclassa823, TestClassA824 testclassa824, TestClassA825 testclassa825, TestClassA826 testclassa826, TestClassA827 testclassa827, TestClassA828 testclassa828, TestClassA829 testclassa829) + { + } + } + [Export] + public class TestClassA70 + { + [ImportingConstructor] + public TestClassA70(TestClassA830 testclassa830, TestClassA831 testclassa831, TestClassA832 testclassa832, TestClassA833 testclassa833, TestClassA834 testclassa834, TestClassA835 testclassa835, TestClassA836 testclassa836, TestClassA837 testclassa837, TestClassA838 testclassa838, TestClassA839 testclassa839, TestClassA840 testclassa840, TestClassA841 testclassa841) + { + } + } + [Export] + public class TestClassA71 + { + [ImportingConstructor] + public TestClassA71(TestClassA842 testclassa842, TestClassA843 testclassa843, TestClassA844 testclassa844, TestClassA845 testclassa845, TestClassA846 testclassa846, TestClassA847 testclassa847, TestClassA848 testclassa848, TestClassA849 testclassa849, TestClassA850 testclassa850, TestClassA851 testclassa851, TestClassA852 testclassa852, TestClassA853 testclassa853) + { + } + } + [Export] + public class TestClassA72 + { + [ImportingConstructor] + public TestClassA72(TestClassA854 testclassa854, TestClassA855 testclassa855, TestClassA856 testclassa856, TestClassA857 testclassa857, TestClassA858 testclassa858, TestClassA859 testclassa859, TestClassA860 testclassa860, TestClassA861 testclassa861, TestClassA862 testclassa862, TestClassA863 testclassa863, TestClassA864 testclassa864, TestClassA865 testclassa865) + { + } + } + [Export] + public class TestClassA73 + { + [ImportingConstructor] + public TestClassA73(TestClassA866 testclassa866, TestClassA867 testclassa867, TestClassA868 testclassa868, TestClassA869 testclassa869, TestClassA870 testclassa870, TestClassA871 testclassa871, TestClassA872 testclassa872, TestClassA873 testclassa873, TestClassA874 testclassa874, TestClassA875 testclassa875, TestClassA876 testclassa876, TestClassA877 testclassa877) + { + } + } + [Export] + public class TestClassA74 + { + [ImportingConstructor] + public TestClassA74(TestClassA878 testclassa878, TestClassA879 testclassa879, TestClassA880 testclassa880, TestClassA881 testclassa881, TestClassA882 testclassa882, TestClassA883 testclassa883, TestClassA884 testclassa884, TestClassA885 testclassa885, TestClassA886 testclassa886, TestClassA887 testclassa887, TestClassA888 testclassa888, TestClassA889 testclassa889) + { + } + } + [Export] + public class TestClassA75 + { + [ImportingConstructor] + public TestClassA75(TestClassA890 testclassa890, TestClassA891 testclassa891, TestClassA892 testclassa892, TestClassA893 testclassa893, TestClassA894 testclassa894, TestClassA895 testclassa895, TestClassA896 testclassa896, TestClassA897 testclassa897, TestClassA898 testclassa898, TestClassA899 testclassa899, TestClassA900 testclassa900, TestClassA901 testclassa901) + { + } + } + [Export] + public class TestClassA76 + { + [ImportingConstructor] + public TestClassA76(TestClassA902 testclassa902, TestClassA903 testclassa903, TestClassA904 testclassa904, TestClassA905 testclassa905, TestClassA906 testclassa906, TestClassA907 testclassa907, TestClassA908 testclassa908, TestClassA909 testclassa909, TestClassA910 testclassa910, TestClassA911 testclassa911, TestClassA912 testclassa912, TestClassA913 testclassa913) + { + } + } + [Export] + public class TestClassA77 + { + [ImportingConstructor] + public TestClassA77(TestClassA914 testclassa914, TestClassA915 testclassa915, TestClassA916 testclassa916, TestClassA917 testclassa917, TestClassA918 testclassa918, TestClassA919 testclassa919, TestClassA920 testclassa920, TestClassA921 testclassa921, TestClassA922 testclassa922, TestClassA923 testclassa923, TestClassA924 testclassa924, TestClassA925 testclassa925) + { + } + } + [Export] + public class TestClassA78 + { + [ImportingConstructor] + public TestClassA78(TestClassA926 testclassa926, TestClassA927 testclassa927, TestClassA928 testclassa928, TestClassA929 testclassa929, TestClassA930 testclassa930, TestClassA931 testclassa931, TestClassA932 testclassa932, TestClassA933 testclassa933, TestClassA934 testclassa934, TestClassA935 testclassa935, TestClassA936 testclassa936, TestClassA937 testclassa937) + { + } + } + [Export] + public class TestClassA79 + { + [ImportingConstructor] + public TestClassA79(TestClassA938 testclassa938, TestClassA939 testclassa939, TestClassA940 testclassa940, TestClassA941 testclassa941, TestClassA942 testclassa942, TestClassA943 testclassa943, TestClassA944 testclassa944, TestClassA945 testclassa945, TestClassA946 testclassa946, TestClassA947 testclassa947, TestClassA948 testclassa948, TestClassA949 testclassa949) + { + } + } + [Export] + public class TestClassA80 + { + [ImportingConstructor] + public TestClassA80(TestClassA950 testclassa950, TestClassA951 testclassa951, TestClassA952 testclassa952, TestClassA953 testclassa953, TestClassA954 testclassa954, TestClassA955 testclassa955, TestClassA956 testclassa956, TestClassA957 testclassa957, TestClassA958 testclassa958, TestClassA959 testclassa959, TestClassA960 testclassa960, TestClassA961 testclassa961) + { + } + } + [Export] + public class TestClassA81 + { + [ImportingConstructor] + public TestClassA81(TestClassA962 testclassa962, TestClassA963 testclassa963, TestClassA964 testclassa964, TestClassA965 testclassa965, TestClassA966 testclassa966, TestClassA967 testclassa967, TestClassA968 testclassa968, TestClassA969 testclassa969, TestClassA970 testclassa970, TestClassA971 testclassa971, TestClassA972 testclassa972, TestClassA973 testclassa973) + { + } + } + [Export] + public class TestClassA82 + { + [ImportingConstructor] + public TestClassA82(TestClassA974 testclassa974, TestClassA975 testclassa975, TestClassA976 testclassa976, TestClassA977 testclassa977, TestClassA978 testclassa978, TestClassA979 testclassa979, TestClassA980 testclassa980, TestClassA981 testclassa981, TestClassA982 testclassa982, TestClassA983 testclassa983, TestClassA984 testclassa984, TestClassA985 testclassa985) + { + } + } + [Export] + public class TestClassA83 + { + [ImportingConstructor] + public TestClassA83(TestClassA986 testclassa986, TestClassA987 testclassa987, TestClassA988 testclassa988, TestClassA989 testclassa989, TestClassA990 testclassa990, TestClassA991 testclassa991, TestClassA992 testclassa992, TestClassA993 testclassa993, TestClassA994 testclassa994, TestClassA995 testclassa995, TestClassA996 testclassa996, TestClassA997 testclassa997) + { + } + } + [Export] + public class TestClassA84 + { + [ImportingConstructor] + public TestClassA84(TestClassA998 testclassa998, TestClassA999 testclassa999, TestClassA1000 testclassa1000, TestClassA1001 testclassa1001, TestClassA1002 testclassa1002, TestClassA1003 testclassa1003, TestClassA1004 testclassa1004, TestClassA1005 testclassa1005, TestClassA1006 testclassa1006, TestClassA1007 testclassa1007, TestClassA1008 testclassa1008, TestClassA1009 testclassa1009) + { + } + } + [Export] + public class TestClassA85 + { + [ImportingConstructor] + public TestClassA85(TestClassA1010 testclassa1010, TestClassA1011 testclassa1011, TestClassA1012 testclassa1012, TestClassA1013 testclassa1013, TestClassA1014 testclassa1014, TestClassA1015 testclassa1015, TestClassA1016 testclassa1016, TestClassA1017 testclassa1017, TestClassA1018 testclassa1018, TestClassA1019 testclassa1019, TestClassA1020 testclassa1020, TestClassA1021 testclassa1021) + { + } + } + [Export] + public class TestClassA86 + { + [ImportingConstructor] + public TestClassA86(TestClassA1022 testclassa1022, TestClassA1023 testclassa1023, TestClassA1024 testclassa1024, TestClassA1025 testclassa1025, TestClassA1026 testclassa1026, TestClassA1027 testclassa1027, TestClassA1028 testclassa1028, TestClassA1029 testclassa1029, TestClassA1030 testclassa1030, TestClassA1031 testclassa1031, TestClassA1032 testclassa1032, TestClassA1033 testclassa1033) + { + } + } + [Export] + public class TestClassA87 + { + [ImportingConstructor] + public TestClassA87(TestClassA1034 testclassa1034, TestClassA1035 testclassa1035, TestClassA1036 testclassa1036, TestClassA1037 testclassa1037, TestClassA1038 testclassa1038, TestClassA1039 testclassa1039, TestClassA1040 testclassa1040, TestClassA1041 testclassa1041, TestClassA1042 testclassa1042, TestClassA1043 testclassa1043, TestClassA1044 testclassa1044, TestClassA1045 testclassa1045) + { + } + } + [Export] + public class TestClassA88 + { + [ImportingConstructor] + public TestClassA88(TestClassA1046 testclassa1046, TestClassA1047 testclassa1047, TestClassA1048 testclassa1048, TestClassA1049 testclassa1049, TestClassA1050 testclassa1050, TestClassA1051 testclassa1051, TestClassA1052 testclassa1052, TestClassA1053 testclassa1053, TestClassA1054 testclassa1054, TestClassA1055 testclassa1055, TestClassA1056 testclassa1056, TestClassA1057 testclassa1057) + { + } + } + [Export] + public class TestClassA89 + { + [ImportingConstructor] + public TestClassA89(TestClassA1058 testclassa1058, TestClassA1059 testclassa1059, TestClassA1060 testclassa1060, TestClassA1061 testclassa1061, TestClassA1062 testclassa1062, TestClassA1063 testclassa1063, TestClassA1064 testclassa1064, TestClassA1065 testclassa1065, TestClassA1066 testclassa1066, TestClassA1067 testclassa1067, TestClassA1068 testclassa1068, TestClassA1069 testclassa1069) + { + } + } + [Export] + public class TestClassA90 + { + [ImportingConstructor] + public TestClassA90(TestClassA1070 testclassa1070, TestClassA1071 testclassa1071, TestClassA1072 testclassa1072, TestClassA1073 testclassa1073, TestClassA1074 testclassa1074, TestClassA1075 testclassa1075, TestClassA1076 testclassa1076, TestClassA1077 testclassa1077, TestClassA1078 testclassa1078, TestClassA1079 testclassa1079, TestClassA1080 testclassa1080, TestClassA1081 testclassa1081) + { + } + } + [Export] + public class TestClassA91 + { + [ImportingConstructor] + public TestClassA91(TestClassA1082 testclassa1082, TestClassA1083 testclassa1083, TestClassA1084 testclassa1084, TestClassA1085 testclassa1085, TestClassA1086 testclassa1086, TestClassA1087 testclassa1087, TestClassA1088 testclassa1088, TestClassA1089 testclassa1089, TestClassA1090 testclassa1090, TestClassA1091 testclassa1091, TestClassA1092 testclassa1092, TestClassA1093 testclassa1093) + { + } + } + [Export] + public class TestClassA92 + { + [ImportingConstructor] + public TestClassA92(TestClassA1094 testclassa1094, TestClassA1095 testclassa1095, TestClassA1096 testclassa1096, TestClassA1097 testclassa1097, TestClassA1098 testclassa1098, TestClassA1099 testclassa1099, TestClassA1100 testclassa1100, TestClassA1101 testclassa1101, TestClassA1102 testclassa1102, TestClassA1103 testclassa1103, TestClassA1104 testclassa1104, TestClassA1105 testclassa1105) + { + } + } + [Export] + public class TestClassA93 + { + [ImportingConstructor] + public TestClassA93(TestClassA1106 testclassa1106, TestClassA1107 testclassa1107, TestClassA1108 testclassa1108, TestClassA1109 testclassa1109, TestClassA1110 testclassa1110, TestClassA1111 testclassa1111, TestClassA1112 testclassa1112, TestClassA1113 testclassa1113, TestClassA1114 testclassa1114, TestClassA1115 testclassa1115, TestClassA1116 testclassa1116, TestClassA1117 testclassa1117) + { + } + } + [Export] + public class TestClassA94 + { + [ImportingConstructor] + public TestClassA94(TestClassA1118 testclassa1118, TestClassA1119 testclassa1119, TestClassA1120 testclassa1120, TestClassA1121 testclassa1121, TestClassA1122 testclassa1122, TestClassA1123 testclassa1123, TestClassA1124 testclassa1124, TestClassA1125 testclassa1125, TestClassA1126 testclassa1126, TestClassA1127 testclassa1127, TestClassA1128 testclassa1128, TestClassA1129 testclassa1129) + { + } + } + [Export] + public class TestClassA95 + { + [ImportingConstructor] + public TestClassA95(TestClassA1130 testclassa1130, TestClassA1131 testclassa1131, TestClassA1132 testclassa1132, TestClassA1133 testclassa1133, TestClassA1134 testclassa1134, TestClassA1135 testclassa1135, TestClassA1136 testclassa1136, TestClassA1137 testclassa1137, TestClassA1138 testclassa1138, TestClassA1139 testclassa1139, TestClassA1140 testclassa1140, TestClassA1141 testclassa1141) + { + } + } + [Export] + public class TestClassA96 + { + [ImportingConstructor] + public TestClassA96(TestClassA1142 testclassa1142, TestClassA1143 testclassa1143, TestClassA1144 testclassa1144, TestClassA1145 testclassa1145, TestClassA1146 testclassa1146, TestClassA1147 testclassa1147, TestClassA1148 testclassa1148, TestClassA1149 testclassa1149, TestClassA1150 testclassa1150, TestClassA1151 testclassa1151, TestClassA1152 testclassa1152, TestClassA1153 testclassa1153) + { + } + } + [Export] + public class TestClassA97 + { + [ImportingConstructor] + public TestClassA97(TestClassA1154 testclassa1154, TestClassA1155 testclassa1155, TestClassA1156 testclassa1156, TestClassA1157 testclassa1157, TestClassA1158 testclassa1158, TestClassA1159 testclassa1159, TestClassA1160 testclassa1160, TestClassA1161 testclassa1161, TestClassA1162 testclassa1162, TestClassA1163 testclassa1163, TestClassA1164 testclassa1164, TestClassA1165 testclassa1165) + { + } + } + [Export] + public class TestClassA98 + { + [ImportingConstructor] + public TestClassA98(TestClassA1166 testclassa1166, TestClassA1167 testclassa1167, TestClassA1168 testclassa1168, TestClassA1169 testclassa1169, TestClassA1170 testclassa1170, TestClassA1171 testclassa1171, TestClassA1172 testclassa1172, TestClassA1173 testclassa1173, TestClassA1174 testclassa1174, TestClassA1175 testclassa1175, TestClassA1176 testclassa1176, TestClassA1177 testclassa1177) + { + } + } + [Export] + public class TestClassA99 + { + [ImportingConstructor] + public TestClassA99(TestClassA1178 testclassa1178, TestClassA1179 testclassa1179, TestClassA1180 testclassa1180, TestClassA1181 testclassa1181, TestClassA1182 testclassa1182, TestClassA1183 testclassa1183, TestClassA1184 testclassa1184, TestClassA1185 testclassa1185, TestClassA1186 testclassa1186, TestClassA1187 testclassa1187, TestClassA1188 testclassa1188, TestClassA1189 testclassa1189) + { + } + } + [Export] + public class TestClassA100 + { + [ImportingConstructor] + public TestClassA100(TestClassA1190 testclassa1190, TestClassA1191 testclassa1191, TestClassA1192 testclassa1192, TestClassA1193 testclassa1193, TestClassA1194 testclassa1194, TestClassA1195 testclassa1195, TestClassA1196 testclassa1196, TestClassA1197 testclassa1197, TestClassA1198 testclassa1198, TestClassA1199 testclassa1199, TestClassA1200 testclassa1200, TestClassA1201 testclassa1201) + { + } + } + [Export] + public class TestClassA101 + { + [ImportingConstructor] + public TestClassA101(TestClassA1202 testclassa1202, TestClassA1203 testclassa1203, TestClassA1204 testclassa1204, TestClassA1205 testclassa1205, TestClassA1206 testclassa1206, TestClassA1207 testclassa1207, TestClassA1208 testclassa1208, TestClassA1209 testclassa1209, TestClassA1210 testclassa1210, TestClassA1211 testclassa1211, TestClassA1212 testclassa1212, TestClassA1213 testclassa1213) + { + } + } + [Export] + public class TestClassA102 + { + [ImportingConstructor] + public TestClassA102(TestClassA1214 testclassa1214, TestClassA1215 testclassa1215, TestClassA1216 testclassa1216, TestClassA1217 testclassa1217, TestClassA1218 testclassa1218, TestClassA1219 testclassa1219, TestClassA1220 testclassa1220, TestClassA1221 testclassa1221, TestClassA1222 testclassa1222, TestClassA1223 testclassa1223, TestClassA1224 testclassa1224, TestClassA1225 testclassa1225) + { + } + } + [Export] + public class TestClassA103 + { + [ImportingConstructor] + public TestClassA103(TestClassA1226 testclassa1226, TestClassA1227 testclassa1227, TestClassA1228 testclassa1228, TestClassA1229 testclassa1229, TestClassA1230 testclassa1230, TestClassA1231 testclassa1231, TestClassA1232 testclassa1232, TestClassA1233 testclassa1233, TestClassA1234 testclassa1234, TestClassA1235 testclassa1235, TestClassA1236 testclassa1236, TestClassA1237 testclassa1237) + { + } + } + [Export] + public class TestClassA104 + { + [ImportingConstructor] + public TestClassA104(TestClassA1238 testclassa1238, TestClassA1239 testclassa1239, TestClassA1240 testclassa1240, TestClassA1241 testclassa1241, TestClassA1242 testclassa1242, TestClassA1243 testclassa1243, TestClassA1244 testclassa1244, TestClassA1245 testclassa1245, TestClassA1246 testclassa1246, TestClassA1247 testclassa1247, TestClassA1248 testclassa1248, TestClassA1249 testclassa1249) + { + } + } + [Export] + public class TestClassA105 + { + [ImportingConstructor] + public TestClassA105(TestClassA1250 testclassa1250, TestClassA1251 testclassa1251, TestClassA1252 testclassa1252, TestClassA1253 testclassa1253, TestClassA1254 testclassa1254, TestClassA1255 testclassa1255, TestClassA1256 testclassa1256, TestClassA1257 testclassa1257, TestClassA1258 testclassa1258, TestClassA1259 testclassa1259, TestClassA1260 testclassa1260, TestClassA1261 testclassa1261) + { + } + } + [Export] + public class TestClassA106 + { + [ImportingConstructor] + public TestClassA106(TestClassA1262 testclassa1262, TestClassA1263 testclassa1263, TestClassA1264 testclassa1264, TestClassA1265 testclassa1265, TestClassA1266 testclassa1266, TestClassA1267 testclassa1267, TestClassA1268 testclassa1268, TestClassA1269 testclassa1269, TestClassA1270 testclassa1270, TestClassA1271 testclassa1271, TestClassA1272 testclassa1272, TestClassA1273 testclassa1273) + { + } + } + [Export] + public class TestClassA107 + { + [ImportingConstructor] + public TestClassA107(TestClassA1274 testclassa1274, TestClassA1275 testclassa1275, TestClassA1276 testclassa1276, TestClassA1277 testclassa1277, TestClassA1278 testclassa1278, TestClassA1279 testclassa1279, TestClassA1280 testclassa1280, TestClassA1281 testclassa1281, TestClassA1282 testclassa1282, TestClassA1283 testclassa1283, TestClassA1284 testclassa1284, TestClassA1285 testclassa1285) + { + } + } + [Export] + public class TestClassA108 + { + [ImportingConstructor] + public TestClassA108(TestClassA1286 testclassa1286, TestClassA1287 testclassa1287, TestClassA1288 testclassa1288, TestClassA1289 testclassa1289, TestClassA1290 testclassa1290, TestClassA1291 testclassa1291, TestClassA1292 testclassa1292, TestClassA1293 testclassa1293, TestClassA1294 testclassa1294, TestClassA1295 testclassa1295, TestClassA1296 testclassa1296, TestClassA1297 testclassa1297) + { + } + } + [Export] + public class TestClassA109 + { + [ImportingConstructor] + public TestClassA109(TestClassA1298 testclassa1298, TestClassA1299 testclassa1299, TestClassA1300 testclassa1300, TestClassA1301 testclassa1301, TestClassA1302 testclassa1302, TestClassA1303 testclassa1303, TestClassA1304 testclassa1304, TestClassA1305 testclassa1305, TestClassA1306 testclassa1306, TestClassA1307 testclassa1307, TestClassA1308 testclassa1308, TestClassA1309 testclassa1309) + { + } + } + [Export] + public class TestClassA110 + { + [ImportingConstructor] + public TestClassA110(TestClassA1310 testclassa1310, TestClassA1311 testclassa1311, TestClassA1312 testclassa1312, TestClassA1313 testclassa1313, TestClassA1314 testclassa1314, TestClassA1315 testclassa1315, TestClassA1316 testclassa1316, TestClassA1317 testclassa1317, TestClassA1318 testclassa1318, TestClassA1319 testclassa1319, TestClassA1320 testclassa1320, TestClassA1321 testclassa1321) + { + } + } + [Export] + public class TestClassA111 + { + [ImportingConstructor] + public TestClassA111(TestClassA1322 testclassa1322, TestClassA1323 testclassa1323, TestClassA1324 testclassa1324, TestClassA1325 testclassa1325, TestClassA1326 testclassa1326, TestClassA1327 testclassa1327, TestClassA1328 testclassa1328, TestClassA1329 testclassa1329, TestClassA1330 testclassa1330, TestClassA1331 testclassa1331, TestClassA1332 testclassa1332, TestClassA1333 testclassa1333) + { + } + } + [Export] + public class TestClassA112 + { + [ImportingConstructor] + public TestClassA112(TestClassA1334 testclassa1334, TestClassA1335 testclassa1335, TestClassA1336 testclassa1336, TestClassA1337 testclassa1337, TestClassA1338 testclassa1338, TestClassA1339 testclassa1339, TestClassA1340 testclassa1340, TestClassA1341 testclassa1341, TestClassA1342 testclassa1342, TestClassA1343 testclassa1343, TestClassA1344 testclassa1344, TestClassA1345 testclassa1345) + { + } + } + [Export] + public class TestClassA113 + { + [ImportingConstructor] + public TestClassA113(TestClassA1346 testclassa1346, TestClassA1347 testclassa1347, TestClassA1348 testclassa1348, TestClassA1349 testclassa1349, TestClassA1350 testclassa1350, TestClassA1351 testclassa1351, TestClassA1352 testclassa1352, TestClassA1353 testclassa1353, TestClassA1354 testclassa1354, TestClassA1355 testclassa1355, TestClassA1356 testclassa1356, TestClassA1357 testclassa1357) + { + } + } + [Export] + public class TestClassA114 + { + [ImportingConstructor] + public TestClassA114(TestClassA1358 testclassa1358, TestClassA1359 testclassa1359, TestClassA1360 testclassa1360, TestClassA1361 testclassa1361, TestClassA1362 testclassa1362, TestClassA1363 testclassa1363, TestClassA1364 testclassa1364, TestClassA1365 testclassa1365, TestClassA1366 testclassa1366, TestClassA1367 testclassa1367, TestClassA1368 testclassa1368, TestClassA1369 testclassa1369) + { + } + } + [Export] + public class TestClassA115 + { + [ImportingConstructor] + public TestClassA115(TestClassA1370 testclassa1370, TestClassA1371 testclassa1371, TestClassA1372 testclassa1372, TestClassA1373 testclassa1373, TestClassA1374 testclassa1374, TestClassA1375 testclassa1375, TestClassA1376 testclassa1376, TestClassA1377 testclassa1377, TestClassA1378 testclassa1378, TestClassA1379 testclassa1379, TestClassA1380 testclassa1380, TestClassA1381 testclassa1381) + { + } + } + [Export] + public class TestClassA116 + { + [ImportingConstructor] + public TestClassA116(TestClassA1382 testclassa1382, TestClassA1383 testclassa1383, TestClassA1384 testclassa1384, TestClassA1385 testclassa1385, TestClassA1386 testclassa1386, TestClassA1387 testclassa1387, TestClassA1388 testclassa1388, TestClassA1389 testclassa1389, TestClassA1390 testclassa1390, TestClassA1391 testclassa1391, TestClassA1392 testclassa1392, TestClassA1393 testclassa1393) + { + } + } + [Export] + public class TestClassA117 + { + [ImportingConstructor] + public TestClassA117(TestClassA1394 testclassa1394, TestClassA1395 testclassa1395, TestClassA1396 testclassa1396, TestClassA1397 testclassa1397, TestClassA1398 testclassa1398, TestClassA1399 testclassa1399, TestClassA1400 testclassa1400, TestClassA1401 testclassa1401, TestClassA1402 testclassa1402, TestClassA1403 testclassa1403, TestClassA1404 testclassa1404, TestClassA1405 testclassa1405) + { + } + } + [Export] + public class TestClassA118 + { + [ImportingConstructor] + public TestClassA118(TestClassA1406 testclassa1406, TestClassA1407 testclassa1407, TestClassA1408 testclassa1408, TestClassA1409 testclassa1409, TestClassA1410 testclassa1410, TestClassA1411 testclassa1411, TestClassA1412 testclassa1412, TestClassA1413 testclassa1413, TestClassA1414 testclassa1414, TestClassA1415 testclassa1415, TestClassA1416 testclassa1416, TestClassA1417 testclassa1417) + { + } + } + [Export] + public class TestClassA119 + { + [ImportingConstructor] + public TestClassA119(TestClassA1418 testclassa1418, TestClassA1419 testclassa1419, TestClassA1420 testclassa1420, TestClassA1421 testclassa1421, TestClassA1422 testclassa1422, TestClassA1423 testclassa1423, TestClassA1424 testclassa1424, TestClassA1425 testclassa1425, TestClassA1426 testclassa1426, TestClassA1427 testclassa1427, TestClassA1428 testclassa1428, TestClassA1429 testclassa1429) + { + } + } + [Export] + public class TestClassA120 + { + [ImportingConstructor] + public TestClassA120(TestClassA1430 testclassa1430, TestClassA1431 testclassa1431, TestClassA1432 testclassa1432, TestClassA1433 testclassa1433, TestClassA1434 testclassa1434, TestClassA1435 testclassa1435, TestClassA1436 testclassa1436, TestClassA1437 testclassa1437, TestClassA1438 testclassa1438, TestClassA1439 testclassa1439, TestClassA1440 testclassa1440, TestClassA1441 testclassa1441) + { + } + } + [Export] + public class TestClassA121 + { + [ImportingConstructor] + public TestClassA121(TestClassA1442 testclassa1442, TestClassA1443 testclassa1443, TestClassA1444 testclassa1444, TestClassA1445 testclassa1445, TestClassA1446 testclassa1446, TestClassA1447 testclassa1447, TestClassA1448 testclassa1448, TestClassA1449 testclassa1449, TestClassA1450 testclassa1450, TestClassA1451 testclassa1451, TestClassA1452 testclassa1452, TestClassA1453 testclassa1453) + { + } + } + [Export] + public class TestClassA122 + { + [ImportingConstructor] + public TestClassA122(TestClassA1454 testclassa1454, TestClassA1455 testclassa1455, TestClassA1456 testclassa1456, TestClassA1457 testclassa1457, TestClassA1458 testclassa1458, TestClassA1459 testclassa1459, TestClassA1460 testclassa1460, TestClassA1461 testclassa1461, TestClassA1462 testclassa1462, TestClassA1463 testclassa1463, TestClassA1464 testclassa1464, TestClassA1465 testclassa1465) + { + } + } + [Export] + public class TestClassA123 + { + [ImportingConstructor] + public TestClassA123(TestClassA1466 testclassa1466, TestClassA1467 testclassa1467, TestClassA1468 testclassa1468, TestClassA1469 testclassa1469, TestClassA1470 testclassa1470, TestClassA1471 testclassa1471, TestClassA1472 testclassa1472, TestClassA1473 testclassa1473, TestClassA1474 testclassa1474, TestClassA1475 testclassa1475, TestClassA1476 testclassa1476, TestClassA1477 testclassa1477) + { + } + } + [Export] + public class TestClassA124 + { + [ImportingConstructor] + public TestClassA124(TestClassA1478 testclassa1478, TestClassA1479 testclassa1479, TestClassA1480 testclassa1480, TestClassA1481 testclassa1481, TestClassA1482 testclassa1482, TestClassA1483 testclassa1483, TestClassA1484 testclassa1484, TestClassA1485 testclassa1485, TestClassA1486 testclassa1486, TestClassA1487 testclassa1487, TestClassA1488 testclassa1488, TestClassA1489 testclassa1489) + { + } + } + [Export] + public class TestClassA125 + { + [ImportingConstructor] + public TestClassA125(TestClassA1490 testclassa1490, TestClassA1491 testclassa1491, TestClassA1492 testclassa1492, TestClassA1493 testclassa1493, TestClassA1494 testclassa1494, TestClassA1495 testclassa1495, TestClassA1496 testclassa1496, TestClassA1497 testclassa1497, TestClassA1498 testclassa1498, TestClassA1499 testclassa1499, TestClassA1500 testclassa1500, TestClassA1501 testclassa1501) + { + } + } + [Export] + public class TestClassA126 + { + [ImportingConstructor] + public TestClassA126(TestClassA1502 testclassa1502, TestClassA1503 testclassa1503, TestClassA1504 testclassa1504, TestClassA1505 testclassa1505, TestClassA1506 testclassa1506, TestClassA1507 testclassa1507, TestClassA1508 testclassa1508, TestClassA1509 testclassa1509, TestClassA1510 testclassa1510, TestClassA1511 testclassa1511, TestClassA1512 testclassa1512, TestClassA1513 testclassa1513) + { + } + } + [Export] + public class TestClassA127 + { + [ImportingConstructor] + public TestClassA127(TestClassA1514 testclassa1514, TestClassA1515 testclassa1515, TestClassA1516 testclassa1516, TestClassA1517 testclassa1517, TestClassA1518 testclassa1518, TestClassA1519 testclassa1519, TestClassA1520 testclassa1520, TestClassA1521 testclassa1521, TestClassA1522 testclassa1522, TestClassA1523 testclassa1523, TestClassA1524 testclassa1524, TestClassA1525 testclassa1525) + { + } + } + [Export] + public class TestClassA128 + { + [ImportingConstructor] + public TestClassA128(TestClassA1526 testclassa1526, TestClassA1527 testclassa1527, TestClassA1528 testclassa1528, TestClassA1529 testclassa1529, TestClassA1530 testclassa1530, TestClassA1531 testclassa1531, TestClassA1532 testclassa1532, TestClassA1533 testclassa1533, TestClassA1534 testclassa1534, TestClassA1535 testclassa1535, TestClassA1536 testclassa1536, TestClassA1537 testclassa1537) + { + } + } + [Export] + public class TestClassA129 + { + [ImportingConstructor] + public TestClassA129(TestClassA1538 testclassa1538, TestClassA1539 testclassa1539, TestClassA1540 testclassa1540, TestClassA1541 testclassa1541, TestClassA1542 testclassa1542, TestClassA1543 testclassa1543, TestClassA1544 testclassa1544, TestClassA1545 testclassa1545, TestClassA1546 testclassa1546, TestClassA1547 testclassa1547, TestClassA1548 testclassa1548, TestClassA1549 testclassa1549) + { + } + } + [Export] + public class TestClassA130 + { + [ImportingConstructor] + public TestClassA130(TestClassA1550 testclassa1550, TestClassA1551 testclassa1551, TestClassA1552 testclassa1552, TestClassA1553 testclassa1553, TestClassA1554 testclassa1554, TestClassA1555 testclassa1555, TestClassA1556 testclassa1556, TestClassA1557 testclassa1557, TestClassA1558 testclassa1558, TestClassA1559 testclassa1559, TestClassA1560 testclassa1560, TestClassA1561 testclassa1561) + { + } + } + [Export] + public class TestClassA131 + { + [ImportingConstructor] + public TestClassA131(TestClassA1562 testclassa1562, TestClassA1563 testclassa1563, TestClassA1564 testclassa1564, TestClassA1565 testclassa1565, TestClassA1566 testclassa1566, TestClassA1567 testclassa1567, TestClassA1568 testclassa1568, TestClassA1569 testclassa1569, TestClassA1570 testclassa1570, TestClassA1571 testclassa1571, TestClassA1572 testclassa1572, TestClassA1573 testclassa1573) + { + } + } + [Export] + public class TestClassA132 + { + [ImportingConstructor] + public TestClassA132(TestClassA1574 testclassa1574, TestClassA1575 testclassa1575, TestClassA1576 testclassa1576, TestClassA1577 testclassa1577, TestClassA1578 testclassa1578, TestClassA1579 testclassa1579, TestClassA1580 testclassa1580, TestClassA1581 testclassa1581, TestClassA1582 testclassa1582, TestClassA1583 testclassa1583, TestClassA1584 testclassa1584, TestClassA1585 testclassa1585) + { + } + } + [Export] + public class TestClassA133 + { + [ImportingConstructor] + public TestClassA133(TestClassA1586 testclassa1586, TestClassA1587 testclassa1587, TestClassA1588 testclassa1588, TestClassA1589 testclassa1589, TestClassA1590 testclassa1590, TestClassA1591 testclassa1591, TestClassA1592 testclassa1592, TestClassA1593 testclassa1593, TestClassA1594 testclassa1594, TestClassA1595 testclassa1595, TestClassA1596 testclassa1596, TestClassA1597 testclassa1597) + { + } + } + [Export] + public class TestClassA134 + { + [ImportingConstructor] + public TestClassA134(TestClassA1598 testclassa1598, TestClassA1599 testclassa1599, TestClassA1600 testclassa1600, TestClassA1601 testclassa1601, TestClassA1602 testclassa1602, TestClassA1603 testclassa1603, TestClassA1604 testclassa1604, TestClassA1605 testclassa1605, TestClassA1606 testclassa1606, TestClassA1607 testclassa1607, TestClassA1608 testclassa1608, TestClassA1609 testclassa1609) + { + } + } + [Export] + public class TestClassA135 + { + [ImportingConstructor] + public TestClassA135(TestClassA1610 testclassa1610, TestClassA1611 testclassa1611, TestClassA1612 testclassa1612, TestClassA1613 testclassa1613, TestClassA1614 testclassa1614, TestClassA1615 testclassa1615, TestClassA1616 testclassa1616, TestClassA1617 testclassa1617, TestClassA1618 testclassa1618, TestClassA1619 testclassa1619, TestClassA1620 testclassa1620, TestClassA1621 testclassa1621) + { + } + } + [Export] + public class TestClassA136 + { + [ImportingConstructor] + public TestClassA136(TestClassA1622 testclassa1622, TestClassA1623 testclassa1623, TestClassA1624 testclassa1624, TestClassA1625 testclassa1625, TestClassA1626 testclassa1626, TestClassA1627 testclassa1627, TestClassA1628 testclassa1628, TestClassA1629 testclassa1629, TestClassA1630 testclassa1630, TestClassA1631 testclassa1631, TestClassA1632 testclassa1632, TestClassA1633 testclassa1633) + { + } + } + [Export] + public class TestClassA137 + { + [ImportingConstructor] + public TestClassA137(TestClassA1634 testclassa1634, TestClassA1635 testclassa1635, TestClassA1636 testclassa1636, TestClassA1637 testclassa1637, TestClassA1638 testclassa1638, TestClassA1639 testclassa1639, TestClassA1640 testclassa1640, TestClassA1641 testclassa1641, TestClassA1642 testclassa1642, TestClassA1643 testclassa1643, TestClassA1644 testclassa1644, TestClassA1645 testclassa1645) + { + } + } + [Export] + public class TestClassA138 + { + [ImportingConstructor] + public TestClassA138(TestClassA1646 testclassa1646, TestClassA1647 testclassa1647, TestClassA1648 testclassa1648, TestClassA1649 testclassa1649, TestClassA1650 testclassa1650, TestClassA1651 testclassa1651, TestClassA1652 testclassa1652, TestClassA1653 testclassa1653, TestClassA1654 testclassa1654, TestClassA1655 testclassa1655, TestClassA1656 testclassa1656, TestClassA1657 testclassa1657) + { + } + } + [Export] + public class TestClassA139 + { + [ImportingConstructor] + public TestClassA139(TestClassA1658 testclassa1658, TestClassA1659 testclassa1659, TestClassA1660 testclassa1660, TestClassA1661 testclassa1661, TestClassA1662 testclassa1662, TestClassA1663 testclassa1663, TestClassA1664 testclassa1664, TestClassA1665 testclassa1665, TestClassA1666 testclassa1666, TestClassA1667 testclassa1667, TestClassA1668 testclassa1668, TestClassA1669 testclassa1669) + { + } + } + [Export] + public class TestClassA140 + { + [ImportingConstructor] + public TestClassA140(TestClassA1670 testclassa1670, TestClassA1671 testclassa1671, TestClassA1672 testclassa1672, TestClassA1673 testclassa1673, TestClassA1674 testclassa1674, TestClassA1675 testclassa1675, TestClassA1676 testclassa1676, TestClassA1677 testclassa1677, TestClassA1678 testclassa1678, TestClassA1679 testclassa1679, TestClassA1680 testclassa1680, TestClassA1681 testclassa1681) + { + } + } + [Export] + public class TestClassA141 + { + [ImportingConstructor] + public TestClassA141(TestClassA1682 testclassa1682, TestClassA1683 testclassa1683, TestClassA1684 testclassa1684, TestClassA1685 testclassa1685, TestClassA1686 testclassa1686, TestClassA1687 testclassa1687, TestClassA1688 testclassa1688, TestClassA1689 testclassa1689, TestClassA1690 testclassa1690, TestClassA1691 testclassa1691, TestClassA1692 testclassa1692, TestClassA1693 testclassa1693) + { + } + } + [Export] + public class TestClassA142 + { + [ImportingConstructor] + public TestClassA142(TestClassA1694 testclassa1694, TestClassA1695 testclassa1695, TestClassA1696 testclassa1696, TestClassA1697 testclassa1697, TestClassA1698 testclassa1698, TestClassA1699 testclassa1699, TestClassA1700 testclassa1700, TestClassA1701 testclassa1701, TestClassA1702 testclassa1702, TestClassA1703 testclassa1703, TestClassA1704 testclassa1704, TestClassA1705 testclassa1705) + { + } + } + [Export] + public class TestClassA143 + { + [ImportingConstructor] + public TestClassA143(TestClassA1706 testclassa1706, TestClassA1707 testclassa1707, TestClassA1708 testclassa1708, TestClassA1709 testclassa1709, TestClassA1710 testclassa1710, TestClassA1711 testclassa1711, TestClassA1712 testclassa1712, TestClassA1713 testclassa1713, TestClassA1714 testclassa1714, TestClassA1715 testclassa1715, TestClassA1716 testclassa1716, TestClassA1717 testclassa1717) + { + } + } + [Export] + public class TestClassA144 + { + [ImportingConstructor] + public TestClassA144(TestClassA1718 testclassa1718, TestClassA1719 testclassa1719, TestClassA1720 testclassa1720, TestClassA1721 testclassa1721, TestClassA1722 testclassa1722, TestClassA1723 testclassa1723, TestClassA1724 testclassa1724, TestClassA1725 testclassa1725, TestClassA1726 testclassa1726, TestClassA1727 testclassa1727, TestClassA1728 testclassa1728, TestClassA1729 testclassa1729) + { + } + } + [Export] + public class TestClassA145 + { + [ImportingConstructor] + public TestClassA145(TestClassA1730 testclassa1730, TestClassA1731 testclassa1731, TestClassA1732 testclassa1732, TestClassA1733 testclassa1733, TestClassA1734 testclassa1734, TestClassA1735 testclassa1735, TestClassA1736 testclassa1736, TestClassA1737 testclassa1737, TestClassA1738 testclassa1738, TestClassA1739 testclassa1739, TestClassA1740 testclassa1740, TestClassA1741 testclassa1741) + { + } + } + [Export] + public class TestClassA146 + { + [ImportingConstructor] + public TestClassA146(TestClassA1742 testclassa1742, TestClassA1743 testclassa1743, TestClassA1744 testclassa1744, TestClassA1745 testclassa1745, TestClassA1746 testclassa1746, TestClassA1747 testclassa1747, TestClassA1748 testclassa1748, TestClassA1749 testclassa1749, TestClassA1750 testclassa1750, TestClassA1751 testclassa1751, TestClassA1752 testclassa1752, TestClassA1753 testclassa1753) + { + } + } + [Export] + public class TestClassA147 + { + [ImportingConstructor] + public TestClassA147(TestClassA1754 testclassa1754, TestClassA1755 testclassa1755, TestClassA1756 testclassa1756, TestClassA1757 testclassa1757, TestClassA1758 testclassa1758, TestClassA1759 testclassa1759, TestClassA1760 testclassa1760, TestClassA1761 testclassa1761, TestClassA1762 testclassa1762, TestClassA1763 testclassa1763, TestClassA1764 testclassa1764, TestClassA1765 testclassa1765) + { + } + } + [Export] + public class TestClassA148 + { + [ImportingConstructor] + public TestClassA148(TestClassA1766 testclassa1766, TestClassA1767 testclassa1767, TestClassA1768 testclassa1768, TestClassA1769 testclassa1769, TestClassA1770 testclassa1770, TestClassA1771 testclassa1771, TestClassA1772 testclassa1772, TestClassA1773 testclassa1773, TestClassA1774 testclassa1774, TestClassA1775 testclassa1775, TestClassA1776 testclassa1776, TestClassA1777 testclassa1777) + { + } + } + [Export] + public class TestClassA149 + { + [ImportingConstructor] + public TestClassA149(TestClassA1778 testclassa1778, TestClassA1779 testclassa1779, TestClassA1780 testclassa1780, TestClassA1781 testclassa1781, TestClassA1782 testclassa1782, TestClassA1783 testclassa1783, TestClassA1784 testclassa1784, TestClassA1785 testclassa1785, TestClassA1786 testclassa1786, TestClassA1787 testclassa1787, TestClassA1788 testclassa1788, TestClassA1789 testclassa1789) + { + } + } + [Export] + public class TestClassA150 + { + [ImportingConstructor] + public TestClassA150(TestClassA1790 testclassa1790, TestClassA1791 testclassa1791, TestClassA1792 testclassa1792, TestClassA1793 testclassa1793, TestClassA1794 testclassa1794, TestClassA1795 testclassa1795, TestClassA1796 testclassa1796, TestClassA1797 testclassa1797, TestClassA1798 testclassa1798, TestClassA1799 testclassa1799, TestClassA1800 testclassa1800, TestClassA1801 testclassa1801) + { + } + } + [Export] + public class TestClassA151 + { + [ImportingConstructor] + public TestClassA151(TestClassA1802 testclassa1802, TestClassA1803 testclassa1803, TestClassA1804 testclassa1804, TestClassA1805 testclassa1805, TestClassA1806 testclassa1806, TestClassA1807 testclassa1807, TestClassA1808 testclassa1808, TestClassA1809 testclassa1809, TestClassA1810 testclassa1810, TestClassA1811 testclassa1811, TestClassA1812 testclassa1812, TestClassA1813 testclassa1813) + { + } + } + [Export] + public class TestClassA152 + { + [ImportingConstructor] + public TestClassA152(TestClassA1814 testclassa1814, TestClassA1815 testclassa1815, TestClassA1816 testclassa1816, TestClassA1817 testclassa1817, TestClassA1818 testclassa1818, TestClassA1819 testclassa1819, TestClassA1820 testclassa1820, TestClassA1821 testclassa1821, TestClassA1822 testclassa1822, TestClassA1823 testclassa1823, TestClassA1824 testclassa1824, TestClassA1825 testclassa1825) + { + } + } + [Export] + public class TestClassA153 + { + [ImportingConstructor] + public TestClassA153(TestClassA1826 testclassa1826, TestClassA1827 testclassa1827, TestClassA1828 testclassa1828, TestClassA1829 testclassa1829, TestClassA1830 testclassa1830, TestClassA1831 testclassa1831, TestClassA1832 testclassa1832, TestClassA1833 testclassa1833, TestClassA1834 testclassa1834, TestClassA1835 testclassa1835, TestClassA1836 testclassa1836, TestClassA1837 testclassa1837) + { + } + } + [Export] + public class TestClassA154 + { + [ImportingConstructor] + public TestClassA154(TestClassA1838 testclassa1838, TestClassA1839 testclassa1839, TestClassA1840 testclassa1840, TestClassA1841 testclassa1841, TestClassA1842 testclassa1842, TestClassA1843 testclassa1843, TestClassA1844 testclassa1844, TestClassA1845 testclassa1845, TestClassA1846 testclassa1846, TestClassA1847 testclassa1847, TestClassA1848 testclassa1848, TestClassA1849 testclassa1849) + { + } + } + [Export] + public class TestClassA155 + { + [ImportingConstructor] + public TestClassA155(TestClassA1850 testclassa1850, TestClassA1851 testclassa1851, TestClassA1852 testclassa1852, TestClassA1853 testclassa1853, TestClassA1854 testclassa1854, TestClassA1855 testclassa1855, TestClassA1856 testclassa1856, TestClassA1857 testclassa1857, TestClassA1858 testclassa1858, TestClassA1859 testclassa1859, TestClassA1860 testclassa1860, TestClassA1861 testclassa1861) + { + } + } + [Export] + public class TestClassA156 + { + [ImportingConstructor] + public TestClassA156(TestClassA1862 testclassa1862, TestClassA1863 testclassa1863, TestClassA1864 testclassa1864, TestClassA1865 testclassa1865, TestClassA1866 testclassa1866, TestClassA1867 testclassa1867, TestClassA1868 testclassa1868, TestClassA1869 testclassa1869, TestClassA1870 testclassa1870, TestClassA1871 testclassa1871, TestClassA1872 testclassa1872, TestClassA1873 testclassa1873) + { + } + } + [Export] + public class TestClassA157 + { + public TestClassA157() + { + } + } + [Export] + public class TestClassA158 + { + public TestClassA158() + { + } + } + [Export] + public class TestClassA159 + { + public TestClassA159() + { + } + } + [Export] + public class TestClassA160 + { + public TestClassA160() + { + } + } + [Export] + public class TestClassA161 + { + public TestClassA161() + { + } + } + [Export] + public class TestClassA162 + { + public TestClassA162() + { + } + } + [Export] + public class TestClassA163 + { + public TestClassA163() + { + } + } + [Export] + public class TestClassA164 + { + public TestClassA164() + { + } + } + [Export] + public class TestClassA165 + { + public TestClassA165() + { + } + } + [Export] + public class TestClassA166 + { + public TestClassA166() + { + } + } + [Export] + public class TestClassA167 + { + public TestClassA167() + { + } + } + [Export] + public class TestClassA168 + { + public TestClassA168() + { + } + } + [Export] + public class TestClassA169 + { + public TestClassA169() + { + } + } + [Export] + public class TestClassA170 + { + public TestClassA170() + { + } + } + [Export] + public class TestClassA171 + { + public TestClassA171() + { + } + } + [Export] + public class TestClassA172 + { + public TestClassA172() + { + } + } + [Export] + public class TestClassA173 + { + public TestClassA173() + { + } + } + [Export] + public class TestClassA174 + { + public TestClassA174() + { + } + } + [Export] + public class TestClassA175 + { + public TestClassA175() + { + } + } + [Export] + public class TestClassA176 + { + public TestClassA176() + { + } + } + [Export] + public class TestClassA177 + { + public TestClassA177() + { + } + } + [Export] + public class TestClassA178 + { + public TestClassA178() + { + } + } + [Export] + public class TestClassA179 + { + public TestClassA179() + { + } + } + [Export] + public class TestClassA180 + { + public TestClassA180() + { + } + } + [Export] + public class TestClassA181 + { + public TestClassA181() + { + } + } + [Export] + public class TestClassA182 + { + public TestClassA182() + { + } + } + [Export] + public class TestClassA183 + { + public TestClassA183() + { + } + } + [Export] + public class TestClassA184 + { + public TestClassA184() + { + } + } + [Export] + public class TestClassA185 + { + public TestClassA185() + { + } + } + [Export] + public class TestClassA186 + { + public TestClassA186() + { + } + } + [Export] + public class TestClassA187 + { + public TestClassA187() + { + } + } + [Export] + public class TestClassA188 + { + public TestClassA188() + { + } + } + [Export] + public class TestClassA189 + { + public TestClassA189() + { + } + } + [Export] + public class TestClassA190 + { + public TestClassA190() + { + } + } + [Export] + public class TestClassA191 + { + public TestClassA191() + { + } + } + [Export] + public class TestClassA192 + { + public TestClassA192() + { + } + } + [Export] + public class TestClassA193 + { + public TestClassA193() + { + } + } + [Export] + public class TestClassA194 + { + public TestClassA194() + { + } + } + [Export] + public class TestClassA195 + { + public TestClassA195() + { + } + } + [Export] + public class TestClassA196 + { + public TestClassA196() + { + } + } + [Export] + public class TestClassA197 + { + public TestClassA197() + { + } + } + [Export] + public class TestClassA198 + { + public TestClassA198() + { + } + } + [Export] + public class TestClassA199 + { + public TestClassA199() + { + } + } + [Export] + public class TestClassA200 + { + public TestClassA200() + { + } + } + [Export] + public class TestClassA201 + { + public TestClassA201() + { + } + } + [Export] + public class TestClassA202 + { + public TestClassA202() + { + } + } + [Export] + public class TestClassA203 + { + public TestClassA203() + { + } + } + [Export] + public class TestClassA204 + { + public TestClassA204() + { + } + } + [Export] + public class TestClassA205 + { + public TestClassA205() + { + } + } + [Export] + public class TestClassA206 + { + public TestClassA206() + { + } + } + [Export] + public class TestClassA207 + { + public TestClassA207() + { + } + } + [Export] + public class TestClassA208 + { + public TestClassA208() + { + } + } + [Export] + public class TestClassA209 + { + public TestClassA209() + { + } + } + [Export] + public class TestClassA210 + { + public TestClassA210() + { + } + } + [Export] + public class TestClassA211 + { + public TestClassA211() + { + } + } + [Export] + public class TestClassA212 + { + public TestClassA212() + { + } + } + [Export] + public class TestClassA213 + { + public TestClassA213() + { + } + } + [Export] + public class TestClassA214 + { + public TestClassA214() + { + } + } + [Export] + public class TestClassA215 + { + public TestClassA215() + { + } + } + [Export] + public class TestClassA216 + { + public TestClassA216() + { + } + } + [Export] + public class TestClassA217 + { + public TestClassA217() + { + } + } + [Export] + public class TestClassA218 + { + public TestClassA218() + { + } + } + [Export] + public class TestClassA219 + { + public TestClassA219() + { + } + } + [Export] + public class TestClassA220 + { + public TestClassA220() + { + } + } + [Export] + public class TestClassA221 + { + public TestClassA221() + { + } + } + [Export] + public class TestClassA222 + { + public TestClassA222() + { + } + } + [Export] + public class TestClassA223 + { + public TestClassA223() + { + } + } + [Export] + public class TestClassA224 + { + public TestClassA224() + { + } + } + [Export] + public class TestClassA225 + { + public TestClassA225() + { + } + } + [Export] + public class TestClassA226 + { + public TestClassA226() + { + } + } + [Export] + public class TestClassA227 + { + public TestClassA227() + { + } + } + [Export] + public class TestClassA228 + { + public TestClassA228() + { + } + } + [Export] + public class TestClassA229 + { + public TestClassA229() + { + } + } + [Export] + public class TestClassA230 + { + public TestClassA230() + { + } + } + [Export] + public class TestClassA231 + { + public TestClassA231() + { + } + } + [Export] + public class TestClassA232 + { + public TestClassA232() + { + } + } + [Export] + public class TestClassA233 + { + public TestClassA233() + { + } + } + [Export] + public class TestClassA234 + { + public TestClassA234() + { + } + } + [Export] + public class TestClassA235 + { + public TestClassA235() + { + } + } + [Export] + public class TestClassA236 + { + public TestClassA236() + { + } + } + [Export] + public class TestClassA237 + { + public TestClassA237() + { + } + } + [Export] + public class TestClassA238 + { + public TestClassA238() + { + } + } + [Export] + public class TestClassA239 + { + public TestClassA239() + { + } + } + [Export] + public class TestClassA240 + { + public TestClassA240() + { + } + } + [Export] + public class TestClassA241 + { + public TestClassA241() + { + } + } + [Export] + public class TestClassA242 + { + public TestClassA242() + { + } + } + [Export] + public class TestClassA243 + { + public TestClassA243() + { + } + } + [Export] + public class TestClassA244 + { + public TestClassA244() + { + } + } + [Export] + public class TestClassA245 + { + public TestClassA245() + { + } + } + [Export] + public class TestClassA246 + { + public TestClassA246() + { + } + } + [Export] + public class TestClassA247 + { + public TestClassA247() + { + } + } + [Export] + public class TestClassA248 + { + public TestClassA248() + { + } + } + [Export] + public class TestClassA249 + { + public TestClassA249() + { + } + } + [Export] + public class TestClassA250 + { + public TestClassA250() + { + } + } + [Export] + public class TestClassA251 + { + public TestClassA251() + { + } + } + [Export] + public class TestClassA252 + { + public TestClassA252() + { + } + } + [Export] + public class TestClassA253 + { + public TestClassA253() + { + } + } + [Export] + public class TestClassA254 + { + public TestClassA254() + { + } + } + [Export] + public class TestClassA255 + { + public TestClassA255() + { + } + } + [Export] + public class TestClassA256 + { + public TestClassA256() + { + } + } + [Export] + public class TestClassA257 + { + public TestClassA257() + { + } + } + [Export] + public class TestClassA258 + { + public TestClassA258() + { + } + } + [Export] + public class TestClassA259 + { + public TestClassA259() + { + } + } + [Export] + public class TestClassA260 + { + public TestClassA260() + { + } + } + [Export] + public class TestClassA261 + { + public TestClassA261() + { + } + } + [Export] + public class TestClassA262 + { + public TestClassA262() + { + } + } + [Export] + public class TestClassA263 + { + public TestClassA263() + { + } + } + [Export] + public class TestClassA264 + { + public TestClassA264() + { + } + } + [Export] + public class TestClassA265 + { + public TestClassA265() + { + } + } + [Export] + public class TestClassA266 + { + public TestClassA266() + { + } + } + [Export] + public class TestClassA267 + { + public TestClassA267() + { + } + } + [Export] + public class TestClassA268 + { + public TestClassA268() + { + } + } + [Export] + public class TestClassA269 + { + public TestClassA269() + { + } + } + [Export] + public class TestClassA270 + { + public TestClassA270() + { + } + } + [Export] + public class TestClassA271 + { + public TestClassA271() + { + } + } + [Export] + public class TestClassA272 + { + public TestClassA272() + { + } + } + [Export] + public class TestClassA273 + { + public TestClassA273() + { + } + } + [Export] + public class TestClassA274 + { + public TestClassA274() + { + } + } + [Export] + public class TestClassA275 + { + public TestClassA275() + { + } + } + [Export] + public class TestClassA276 + { + public TestClassA276() + { + } + } + [Export] + public class TestClassA277 + { + public TestClassA277() + { + } + } + [Export] + public class TestClassA278 + { + public TestClassA278() + { + } + } + [Export] + public class TestClassA279 + { + public TestClassA279() + { + } + } + [Export] + public class TestClassA280 + { + public TestClassA280() + { + } + } + [Export] + public class TestClassA281 + { + public TestClassA281() + { + } + } + [Export] + public class TestClassA282 + { + public TestClassA282() + { + } + } + [Export] + public class TestClassA283 + { + public TestClassA283() + { + } + } + [Export] + public class TestClassA284 + { + public TestClassA284() + { + } + } + [Export] + public class TestClassA285 + { + public TestClassA285() + { + } + } + [Export] + public class TestClassA286 + { + public TestClassA286() + { + } + } + [Export] + public class TestClassA287 + { + public TestClassA287() + { + } + } + [Export] + public class TestClassA288 + { + public TestClassA288() + { + } + } + [Export] + public class TestClassA289 + { + public TestClassA289() + { + } + } + [Export] + public class TestClassA290 + { + public TestClassA290() + { + } + } + [Export] + public class TestClassA291 + { + public TestClassA291() + { + } + } + [Export] + public class TestClassA292 + { + public TestClassA292() + { + } + } + [Export] + public class TestClassA293 + { + public TestClassA293() + { + } + } + [Export] + public class TestClassA294 + { + public TestClassA294() + { + } + } + [Export] + public class TestClassA295 + { + public TestClassA295() + { + } + } + [Export] + public class TestClassA296 + { + public TestClassA296() + { + } + } + [Export] + public class TestClassA297 + { + public TestClassA297() + { + } + } + [Export] + public class TestClassA298 + { + public TestClassA298() + { + } + } + [Export] + public class TestClassA299 + { + public TestClassA299() + { + } + } + [Export] + public class TestClassA300 + { + public TestClassA300() + { + } + } + [Export] + public class TestClassA301 + { + public TestClassA301() + { + } + } + [Export] + public class TestClassA302 + { + public TestClassA302() + { + } + } + [Export] + public class TestClassA303 + { + public TestClassA303() + { + } + } + [Export] + public class TestClassA304 + { + public TestClassA304() + { + } + } + [Export] + public class TestClassA305 + { + public TestClassA305() + { + } + } + [Export] + public class TestClassA306 + { + public TestClassA306() + { + } + } + [Export] + public class TestClassA307 + { + public TestClassA307() + { + } + } + [Export] + public class TestClassA308 + { + public TestClassA308() + { + } + } + [Export] + public class TestClassA309 + { + public TestClassA309() + { + } + } + [Export] + public class TestClassA310 + { + public TestClassA310() + { + } + } + [Export] + public class TestClassA311 + { + public TestClassA311() + { + } + } + [Export] + public class TestClassA312 + { + public TestClassA312() + { + } + } + [Export] + public class TestClassA313 + { + public TestClassA313() + { + } + } + [Export] + public class TestClassA314 + { + public TestClassA314() + { + } + } + [Export] + public class TestClassA315 + { + public TestClassA315() + { + } + } + [Export] + public class TestClassA316 + { + public TestClassA316() + { + } + } + [Export] + public class TestClassA317 + { + public TestClassA317() + { + } + } + [Export] + public class TestClassA318 + { + public TestClassA318() + { + } + } + [Export] + public class TestClassA319 + { + public TestClassA319() + { + } + } + [Export] + public class TestClassA320 + { + public TestClassA320() + { + } + } + [Export] + public class TestClassA321 + { + public TestClassA321() + { + } + } + [Export] + public class TestClassA322 + { + public TestClassA322() + { + } + } + [Export] + public class TestClassA323 + { + public TestClassA323() + { + } + } + [Export] + public class TestClassA324 + { + public TestClassA324() + { + } + } + [Export] + public class TestClassA325 + { + public TestClassA325() + { + } + } + [Export] + public class TestClassA326 + { + public TestClassA326() + { + } + } + [Export] + public class TestClassA327 + { + public TestClassA327() + { + } + } + [Export] + public class TestClassA328 + { + public TestClassA328() + { + } + } + [Export] + public class TestClassA329 + { + public TestClassA329() + { + } + } + [Export] + public class TestClassA330 + { + public TestClassA330() + { + } + } + [Export] + public class TestClassA331 + { + public TestClassA331() + { + } + } + [Export] + public class TestClassA332 + { + public TestClassA332() + { + } + } + [Export] + public class TestClassA333 + { + public TestClassA333() + { + } + } + [Export] + public class TestClassA334 + { + public TestClassA334() + { + } + } + [Export] + public class TestClassA335 + { + public TestClassA335() + { + } + } + [Export] + public class TestClassA336 + { + public TestClassA336() + { + } + } + [Export] + public class TestClassA337 + { + public TestClassA337() + { + } + } + [Export] + public class TestClassA338 + { + public TestClassA338() + { + } + } + [Export] + public class TestClassA339 + { + public TestClassA339() + { + } + } + [Export] + public class TestClassA340 + { + public TestClassA340() + { + } + } + [Export] + public class TestClassA341 + { + public TestClassA341() + { + } + } + [Export] + public class TestClassA342 + { + public TestClassA342() + { + } + } + [Export] + public class TestClassA343 + { + public TestClassA343() + { + } + } + [Export] + public class TestClassA344 + { + public TestClassA344() + { + } + } + [Export] + public class TestClassA345 + { + public TestClassA345() + { + } + } + [Export] + public class TestClassA346 + { + public TestClassA346() + { + } + } + [Export] + public class TestClassA347 + { + public TestClassA347() + { + } + } + [Export] + public class TestClassA348 + { + public TestClassA348() + { + } + } + [Export] + public class TestClassA349 + { + public TestClassA349() + { + } + } + [Export] + public class TestClassA350 + { + public TestClassA350() + { + } + } + [Export] + public class TestClassA351 + { + public TestClassA351() + { + } + } + [Export] + public class TestClassA352 + { + public TestClassA352() + { + } + } + [Export] + public class TestClassA353 + { + public TestClassA353() + { + } + } + [Export] + public class TestClassA354 + { + public TestClassA354() + { + } + } + [Export] + public class TestClassA355 + { + public TestClassA355() + { + } + } + [Export] + public class TestClassA356 + { + public TestClassA356() + { + } + } + [Export] + public class TestClassA357 + { + public TestClassA357() + { + } + } + [Export] + public class TestClassA358 + { + public TestClassA358() + { + } + } + [Export] + public class TestClassA359 + { + public TestClassA359() + { + } + } + [Export] + public class TestClassA360 + { + public TestClassA360() + { + } + } + [Export] + public class TestClassA361 + { + public TestClassA361() + { + } + } + [Export] + public class TestClassA362 + { + public TestClassA362() + { + } + } + [Export] + public class TestClassA363 + { + public TestClassA363() + { + } + } + [Export] + public class TestClassA364 + { + public TestClassA364() + { + } + } + [Export] + public class TestClassA365 + { + public TestClassA365() + { + } + } + [Export] + public class TestClassA366 + { + public TestClassA366() + { + } + } + [Export] + public class TestClassA367 + { + public TestClassA367() + { + } + } + [Export] + public class TestClassA368 + { + public TestClassA368() + { + } + } + [Export] + public class TestClassA369 + { + public TestClassA369() + { + } + } + [Export] + public class TestClassA370 + { + public TestClassA370() + { + } + } + [Export] + public class TestClassA371 + { + public TestClassA371() + { + } + } + [Export] + public class TestClassA372 + { + public TestClassA372() + { + } + } + [Export] + public class TestClassA373 + { + public TestClassA373() + { + } + } + [Export] + public class TestClassA374 + { + public TestClassA374() + { + } + } + [Export] + public class TestClassA375 + { + public TestClassA375() + { + } + } + [Export] + public class TestClassA376 + { + public TestClassA376() + { + } + } + [Export] + public class TestClassA377 + { + public TestClassA377() + { + } + } + [Export] + public class TestClassA378 + { + public TestClassA378() + { + } + } + [Export] + public class TestClassA379 + { + public TestClassA379() + { + } + } + [Export] + public class TestClassA380 + { + public TestClassA380() + { + } + } + [Export] + public class TestClassA381 + { + public TestClassA381() + { + } + } + [Export] + public class TestClassA382 + { + public TestClassA382() + { + } + } + [Export] + public class TestClassA383 + { + public TestClassA383() + { + } + } + [Export] + public class TestClassA384 + { + public TestClassA384() + { + } + } + [Export] + public class TestClassA385 + { + public TestClassA385() + { + } + } + [Export] + public class TestClassA386 + { + public TestClassA386() + { + } + } + [Export] + public class TestClassA387 + { + public TestClassA387() + { + } + } + [Export] + public class TestClassA388 + { + public TestClassA388() + { + } + } + [Export] + public class TestClassA389 + { + public TestClassA389() + { + } + } + [Export] + public class TestClassA390 + { + public TestClassA390() + { + } + } + [Export] + public class TestClassA391 + { + public TestClassA391() + { + } + } + [Export] + public class TestClassA392 + { + public TestClassA392() + { + } + } + [Export] + public class TestClassA393 + { + public TestClassA393() + { + } + } + [Export] + public class TestClassA394 + { + public TestClassA394() + { + } + } + [Export] + public class TestClassA395 + { + public TestClassA395() + { + } + } + [Export] + public class TestClassA396 + { + public TestClassA396() + { + } + } + [Export] + public class TestClassA397 + { + public TestClassA397() + { + } + } + [Export] + public class TestClassA398 + { + public TestClassA398() + { + } + } + [Export] + public class TestClassA399 + { + public TestClassA399() + { + } + } + [Export] + public class TestClassA400 + { + public TestClassA400() + { + } + } + [Export] + public class TestClassA401 + { + public TestClassA401() + { + } + } + [Export] + public class TestClassA402 + { + public TestClassA402() + { + } + } + [Export] + public class TestClassA403 + { + public TestClassA403() + { + } + } + [Export] + public class TestClassA404 + { + public TestClassA404() + { + } + } + [Export] + public class TestClassA405 + { + public TestClassA405() + { + } + } + [Export] + public class TestClassA406 + { + public TestClassA406() + { + } + } + [Export] + public class TestClassA407 + { + public TestClassA407() + { + } + } + [Export] + public class TestClassA408 + { + public TestClassA408() + { + } + } + [Export] + public class TestClassA409 + { + public TestClassA409() + { + } + } + [Export] + public class TestClassA410 + { + public TestClassA410() + { + } + } + [Export] + public class TestClassA411 + { + public TestClassA411() + { + } + } + [Export] + public class TestClassA412 + { + public TestClassA412() + { + } + } + [Export] + public class TestClassA413 + { + public TestClassA413() + { + } + } + [Export] + public class TestClassA414 + { + public TestClassA414() + { + } + } + [Export] + public class TestClassA415 + { + public TestClassA415() + { + } + } + [Export] + public class TestClassA416 + { + public TestClassA416() + { + } + } + [Export] + public class TestClassA417 + { + public TestClassA417() + { + } + } + [Export] + public class TestClassA418 + { + public TestClassA418() + { + } + } + [Export] + public class TestClassA419 + { + public TestClassA419() + { + } + } + [Export] + public class TestClassA420 + { + public TestClassA420() + { + } + } + [Export] + public class TestClassA421 + { + public TestClassA421() + { + } + } + [Export] + public class TestClassA422 + { + public TestClassA422() + { + } + } + [Export] + public class TestClassA423 + { + public TestClassA423() + { + } + } + [Export] + public class TestClassA424 + { + public TestClassA424() + { + } + } + [Export] + public class TestClassA425 + { + public TestClassA425() + { + } + } + [Export] + public class TestClassA426 + { + public TestClassA426() + { + } + } + [Export] + public class TestClassA427 + { + public TestClassA427() + { + } + } + [Export] + public class TestClassA428 + { + public TestClassA428() + { + } + } + [Export] + public class TestClassA429 + { + public TestClassA429() + { + } + } + [Export] + public class TestClassA430 + { + public TestClassA430() + { + } + } + [Export] + public class TestClassA431 + { + public TestClassA431() + { + } + } + [Export] + public class TestClassA432 + { + public TestClassA432() + { + } + } + [Export] + public class TestClassA433 + { + public TestClassA433() + { + } + } + [Export] + public class TestClassA434 + { + public TestClassA434() + { + } + } + [Export] + public class TestClassA435 + { + public TestClassA435() + { + } + } + [Export] + public class TestClassA436 + { + public TestClassA436() + { + } + } + [Export] + public class TestClassA437 + { + public TestClassA437() + { + } + } + [Export] + public class TestClassA438 + { + public TestClassA438() + { + } + } + [Export] + public class TestClassA439 + { + public TestClassA439() + { + } + } + [Export] + public class TestClassA440 + { + public TestClassA440() + { + } + } + [Export] + public class TestClassA441 + { + public TestClassA441() + { + } + } + [Export] + public class TestClassA442 + { + public TestClassA442() + { + } + } + [Export] + public class TestClassA443 + { + public TestClassA443() + { + } + } + [Export] + public class TestClassA444 + { + public TestClassA444() + { + } + } + [Export] + public class TestClassA445 + { + public TestClassA445() + { + } + } + [Export] + public class TestClassA446 + { + public TestClassA446() + { + } + } + [Export] + public class TestClassA447 + { + public TestClassA447() + { + } + } + [Export] + public class TestClassA448 + { + public TestClassA448() + { + } + } + [Export] + public class TestClassA449 + { + public TestClassA449() + { + } + } + [Export] + public class TestClassA450 + { + public TestClassA450() + { + } + } + [Export] + public class TestClassA451 + { + public TestClassA451() + { + } + } + [Export] + public class TestClassA452 + { + public TestClassA452() + { + } + } + [Export] + public class TestClassA453 + { + public TestClassA453() + { + } + } + [Export] + public class TestClassA454 + { + public TestClassA454() + { + } + } + [Export] + public class TestClassA455 + { + public TestClassA455() + { + } + } + [Export] + public class TestClassA456 + { + public TestClassA456() + { + } + } + [Export] + public class TestClassA457 + { + public TestClassA457() + { + } + } + [Export] + public class TestClassA458 + { + public TestClassA458() + { + } + } + [Export] + public class TestClassA459 + { + public TestClassA459() + { + } + } + [Export] + public class TestClassA460 + { + public TestClassA460() + { + } + } + [Export] + public class TestClassA461 + { + public TestClassA461() + { + } + } + [Export] + public class TestClassA462 + { + public TestClassA462() + { + } + } + [Export] + public class TestClassA463 + { + public TestClassA463() + { + } + } + [Export] + public class TestClassA464 + { + public TestClassA464() + { + } + } + [Export] + public class TestClassA465 + { + public TestClassA465() + { + } + } + [Export] + public class TestClassA466 + { + public TestClassA466() + { + } + } + [Export] + public class TestClassA467 + { + public TestClassA467() + { + } + } + [Export] + public class TestClassA468 + { + public TestClassA468() + { + } + } + [Export] + public class TestClassA469 + { + public TestClassA469() + { + } + } + [Export] + public class TestClassA470 + { + public TestClassA470() + { + } + } + [Export] + public class TestClassA471 + { + public TestClassA471() + { + } + } + [Export] + public class TestClassA472 + { + public TestClassA472() + { + } + } + [Export] + public class TestClassA473 + { + public TestClassA473() + { + } + } + [Export] + public class TestClassA474 + { + public TestClassA474() + { + } + } + [Export] + public class TestClassA475 + { + public TestClassA475() + { + } + } + [Export] + public class TestClassA476 + { + public TestClassA476() + { + } + } + [Export] + public class TestClassA477 + { + public TestClassA477() + { + } + } + [Export] + public class TestClassA478 + { + public TestClassA478() + { + } + } + [Export] + public class TestClassA479 + { + public TestClassA479() + { + } + } + [Export] + public class TestClassA480 + { + public TestClassA480() + { + } + } + [Export] + public class TestClassA481 + { + public TestClassA481() + { + } + } + [Export] + public class TestClassA482 + { + public TestClassA482() + { + } + } + [Export] + public class TestClassA483 + { + public TestClassA483() + { + } + } + [Export] + public class TestClassA484 + { + public TestClassA484() + { + } + } + [Export] + public class TestClassA485 + { + public TestClassA485() + { + } + } + [Export] + public class TestClassA486 + { + public TestClassA486() + { + } + } + [Export] + public class TestClassA487 + { + public TestClassA487() + { + } + } + [Export] + public class TestClassA488 + { + public TestClassA488() + { + } + } + [Export] + public class TestClassA489 + { + public TestClassA489() + { + } + } + [Export] + public class TestClassA490 + { + public TestClassA490() + { + } + } + [Export] + public class TestClassA491 + { + public TestClassA491() + { + } + } + [Export] + public class TestClassA492 + { + public TestClassA492() + { + } + } + [Export] + public class TestClassA493 + { + public TestClassA493() + { + } + } + [Export] + public class TestClassA494 + { + public TestClassA494() + { + } + } + [Export] + public class TestClassA495 + { + public TestClassA495() + { + } + } + [Export] + public class TestClassA496 + { + public TestClassA496() + { + } + } + [Export] + public class TestClassA497 + { + public TestClassA497() + { + } + } + [Export] + public class TestClassA498 + { + public TestClassA498() + { + } + } + [Export] + public class TestClassA499 + { + public TestClassA499() + { + } + } + [Export] + public class TestClassA500 + { + public TestClassA500() + { + } + } + [Export] + public class TestClassA501 + { + public TestClassA501() + { + } + } + [Export] + public class TestClassA502 + { + public TestClassA502() + { + } + } + [Export] + public class TestClassA503 + { + public TestClassA503() + { + } + } + [Export] + public class TestClassA504 + { + public TestClassA504() + { + } + } + [Export] + public class TestClassA505 + { + public TestClassA505() + { + } + } + [Export] + public class TestClassA506 + { + public TestClassA506() + { + } + } + [Export] + public class TestClassA507 + { + public TestClassA507() + { + } + } + [Export] + public class TestClassA508 + { + public TestClassA508() + { + } + } + [Export] + public class TestClassA509 + { + public TestClassA509() + { + } + } + [Export] + public class TestClassA510 + { + public TestClassA510() + { + } + } + [Export] + public class TestClassA511 + { + public TestClassA511() + { + } + } + [Export] + public class TestClassA512 + { + public TestClassA512() + { + } + } + [Export] + public class TestClassA513 + { + public TestClassA513() + { + } + } + [Export] + public class TestClassA514 + { + public TestClassA514() + { + } + } + [Export] + public class TestClassA515 + { + public TestClassA515() + { + } + } + [Export] + public class TestClassA516 + { + public TestClassA516() + { + } + } + [Export] + public class TestClassA517 + { + public TestClassA517() + { + } + } + [Export] + public class TestClassA518 + { + public TestClassA518() + { + } + } + [Export] + public class TestClassA519 + { + public TestClassA519() + { + } + } + [Export] + public class TestClassA520 + { + public TestClassA520() + { + } + } + [Export] + public class TestClassA521 + { + public TestClassA521() + { + } + } + [Export] + public class TestClassA522 + { + public TestClassA522() + { + } + } + [Export] + public class TestClassA523 + { + public TestClassA523() + { + } + } + [Export] + public class TestClassA524 + { + public TestClassA524() + { + } + } + [Export] + public class TestClassA525 + { + public TestClassA525() + { + } + } + [Export] + public class TestClassA526 + { + public TestClassA526() + { + } + } + [Export] + public class TestClassA527 + { + public TestClassA527() + { + } + } + [Export] + public class TestClassA528 + { + public TestClassA528() + { + } + } + [Export] + public class TestClassA529 + { + public TestClassA529() + { + } + } + [Export] + public class TestClassA530 + { + public TestClassA530() + { + } + } + [Export] + public class TestClassA531 + { + public TestClassA531() + { + } + } + [Export] + public class TestClassA532 + { + public TestClassA532() + { + } + } + [Export] + public class TestClassA533 + { + public TestClassA533() + { + } + } + [Export] + public class TestClassA534 + { + public TestClassA534() + { + } + } + [Export] + public class TestClassA535 + { + public TestClassA535() + { + } + } + [Export] + public class TestClassA536 + { + public TestClassA536() + { + } + } + [Export] + public class TestClassA537 + { + public TestClassA537() + { + } + } + [Export] + public class TestClassA538 + { + public TestClassA538() + { + } + } + [Export] + public class TestClassA539 + { + public TestClassA539() + { + } + } + [Export] + public class TestClassA540 + { + public TestClassA540() + { + } + } + [Export] + public class TestClassA541 + { + public TestClassA541() + { + } + } + [Export] + public class TestClassA542 + { + public TestClassA542() + { + } + } + [Export] + public class TestClassA543 + { + public TestClassA543() + { + } + } + [Export] + public class TestClassA544 + { + public TestClassA544() + { + } + } + [Export] + public class TestClassA545 + { + public TestClassA545() + { + } + } + [Export] + public class TestClassA546 + { + public TestClassA546() + { + } + } + [Export] + public class TestClassA547 + { + public TestClassA547() + { + } + } + [Export] + public class TestClassA548 + { + public TestClassA548() + { + } + } + [Export] + public class TestClassA549 + { + public TestClassA549() + { + } + } + [Export] + public class TestClassA550 + { + public TestClassA550() + { + } + } + [Export] + public class TestClassA551 + { + public TestClassA551() + { + } + } + [Export] + public class TestClassA552 + { + public TestClassA552() + { + } + } + [Export] + public class TestClassA553 + { + public TestClassA553() + { + } + } + [Export] + public class TestClassA554 + { + public TestClassA554() + { + } + } + [Export] + public class TestClassA555 + { + public TestClassA555() + { + } + } + [Export] + public class TestClassA556 + { + public TestClassA556() + { + } + } + [Export] + public class TestClassA557 + { + public TestClassA557() + { + } + } + [Export] + public class TestClassA558 + { + public TestClassA558() + { + } + } + [Export] + public class TestClassA559 + { + public TestClassA559() + { + } + } + [Export] + public class TestClassA560 + { + public TestClassA560() + { + } + } + [Export] + public class TestClassA561 + { + public TestClassA561() + { + } + } + [Export] + public class TestClassA562 + { + public TestClassA562() + { + } + } + [Export] + public class TestClassA563 + { + public TestClassA563() + { + } + } + [Export] + public class TestClassA564 + { + public TestClassA564() + { + } + } + [Export] + public class TestClassA565 + { + public TestClassA565() + { + } + } + [Export] + public class TestClassA566 + { + public TestClassA566() + { + } + } + [Export] + public class TestClassA567 + { + public TestClassA567() + { + } + } + [Export] + public class TestClassA568 + { + public TestClassA568() + { + } + } + [Export] + public class TestClassA569 + { + public TestClassA569() + { + } + } + [Export] + public class TestClassA570 + { + public TestClassA570() + { + } + } + [Export] + public class TestClassA571 + { + public TestClassA571() + { + } + } + [Export] + public class TestClassA572 + { + public TestClassA572() + { + } + } + [Export] + public class TestClassA573 + { + public TestClassA573() + { + } + } + [Export] + public class TestClassA574 + { + public TestClassA574() + { + } + } + [Export] + public class TestClassA575 + { + public TestClassA575() + { + } + } + [Export] + public class TestClassA576 + { + public TestClassA576() + { + } + } + [Export] + public class TestClassA577 + { + public TestClassA577() + { + } + } + [Export] + public class TestClassA578 + { + public TestClassA578() + { + } + } + [Export] + public class TestClassA579 + { + public TestClassA579() + { + } + } + [Export] + public class TestClassA580 + { + public TestClassA580() + { + } + } + [Export] + public class TestClassA581 + { + public TestClassA581() + { + } + } + [Export] + public class TestClassA582 + { + public TestClassA582() + { + } + } + [Export] + public class TestClassA583 + { + public TestClassA583() + { + } + } + [Export] + public class TestClassA584 + { + public TestClassA584() + { + } + } + [Export] + public class TestClassA585 + { + public TestClassA585() + { + } + } + [Export] + public class TestClassA586 + { + public TestClassA586() + { + } + } + [Export] + public class TestClassA587 + { + public TestClassA587() + { + } + } + [Export] + public class TestClassA588 + { + public TestClassA588() + { + } + } + [Export] + public class TestClassA589 + { + public TestClassA589() + { + } + } + [Export] + public class TestClassA590 + { + public TestClassA590() + { + } + } + [Export] + public class TestClassA591 + { + public TestClassA591() + { + } + } + [Export] + public class TestClassA592 + { + public TestClassA592() + { + } + } + [Export] + public class TestClassA593 + { + public TestClassA593() + { + } + } + [Export] + public class TestClassA594 + { + public TestClassA594() + { + } + } + [Export] + public class TestClassA595 + { + public TestClassA595() + { + } + } + [Export] + public class TestClassA596 + { + public TestClassA596() + { + } + } + [Export] + public class TestClassA597 + { + public TestClassA597() + { + } + } + [Export] + public class TestClassA598 + { + public TestClassA598() + { + } + } + [Export] + public class TestClassA599 + { + public TestClassA599() + { + } + } + [Export] + public class TestClassA600 + { + public TestClassA600() + { + } + } + [Export] + public class TestClassA601 + { + public TestClassA601() + { + } + } + [Export] + public class TestClassA602 + { + public TestClassA602() + { + } + } + [Export] + public class TestClassA603 + { + public TestClassA603() + { + } + } + [Export] + public class TestClassA604 + { + public TestClassA604() + { + } + } + [Export] + public class TestClassA605 + { + public TestClassA605() + { + } + } + [Export] + public class TestClassA606 + { + public TestClassA606() + { + } + } + [Export] + public class TestClassA607 + { + public TestClassA607() + { + } + } + [Export] + public class TestClassA608 + { + public TestClassA608() + { + } + } + [Export] + public class TestClassA609 + { + public TestClassA609() + { + } + } + [Export] + public class TestClassA610 + { + public TestClassA610() + { + } + } + [Export] + public class TestClassA611 + { + public TestClassA611() + { + } + } + [Export] + public class TestClassA612 + { + public TestClassA612() + { + } + } + [Export] + public class TestClassA613 + { + public TestClassA613() + { + } + } + [Export] + public class TestClassA614 + { + public TestClassA614() + { + } + } + [Export] + public class TestClassA615 + { + public TestClassA615() + { + } + } + [Export] + public class TestClassA616 + { + public TestClassA616() + { + } + } + [Export] + public class TestClassA617 + { + public TestClassA617() + { + } + } + [Export] + public class TestClassA618 + { + public TestClassA618() + { + } + } + [Export] + public class TestClassA619 + { + public TestClassA619() + { + } + } + [Export] + public class TestClassA620 + { + public TestClassA620() + { + } + } + [Export] + public class TestClassA621 + { + public TestClassA621() + { + } + } + [Export] + public class TestClassA622 + { + public TestClassA622() + { + } + } + [Export] + public class TestClassA623 + { + public TestClassA623() + { + } + } + [Export] + public class TestClassA624 + { + public TestClassA624() + { + } + } + [Export] + public class TestClassA625 + { + public TestClassA625() + { + } + } + [Export] + public class TestClassA626 + { + public TestClassA626() + { + } + } + [Export] + public class TestClassA627 + { + public TestClassA627() + { + } + } + [Export] + public class TestClassA628 + { + public TestClassA628() + { + } + } + [Export] + public class TestClassA629 + { + public TestClassA629() + { + } + } + [Export] + public class TestClassA630 + { + public TestClassA630() + { + } + } + [Export] + public class TestClassA631 + { + public TestClassA631() + { + } + } + [Export] + public class TestClassA632 + { + public TestClassA632() + { + } + } + [Export] + public class TestClassA633 + { + public TestClassA633() + { + } + } + [Export] + public class TestClassA634 + { + public TestClassA634() + { + } + } + [Export] + public class TestClassA635 + { + public TestClassA635() + { + } + } + [Export] + public class TestClassA636 + { + public TestClassA636() + { + } + } + [Export] + public class TestClassA637 + { + public TestClassA637() + { + } + } + [Export] + public class TestClassA638 + { + public TestClassA638() + { + } + } + [Export] + public class TestClassA639 + { + public TestClassA639() + { + } + } + [Export] + public class TestClassA640 + { + public TestClassA640() + { + } + } + [Export] + public class TestClassA641 + { + public TestClassA641() + { + } + } + [Export] + public class TestClassA642 + { + public TestClassA642() + { + } + } + [Export] + public class TestClassA643 + { + public TestClassA643() + { + } + } + [Export] + public class TestClassA644 + { + public TestClassA644() + { + } + } + [Export] + public class TestClassA645 + { + public TestClassA645() + { + } + } + [Export] + public class TestClassA646 + { + public TestClassA646() + { + } + } + [Export] + public class TestClassA647 + { + public TestClassA647() + { + } + } + [Export] + public class TestClassA648 + { + public TestClassA648() + { + } + } + [Export] + public class TestClassA649 + { + public TestClassA649() + { + } + } + [Export] + public class TestClassA650 + { + public TestClassA650() + { + } + } + [Export] + public class TestClassA651 + { + public TestClassA651() + { + } + } + [Export] + public class TestClassA652 + { + public TestClassA652() + { + } + } + [Export] + public class TestClassA653 + { + public TestClassA653() + { + } + } + [Export] + public class TestClassA654 + { + public TestClassA654() + { + } + } + [Export] + public class TestClassA655 + { + public TestClassA655() + { + } + } + [Export] + public class TestClassA656 + { + public TestClassA656() + { + } + } + [Export] + public class TestClassA657 + { + public TestClassA657() + { + } + } + [Export] + public class TestClassA658 + { + public TestClassA658() + { + } + } + [Export] + public class TestClassA659 + { + public TestClassA659() + { + } + } + [Export] + public class TestClassA660 + { + public TestClassA660() + { + } + } + [Export] + public class TestClassA661 + { + public TestClassA661() + { + } + } + [Export] + public class TestClassA662 + { + public TestClassA662() + { + } + } + [Export] + public class TestClassA663 + { + public TestClassA663() + { + } + } + [Export] + public class TestClassA664 + { + public TestClassA664() + { + } + } + [Export] + public class TestClassA665 + { + public TestClassA665() + { + } + } + [Export] + public class TestClassA666 + { + public TestClassA666() + { + } + } + [Export] + public class TestClassA667 + { + public TestClassA667() + { + } + } + [Export] + public class TestClassA668 + { + public TestClassA668() + { + } + } + [Export] + public class TestClassA669 + { + public TestClassA669() + { + } + } + [Export] + public class TestClassA670 + { + public TestClassA670() + { + } + } + [Export] + public class TestClassA671 + { + public TestClassA671() + { + } + } + [Export] + public class TestClassA672 + { + public TestClassA672() + { + } + } + [Export] + public class TestClassA673 + { + public TestClassA673() + { + } + } + [Export] + public class TestClassA674 + { + public TestClassA674() + { + } + } + [Export] + public class TestClassA675 + { + public TestClassA675() + { + } + } + [Export] + public class TestClassA676 + { + public TestClassA676() + { + } + } + [Export] + public class TestClassA677 + { + public TestClassA677() + { + } + } + [Export] + public class TestClassA678 + { + public TestClassA678() + { + } + } + [Export] + public class TestClassA679 + { + public TestClassA679() + { + } + } + [Export] + public class TestClassA680 + { + public TestClassA680() + { + } + } + [Export] + public class TestClassA681 + { + public TestClassA681() + { + } + } + [Export] + public class TestClassA682 + { + public TestClassA682() + { + } + } + [Export] + public class TestClassA683 + { + public TestClassA683() + { + } + } + [Export] + public class TestClassA684 + { + public TestClassA684() + { + } + } + [Export] + public class TestClassA685 + { + public TestClassA685() + { + } + } + [Export] + public class TestClassA686 + { + public TestClassA686() + { + } + } + [Export] + public class TestClassA687 + { + public TestClassA687() + { + } + } + [Export] + public class TestClassA688 + { + public TestClassA688() + { + } + } + [Export] + public class TestClassA689 + { + public TestClassA689() + { + } + } + [Export] + public class TestClassA690 + { + public TestClassA690() + { + } + } + [Export] + public class TestClassA691 + { + public TestClassA691() + { + } + } + [Export] + public class TestClassA692 + { + public TestClassA692() + { + } + } + [Export] + public class TestClassA693 + { + public TestClassA693() + { + } + } + [Export] + public class TestClassA694 + { + public TestClassA694() + { + } + } + [Export] + public class TestClassA695 + { + public TestClassA695() + { + } + } + [Export] + public class TestClassA696 + { + public TestClassA696() + { + } + } + [Export] + public class TestClassA697 + { + public TestClassA697() + { + } + } + [Export] + public class TestClassA698 + { + public TestClassA698() + { + } + } + [Export] + public class TestClassA699 + { + public TestClassA699() + { + } + } + [Export] + public class TestClassA700 + { + public TestClassA700() + { + } + } + [Export] + public class TestClassA701 + { + public TestClassA701() + { + } + } + [Export] + public class TestClassA702 + { + public TestClassA702() + { + } + } + [Export] + public class TestClassA703 + { + public TestClassA703() + { + } + } + [Export] + public class TestClassA704 + { + public TestClassA704() + { + } + } + [Export] + public class TestClassA705 + { + public TestClassA705() + { + } + } + [Export] + public class TestClassA706 + { + public TestClassA706() + { + } + } + [Export] + public class TestClassA707 + { + public TestClassA707() + { + } + } + [Export] + public class TestClassA708 + { + public TestClassA708() + { + } + } + [Export] + public class TestClassA709 + { + public TestClassA709() + { + } + } + [Export] + public class TestClassA710 + { + public TestClassA710() + { + } + } + [Export] + public class TestClassA711 + { + public TestClassA711() + { + } + } + [Export] + public class TestClassA712 + { + public TestClassA712() + { + } + } + [Export] + public class TestClassA713 + { + public TestClassA713() + { + } + } + [Export] + public class TestClassA714 + { + public TestClassA714() + { + } + } + [Export] + public class TestClassA715 + { + public TestClassA715() + { + } + } + [Export] + public class TestClassA716 + { + public TestClassA716() + { + } + } + [Export] + public class TestClassA717 + { + public TestClassA717() + { + } + } + [Export] + public class TestClassA718 + { + public TestClassA718() + { + } + } + [Export] + public class TestClassA719 + { + public TestClassA719() + { + } + } + [Export] + public class TestClassA720 + { + public TestClassA720() + { + } + } + [Export] + public class TestClassA721 + { + public TestClassA721() + { + } + } + [Export] + public class TestClassA722 + { + public TestClassA722() + { + } + } + [Export] + public class TestClassA723 + { + public TestClassA723() + { + } + } + [Export] + public class TestClassA724 + { + public TestClassA724() + { + } + } + [Export] + public class TestClassA725 + { + public TestClassA725() + { + } + } + [Export] + public class TestClassA726 + { + public TestClassA726() + { + } + } + [Export] + public class TestClassA727 + { + public TestClassA727() + { + } + } + [Export] + public class TestClassA728 + { + public TestClassA728() + { + } + } + [Export] + public class TestClassA729 + { + public TestClassA729() + { + } + } + [Export] + public class TestClassA730 + { + public TestClassA730() + { + } + } + [Export] + public class TestClassA731 + { + public TestClassA731() + { + } + } + [Export] + public class TestClassA732 + { + public TestClassA732() + { + } + } + [Export] + public class TestClassA733 + { + public TestClassA733() + { + } + } + [Export] + public class TestClassA734 + { + public TestClassA734() + { + } + } + [Export] + public class TestClassA735 + { + public TestClassA735() + { + } + } + [Export] + public class TestClassA736 + { + public TestClassA736() + { + } + } + [Export] + public class TestClassA737 + { + public TestClassA737() + { + } + } + [Export] + public class TestClassA738 + { + public TestClassA738() + { + } + } + [Export] + public class TestClassA739 + { + public TestClassA739() + { + } + } + [Export] + public class TestClassA740 + { + public TestClassA740() + { + } + } + [Export] + public class TestClassA741 + { + public TestClassA741() + { + } + } + [Export] + public class TestClassA742 + { + public TestClassA742() + { + } + } + [Export] + public class TestClassA743 + { + public TestClassA743() + { + } + } + [Export] + public class TestClassA744 + { + public TestClassA744() + { + } + } + [Export] + public class TestClassA745 + { + public TestClassA745() + { + } + } + [Export] + public class TestClassA746 + { + public TestClassA746() + { + } + } + [Export] + public class TestClassA747 + { + public TestClassA747() + { + } + } + [Export] + public class TestClassA748 + { + public TestClassA748() + { + } + } + [Export] + public class TestClassA749 + { + public TestClassA749() + { + } + } + [Export] + public class TestClassA750 + { + public TestClassA750() + { + } + } + [Export] + public class TestClassA751 + { + public TestClassA751() + { + } + } + [Export] + public class TestClassA752 + { + public TestClassA752() + { + } + } + [Export] + public class TestClassA753 + { + public TestClassA753() + { + } + } + [Export] + public class TestClassA754 + { + public TestClassA754() + { + } + } + [Export] + public class TestClassA755 + { + public TestClassA755() + { + } + } + [Export] + public class TestClassA756 + { + public TestClassA756() + { + } + } + [Export] + public class TestClassA757 + { + public TestClassA757() + { + } + } + [Export] + public class TestClassA758 + { + public TestClassA758() + { + } + } + [Export] + public class TestClassA759 + { + public TestClassA759() + { + } + } + [Export] + public class TestClassA760 + { + public TestClassA760() + { + } + } + [Export] + public class TestClassA761 + { + public TestClassA761() + { + } + } + [Export] + public class TestClassA762 + { + public TestClassA762() + { + } + } + [Export] + public class TestClassA763 + { + public TestClassA763() + { + } + } + [Export] + public class TestClassA764 + { + public TestClassA764() + { + } + } + [Export] + public class TestClassA765 + { + public TestClassA765() + { + } + } + [Export] + public class TestClassA766 + { + public TestClassA766() + { + } + } + [Export] + public class TestClassA767 + { + public TestClassA767() + { + } + } + [Export] + public class TestClassA768 + { + public TestClassA768() + { + } + } + [Export] + public class TestClassA769 + { + public TestClassA769() + { + } + } + [Export] + public class TestClassA770 + { + public TestClassA770() + { + } + } + [Export] + public class TestClassA771 + { + public TestClassA771() + { + } + } + [Export] + public class TestClassA772 + { + public TestClassA772() + { + } + } + [Export] + public class TestClassA773 + { + public TestClassA773() + { + } + } + [Export] + public class TestClassA774 + { + public TestClassA774() + { + } + } + [Export] + public class TestClassA775 + { + public TestClassA775() + { + } + } + [Export] + public class TestClassA776 + { + public TestClassA776() + { + } + } + [Export] + public class TestClassA777 + { + public TestClassA777() + { + } + } + [Export] + public class TestClassA778 + { + public TestClassA778() + { + } + } + [Export] + public class TestClassA779 + { + public TestClassA779() + { + } + } + [Export] + public class TestClassA780 + { + public TestClassA780() + { + } + } + [Export] + public class TestClassA781 + { + public TestClassA781() + { + } + } + [Export] + public class TestClassA782 + { + public TestClassA782() + { + } + } + [Export] + public class TestClassA783 + { + public TestClassA783() + { + } + } + [Export] + public class TestClassA784 + { + public TestClassA784() + { + } + } + [Export] + public class TestClassA785 + { + public TestClassA785() + { + } + } + [Export] + public class TestClassA786 + { + public TestClassA786() + { + } + } + [Export] + public class TestClassA787 + { + public TestClassA787() + { + } + } + [Export] + public class TestClassA788 + { + public TestClassA788() + { + } + } + [Export] + public class TestClassA789 + { + public TestClassA789() + { + } + } + [Export] + public class TestClassA790 + { + public TestClassA790() + { + } + } + [Export] + public class TestClassA791 + { + public TestClassA791() + { + } + } + [Export] + public class TestClassA792 + { + public TestClassA792() + { + } + } + [Export] + public class TestClassA793 + { + public TestClassA793() + { + } + } + [Export] + public class TestClassA794 + { + public TestClassA794() + { + } + } + [Export] + public class TestClassA795 + { + public TestClassA795() + { + } + } + [Export] + public class TestClassA796 + { + public TestClassA796() + { + } + } + [Export] + public class TestClassA797 + { + public TestClassA797() + { + } + } + [Export] + public class TestClassA798 + { + public TestClassA798() + { + } + } + [Export] + public class TestClassA799 + { + public TestClassA799() + { + } + } + [Export] + public class TestClassA800 + { + public TestClassA800() + { + } + } + [Export] + public class TestClassA801 + { + public TestClassA801() + { + } + } + [Export] + public class TestClassA802 + { + public TestClassA802() + { + } + } + [Export] + public class TestClassA803 + { + public TestClassA803() + { + } + } + [Export] + public class TestClassA804 + { + public TestClassA804() + { + } + } + [Export] + public class TestClassA805 + { + public TestClassA805() + { + } + } + [Export] + public class TestClassA806 + { + public TestClassA806() + { + } + } + [Export] + public class TestClassA807 + { + public TestClassA807() + { + } + } + [Export] + public class TestClassA808 + { + public TestClassA808() + { + } + } + [Export] + public class TestClassA809 + { + public TestClassA809() + { + } + } + [Export] + public class TestClassA810 + { + public TestClassA810() + { + } + } + [Export] + public class TestClassA811 + { + public TestClassA811() + { + } + } + [Export] + public class TestClassA812 + { + public TestClassA812() + { + } + } + [Export] + public class TestClassA813 + { + public TestClassA813() + { + } + } + [Export] + public class TestClassA814 + { + public TestClassA814() + { + } + } + [Export] + public class TestClassA815 + { + public TestClassA815() + { + } + } + [Export] + public class TestClassA816 + { + public TestClassA816() + { + } + } + [Export] + public class TestClassA817 + { + public TestClassA817() + { + } + } + [Export] + public class TestClassA818 + { + public TestClassA818() + { + } + } + [Export] + public class TestClassA819 + { + public TestClassA819() + { + } + } + [Export] + public class TestClassA820 + { + public TestClassA820() + { + } + } + [Export] + public class TestClassA821 + { + public TestClassA821() + { + } + } + [Export] + public class TestClassA822 + { + public TestClassA822() + { + } + } + [Export] + public class TestClassA823 + { + public TestClassA823() + { + } + } + [Export] + public class TestClassA824 + { + public TestClassA824() + { + } + } + [Export] + public class TestClassA825 + { + public TestClassA825() + { + } + } + [Export] + public class TestClassA826 + { + public TestClassA826() + { + } + } + [Export] + public class TestClassA827 + { + public TestClassA827() + { + } + } + [Export] + public class TestClassA828 + { + public TestClassA828() + { + } + } + [Export] + public class TestClassA829 + { + public TestClassA829() + { + } + } + [Export] + public class TestClassA830 + { + public TestClassA830() + { + } + } + [Export] + public class TestClassA831 + { + public TestClassA831() + { + } + } + [Export] + public class TestClassA832 + { + public TestClassA832() + { + } + } + [Export] + public class TestClassA833 + { + public TestClassA833() + { + } + } + [Export] + public class TestClassA834 + { + public TestClassA834() + { + } + } + [Export] + public class TestClassA835 + { + public TestClassA835() + { + } + } + [Export] + public class TestClassA836 + { + public TestClassA836() + { + } + } + [Export] + public class TestClassA837 + { + public TestClassA837() + { + } + } + [Export] + public class TestClassA838 + { + public TestClassA838() + { + } + } + [Export] + public class TestClassA839 + { + public TestClassA839() + { + } + } + [Export] + public class TestClassA840 + { + public TestClassA840() + { + } + } + [Export] + public class TestClassA841 + { + public TestClassA841() + { + } + } + [Export] + public class TestClassA842 + { + public TestClassA842() + { + } + } + [Export] + public class TestClassA843 + { + public TestClassA843() + { + } + } + [Export] + public class TestClassA844 + { + public TestClassA844() + { + } + } + [Export] + public class TestClassA845 + { + public TestClassA845() + { + } + } + [Export] + public class TestClassA846 + { + public TestClassA846() + { + } + } + [Export] + public class TestClassA847 + { + public TestClassA847() + { + } + } + [Export] + public class TestClassA848 + { + public TestClassA848() + { + } + } + [Export] + public class TestClassA849 + { + public TestClassA849() + { + } + } + [Export] + public class TestClassA850 + { + public TestClassA850() + { + } + } + [Export] + public class TestClassA851 + { + public TestClassA851() + { + } + } + [Export] + public class TestClassA852 + { + public TestClassA852() + { + } + } + [Export] + public class TestClassA853 + { + public TestClassA853() + { + } + } + [Export] + public class TestClassA854 + { + public TestClassA854() + { + } + } + [Export] + public class TestClassA855 + { + public TestClassA855() + { + } + } + [Export] + public class TestClassA856 + { + public TestClassA856() + { + } + } + [Export] + public class TestClassA857 + { + public TestClassA857() + { + } + } + [Export] + public class TestClassA858 + { + public TestClassA858() + { + } + } + [Export] + public class TestClassA859 + { + public TestClassA859() + { + } + } + [Export] + public class TestClassA860 + { + public TestClassA860() + { + } + } + [Export] + public class TestClassA861 + { + public TestClassA861() + { + } + } + [Export] + public class TestClassA862 + { + public TestClassA862() + { + } + } + [Export] + public class TestClassA863 + { + public TestClassA863() + { + } + } + [Export] + public class TestClassA864 + { + public TestClassA864() + { + } + } + [Export] + public class TestClassA865 + { + public TestClassA865() + { + } + } + [Export] + public class TestClassA866 + { + public TestClassA866() + { + } + } + [Export] + public class TestClassA867 + { + public TestClassA867() + { + } + } + [Export] + public class TestClassA868 + { + public TestClassA868() + { + } + } + [Export] + public class TestClassA869 + { + public TestClassA869() + { + } + } + [Export] + public class TestClassA870 + { + public TestClassA870() + { + } + } + [Export] + public class TestClassA871 + { + public TestClassA871() + { + } + } + [Export] + public class TestClassA872 + { + public TestClassA872() + { + } + } + [Export] + public class TestClassA873 + { + public TestClassA873() + { + } + } + [Export] + public class TestClassA874 + { + public TestClassA874() + { + } + } + [Export] + public class TestClassA875 + { + public TestClassA875() + { + } + } + [Export] + public class TestClassA876 + { + public TestClassA876() + { + } + } + [Export] + public class TestClassA877 + { + public TestClassA877() + { + } + } + [Export] + public class TestClassA878 + { + public TestClassA878() + { + } + } + [Export] + public class TestClassA879 + { + public TestClassA879() + { + } + } + [Export] + public class TestClassA880 + { + public TestClassA880() + { + } + } + [Export] + public class TestClassA881 + { + public TestClassA881() + { + } + } + [Export] + public class TestClassA882 + { + public TestClassA882() + { + } + } + [Export] + public class TestClassA883 + { + public TestClassA883() + { + } + } + [Export] + public class TestClassA884 + { + public TestClassA884() + { + } + } + [Export] + public class TestClassA885 + { + public TestClassA885() + { + } + } + [Export] + public class TestClassA886 + { + public TestClassA886() + { + } + } + [Export] + public class TestClassA887 + { + public TestClassA887() + { + } + } + [Export] + public class TestClassA888 + { + public TestClassA888() + { + } + } + [Export] + public class TestClassA889 + { + public TestClassA889() + { + } + } + [Export] + public class TestClassA890 + { + public TestClassA890() + { + } + } + [Export] + public class TestClassA891 + { + public TestClassA891() + { + } + } + [Export] + public class TestClassA892 + { + public TestClassA892() + { + } + } + [Export] + public class TestClassA893 + { + public TestClassA893() + { + } + } + [Export] + public class TestClassA894 + { + public TestClassA894() + { + } + } + [Export] + public class TestClassA895 + { + public TestClassA895() + { + } + } + [Export] + public class TestClassA896 + { + public TestClassA896() + { + } + } + [Export] + public class TestClassA897 + { + public TestClassA897() + { + } + } + [Export] + public class TestClassA898 + { + public TestClassA898() + { + } + } + [Export] + public class TestClassA899 + { + public TestClassA899() + { + } + } + [Export] + public class TestClassA900 + { + public TestClassA900() + { + } + } + [Export] + public class TestClassA901 + { + public TestClassA901() + { + } + } + [Export] + public class TestClassA902 + { + public TestClassA902() + { + } + } + [Export] + public class TestClassA903 + { + public TestClassA903() + { + } + } + [Export] + public class TestClassA904 + { + public TestClassA904() + { + } + } + [Export] + public class TestClassA905 + { + public TestClassA905() + { + } + } + [Export] + public class TestClassA906 + { + public TestClassA906() + { + } + } + [Export] + public class TestClassA907 + { + public TestClassA907() + { + } + } + [Export] + public class TestClassA908 + { + public TestClassA908() + { + } + } + [Export] + public class TestClassA909 + { + public TestClassA909() + { + } + } + [Export] + public class TestClassA910 + { + public TestClassA910() + { + } + } + [Export] + public class TestClassA911 + { + public TestClassA911() + { + } + } + [Export] + public class TestClassA912 + { + public TestClassA912() + { + } + } + [Export] + public class TestClassA913 + { + public TestClassA913() + { + } + } + [Export] + public class TestClassA914 + { + public TestClassA914() + { + } + } + [Export] + public class TestClassA915 + { + public TestClassA915() + { + } + } + [Export] + public class TestClassA916 + { + public TestClassA916() + { + } + } + [Export] + public class TestClassA917 + { + public TestClassA917() + { + } + } + [Export] + public class TestClassA918 + { + public TestClassA918() + { + } + } + [Export] + public class TestClassA919 + { + public TestClassA919() + { + } + } + [Export] + public class TestClassA920 + { + public TestClassA920() + { + } + } + [Export] + public class TestClassA921 + { + public TestClassA921() + { + } + } + [Export] + public class TestClassA922 + { + public TestClassA922() + { + } + } + [Export] + public class TestClassA923 + { + public TestClassA923() + { + } + } + [Export] + public class TestClassA924 + { + public TestClassA924() + { + } + } + [Export] + public class TestClassA925 + { + public TestClassA925() + { + } + } + [Export] + public class TestClassA926 + { + public TestClassA926() + { + } + } + [Export] + public class TestClassA927 + { + public TestClassA927() + { + } + } + [Export] + public class TestClassA928 + { + public TestClassA928() + { + } + } + [Export] + public class TestClassA929 + { + public TestClassA929() + { + } + } + [Export] + public class TestClassA930 + { + public TestClassA930() + { + } + } + [Export] + public class TestClassA931 + { + public TestClassA931() + { + } + } + [Export] + public class TestClassA932 + { + public TestClassA932() + { + } + } + [Export] + public class TestClassA933 + { + public TestClassA933() + { + } + } + [Export] + public class TestClassA934 + { + public TestClassA934() + { + } + } + [Export] + public class TestClassA935 + { + public TestClassA935() + { + } + } + [Export] + public class TestClassA936 + { + public TestClassA936() + { + } + } + [Export] + public class TestClassA937 + { + public TestClassA937() + { + } + } + [Export] + public class TestClassA938 + { + public TestClassA938() + { + } + } + [Export] + public class TestClassA939 + { + public TestClassA939() + { + } + } + [Export] + public class TestClassA940 + { + public TestClassA940() + { + } + } + [Export] + public class TestClassA941 + { + public TestClassA941() + { + } + } + [Export] + public class TestClassA942 + { + public TestClassA942() + { + } + } + [Export] + public class TestClassA943 + { + public TestClassA943() + { + } + } + [Export] + public class TestClassA944 + { + public TestClassA944() + { + } + } + [Export] + public class TestClassA945 + { + public TestClassA945() + { + } + } + [Export] + public class TestClassA946 + { + public TestClassA946() + { + } + } + [Export] + public class TestClassA947 + { + public TestClassA947() + { + } + } + [Export] + public class TestClassA948 + { + public TestClassA948() + { + } + } + [Export] + public class TestClassA949 + { + public TestClassA949() + { + } + } + [Export] + public class TestClassA950 + { + public TestClassA950() + { + } + } + [Export] + public class TestClassA951 + { + public TestClassA951() + { + } + } + [Export] + public class TestClassA952 + { + public TestClassA952() + { + } + } + [Export] + public class TestClassA953 + { + public TestClassA953() + { + } + } + [Export] + public class TestClassA954 + { + public TestClassA954() + { + } + } + [Export] + public class TestClassA955 + { + public TestClassA955() + { + } + } + [Export] + public class TestClassA956 + { + public TestClassA956() + { + } + } + [Export] + public class TestClassA957 + { + public TestClassA957() + { + } + } + [Export] + public class TestClassA958 + { + public TestClassA958() + { + } + } + [Export] + public class TestClassA959 + { + public TestClassA959() + { + } + } + [Export] + public class TestClassA960 + { + public TestClassA960() + { + } + } + [Export] + public class TestClassA961 + { + public TestClassA961() + { + } + } + [Export] + public class TestClassA962 + { + public TestClassA962() + { + } + } + [Export] + public class TestClassA963 + { + public TestClassA963() + { + } + } + [Export] + public class TestClassA964 + { + public TestClassA964() + { + } + } + [Export] + public class TestClassA965 + { + public TestClassA965() + { + } + } + [Export] + public class TestClassA966 + { + public TestClassA966() + { + } + } + [Export] + public class TestClassA967 + { + public TestClassA967() + { + } + } + [Export] + public class TestClassA968 + { + public TestClassA968() + { + } + } + [Export] + public class TestClassA969 + { + public TestClassA969() + { + } + } + [Export] + public class TestClassA970 + { + public TestClassA970() + { + } + } + [Export] + public class TestClassA971 + { + public TestClassA971() + { + } + } + [Export] + public class TestClassA972 + { + public TestClassA972() + { + } + } + [Export] + public class TestClassA973 + { + public TestClassA973() + { + } + } + [Export] + public class TestClassA974 + { + public TestClassA974() + { + } + } + [Export] + public class TestClassA975 + { + public TestClassA975() + { + } + } + [Export] + public class TestClassA976 + { + public TestClassA976() + { + } + } + [Export] + public class TestClassA977 + { + public TestClassA977() + { + } + } + [Export] + public class TestClassA978 + { + public TestClassA978() + { + } + } + [Export] + public class TestClassA979 + { + public TestClassA979() + { + } + } + [Export] + public class TestClassA980 + { + public TestClassA980() + { + } + } + [Export] + public class TestClassA981 + { + public TestClassA981() + { + } + } + [Export] + public class TestClassA982 + { + public TestClassA982() + { + } + } + [Export] + public class TestClassA983 + { + public TestClassA983() + { + } + } + [Export] + public class TestClassA984 + { + public TestClassA984() + { + } + } + [Export] + public class TestClassA985 + { + public TestClassA985() + { + } + } + [Export] + public class TestClassA986 + { + public TestClassA986() + { + } + } + [Export] + public class TestClassA987 + { + public TestClassA987() + { + } + } + [Export] + public class TestClassA988 + { + public TestClassA988() + { + } + } + [Export] + public class TestClassA989 + { + public TestClassA989() + { + } + } + [Export] + public class TestClassA990 + { + public TestClassA990() + { + } + } + [Export] + public class TestClassA991 + { + public TestClassA991() + { + } + } + [Export] + public class TestClassA992 + { + public TestClassA992() + { + } + } + [Export] + public class TestClassA993 + { + public TestClassA993() + { + } + } + [Export] + public class TestClassA994 + { + public TestClassA994() + { + } + } + [Export] + public class TestClassA995 + { + public TestClassA995() + { + } + } + [Export] + public class TestClassA996 + { + public TestClassA996() + { + } + } + [Export] + public class TestClassA997 + { + public TestClassA997() + { + } + } + [Export] + public class TestClassA998 + { + public TestClassA998() + { + } + } + [Export] + public class TestClassA999 + { + public TestClassA999() + { + } + } + [Export] + public class TestClassA1000 + { + public TestClassA1000() + { + } + } + [Export] + public class TestClassA1001 + { + public TestClassA1001() + { + } + } + [Export] + public class TestClassA1002 + { + public TestClassA1002() + { + } + } + [Export] + public class TestClassA1003 + { + public TestClassA1003() + { + } + } + [Export] + public class TestClassA1004 + { + public TestClassA1004() + { + } + } + [Export] + public class TestClassA1005 + { + public TestClassA1005() + { + } + } + [Export] + public class TestClassA1006 + { + public TestClassA1006() + { + } + } + [Export] + public class TestClassA1007 + { + public TestClassA1007() + { + } + } + [Export] + public class TestClassA1008 + { + public TestClassA1008() + { + } + } + [Export] + public class TestClassA1009 + { + public TestClassA1009() + { + } + } + [Export] + public class TestClassA1010 + { + public TestClassA1010() + { + } + } + [Export] + public class TestClassA1011 + { + public TestClassA1011() + { + } + } + [Export] + public class TestClassA1012 + { + public TestClassA1012() + { + } + } + [Export] + public class TestClassA1013 + { + public TestClassA1013() + { + } + } + [Export] + public class TestClassA1014 + { + public TestClassA1014() + { + } + } + [Export] + public class TestClassA1015 + { + public TestClassA1015() + { + } + } + [Export] + public class TestClassA1016 + { + public TestClassA1016() + { + } + } + [Export] + public class TestClassA1017 + { + public TestClassA1017() + { + } + } + [Export] + public class TestClassA1018 + { + public TestClassA1018() + { + } + } + [Export] + public class TestClassA1019 + { + public TestClassA1019() + { + } + } + [Export] + public class TestClassA1020 + { + public TestClassA1020() + { + } + } + [Export] + public class TestClassA1021 + { + public TestClassA1021() + { + } + } + [Export] + public class TestClassA1022 + { + public TestClassA1022() + { + } + } + [Export] + public class TestClassA1023 + { + public TestClassA1023() + { + } + } + [Export] + public class TestClassA1024 + { + public TestClassA1024() + { + } + } + [Export] + public class TestClassA1025 + { + public TestClassA1025() + { + } + } + [Export] + public class TestClassA1026 + { + public TestClassA1026() + { + } + } + [Export] + public class TestClassA1027 + { + public TestClassA1027() + { + } + } + [Export] + public class TestClassA1028 + { + public TestClassA1028() + { + } + } + [Export] + public class TestClassA1029 + { + public TestClassA1029() + { + } + } + [Export] + public class TestClassA1030 + { + public TestClassA1030() + { + } + } + [Export] + public class TestClassA1031 + { + public TestClassA1031() + { + } + } + [Export] + public class TestClassA1032 + { + public TestClassA1032() + { + } + } + [Export] + public class TestClassA1033 + { + public TestClassA1033() + { + } + } + [Export] + public class TestClassA1034 + { + public TestClassA1034() + { + } + } + [Export] + public class TestClassA1035 + { + public TestClassA1035() + { + } + } + [Export] + public class TestClassA1036 + { + public TestClassA1036() + { + } + } + [Export] + public class TestClassA1037 + { + public TestClassA1037() + { + } + } + [Export] + public class TestClassA1038 + { + public TestClassA1038() + { + } + } + [Export] + public class TestClassA1039 + { + public TestClassA1039() + { + } + } + [Export] + public class TestClassA1040 + { + public TestClassA1040() + { + } + } + [Export] + public class TestClassA1041 + { + public TestClassA1041() + { + } + } + [Export] + public class TestClassA1042 + { + public TestClassA1042() + { + } + } + [Export] + public class TestClassA1043 + { + public TestClassA1043() + { + } + } + [Export] + public class TestClassA1044 + { + public TestClassA1044() + { + } + } + [Export] + public class TestClassA1045 + { + public TestClassA1045() + { + } + } + [Export] + public class TestClassA1046 + { + public TestClassA1046() + { + } + } + [Export] + public class TestClassA1047 + { + public TestClassA1047() + { + } + } + [Export] + public class TestClassA1048 + { + public TestClassA1048() + { + } + } + [Export] + public class TestClassA1049 + { + public TestClassA1049() + { + } + } + [Export] + public class TestClassA1050 + { + public TestClassA1050() + { + } + } + [Export] + public class TestClassA1051 + { + public TestClassA1051() + { + } + } + [Export] + public class TestClassA1052 + { + public TestClassA1052() + { + } + } + [Export] + public class TestClassA1053 + { + public TestClassA1053() + { + } + } + [Export] + public class TestClassA1054 + { + public TestClassA1054() + { + } + } + [Export] + public class TestClassA1055 + { + public TestClassA1055() + { + } + } + [Export] + public class TestClassA1056 + { + public TestClassA1056() + { + } + } + [Export] + public class TestClassA1057 + { + public TestClassA1057() + { + } + } + [Export] + public class TestClassA1058 + { + public TestClassA1058() + { + } + } + [Export] + public class TestClassA1059 + { + public TestClassA1059() + { + } + } + [Export] + public class TestClassA1060 + { + public TestClassA1060() + { + } + } + [Export] + public class TestClassA1061 + { + public TestClassA1061() + { + } + } + [Export] + public class TestClassA1062 + { + public TestClassA1062() + { + } + } + [Export] + public class TestClassA1063 + { + public TestClassA1063() + { + } + } + [Export] + public class TestClassA1064 + { + public TestClassA1064() + { + } + } + [Export] + public class TestClassA1065 + { + public TestClassA1065() + { + } + } + [Export] + public class TestClassA1066 + { + public TestClassA1066() + { + } + } + [Export] + public class TestClassA1067 + { + public TestClassA1067() + { + } + } + [Export] + public class TestClassA1068 + { + public TestClassA1068() + { + } + } + [Export] + public class TestClassA1069 + { + public TestClassA1069() + { + } + } + [Export] + public class TestClassA1070 + { + public TestClassA1070() + { + } + } + [Export] + public class TestClassA1071 + { + public TestClassA1071() + { + } + } + [Export] + public class TestClassA1072 + { + public TestClassA1072() + { + } + } + [Export] + public class TestClassA1073 + { + public TestClassA1073() + { + } + } + [Export] + public class TestClassA1074 + { + public TestClassA1074() + { + } + } + [Export] + public class TestClassA1075 + { + public TestClassA1075() + { + } + } + [Export] + public class TestClassA1076 + { + public TestClassA1076() + { + } + } + [Export] + public class TestClassA1077 + { + public TestClassA1077() + { + } + } + [Export] + public class TestClassA1078 + { + public TestClassA1078() + { + } + } + [Export] + public class TestClassA1079 + { + public TestClassA1079() + { + } + } + [Export] + public class TestClassA1080 + { + public TestClassA1080() + { + } + } + [Export] + public class TestClassA1081 + { + public TestClassA1081() + { + } + } + [Export] + public class TestClassA1082 + { + public TestClassA1082() + { + } + } + [Export] + public class TestClassA1083 + { + public TestClassA1083() + { + } + } + [Export] + public class TestClassA1084 + { + public TestClassA1084() + { + } + } + [Export] + public class TestClassA1085 + { + public TestClassA1085() + { + } + } + [Export] + public class TestClassA1086 + { + public TestClassA1086() + { + } + } + [Export] + public class TestClassA1087 + { + public TestClassA1087() + { + } + } + [Export] + public class TestClassA1088 + { + public TestClassA1088() + { + } + } + [Export] + public class TestClassA1089 + { + public TestClassA1089() + { + } + } + [Export] + public class TestClassA1090 + { + public TestClassA1090() + { + } + } + [Export] + public class TestClassA1091 + { + public TestClassA1091() + { + } + } + [Export] + public class TestClassA1092 + { + public TestClassA1092() + { + } + } + [Export] + public class TestClassA1093 + { + public TestClassA1093() + { + } + } + [Export] + public class TestClassA1094 + { + public TestClassA1094() + { + } + } + [Export] + public class TestClassA1095 + { + public TestClassA1095() + { + } + } + [Export] + public class TestClassA1096 + { + public TestClassA1096() + { + } + } + [Export] + public class TestClassA1097 + { + public TestClassA1097() + { + } + } + [Export] + public class TestClassA1098 + { + public TestClassA1098() + { + } + } + [Export] + public class TestClassA1099 + { + public TestClassA1099() + { + } + } + [Export] + public class TestClassA1100 + { + public TestClassA1100() + { + } + } + [Export] + public class TestClassA1101 + { + public TestClassA1101() + { + } + } + [Export] + public class TestClassA1102 + { + public TestClassA1102() + { + } + } + [Export] + public class TestClassA1103 + { + public TestClassA1103() + { + } + } + [Export] + public class TestClassA1104 + { + public TestClassA1104() + { + } + } + [Export] + public class TestClassA1105 + { + public TestClassA1105() + { + } + } + [Export] + public class TestClassA1106 + { + public TestClassA1106() + { + } + } + [Export] + public class TestClassA1107 + { + public TestClassA1107() + { + } + } + [Export] + public class TestClassA1108 + { + public TestClassA1108() + { + } + } + [Export] + public class TestClassA1109 + { + public TestClassA1109() + { + } + } + [Export] + public class TestClassA1110 + { + public TestClassA1110() + { + } + } + [Export] + public class TestClassA1111 + { + public TestClassA1111() + { + } + } + [Export] + public class TestClassA1112 + { + public TestClassA1112() + { + } + } + [Export] + public class TestClassA1113 + { + public TestClassA1113() + { + } + } + [Export] + public class TestClassA1114 + { + public TestClassA1114() + { + } + } + [Export] + public class TestClassA1115 + { + public TestClassA1115() + { + } + } + [Export] + public class TestClassA1116 + { + public TestClassA1116() + { + } + } + [Export] + public class TestClassA1117 + { + public TestClassA1117() + { + } + } + [Export] + public class TestClassA1118 + { + public TestClassA1118() + { + } + } + [Export] + public class TestClassA1119 + { + public TestClassA1119() + { + } + } + [Export] + public class TestClassA1120 + { + public TestClassA1120() + { + } + } + [Export] + public class TestClassA1121 + { + public TestClassA1121() + { + } + } + [Export] + public class TestClassA1122 + { + public TestClassA1122() + { + } + } + [Export] + public class TestClassA1123 + { + public TestClassA1123() + { + } + } + [Export] + public class TestClassA1124 + { + public TestClassA1124() + { + } + } + [Export] + public class TestClassA1125 + { + public TestClassA1125() + { + } + } + [Export] + public class TestClassA1126 + { + public TestClassA1126() + { + } + } + [Export] + public class TestClassA1127 + { + public TestClassA1127() + { + } + } + [Export] + public class TestClassA1128 + { + public TestClassA1128() + { + } + } + [Export] + public class TestClassA1129 + { + public TestClassA1129() + { + } + } + [Export] + public class TestClassA1130 + { + public TestClassA1130() + { + } + } + [Export] + public class TestClassA1131 + { + public TestClassA1131() + { + } + } + [Export] + public class TestClassA1132 + { + public TestClassA1132() + { + } + } + [Export] + public class TestClassA1133 + { + public TestClassA1133() + { + } + } + [Export] + public class TestClassA1134 + { + public TestClassA1134() + { + } + } + [Export] + public class TestClassA1135 + { + public TestClassA1135() + { + } + } + [Export] + public class TestClassA1136 + { + public TestClassA1136() + { + } + } + [Export] + public class TestClassA1137 + { + public TestClassA1137() + { + } + } + [Export] + public class TestClassA1138 + { + public TestClassA1138() + { + } + } + [Export] + public class TestClassA1139 + { + public TestClassA1139() + { + } + } + [Export] + public class TestClassA1140 + { + public TestClassA1140() + { + } + } + [Export] + public class TestClassA1141 + { + public TestClassA1141() + { + } + } + [Export] + public class TestClassA1142 + { + public TestClassA1142() + { + } + } + [Export] + public class TestClassA1143 + { + public TestClassA1143() + { + } + } + [Export] + public class TestClassA1144 + { + public TestClassA1144() + { + } + } + [Export] + public class TestClassA1145 + { + public TestClassA1145() + { + } + } + [Export] + public class TestClassA1146 + { + public TestClassA1146() + { + } + } + [Export] + public class TestClassA1147 + { + public TestClassA1147() + { + } + } + [Export] + public class TestClassA1148 + { + public TestClassA1148() + { + } + } + [Export] + public class TestClassA1149 + { + public TestClassA1149() + { + } + } + [Export] + public class TestClassA1150 + { + public TestClassA1150() + { + } + } + [Export] + public class TestClassA1151 + { + public TestClassA1151() + { + } + } + [Export] + public class TestClassA1152 + { + public TestClassA1152() + { + } + } + [Export] + public class TestClassA1153 + { + public TestClassA1153() + { + } + } + [Export] + public class TestClassA1154 + { + public TestClassA1154() + { + } + } + [Export] + public class TestClassA1155 + { + public TestClassA1155() + { + } + } + [Export] + public class TestClassA1156 + { + public TestClassA1156() + { + } + } + [Export] + public class TestClassA1157 + { + public TestClassA1157() + { + } + } + [Export] + public class TestClassA1158 + { + public TestClassA1158() + { + } + } + [Export] + public class TestClassA1159 + { + public TestClassA1159() + { + } + } + [Export] + public class TestClassA1160 + { + public TestClassA1160() + { + } + } + [Export] + public class TestClassA1161 + { + public TestClassA1161() + { + } + } + [Export] + public class TestClassA1162 + { + public TestClassA1162() + { + } + } + [Export] + public class TestClassA1163 + { + public TestClassA1163() + { + } + } + [Export] + public class TestClassA1164 + { + public TestClassA1164() + { + } + } + [Export] + public class TestClassA1165 + { + public TestClassA1165() + { + } + } + [Export] + public class TestClassA1166 + { + public TestClassA1166() + { + } + } + [Export] + public class TestClassA1167 + { + public TestClassA1167() + { + } + } + [Export] + public class TestClassA1168 + { + public TestClassA1168() + { + } + } + [Export] + public class TestClassA1169 + { + public TestClassA1169() + { + } + } + [Export] + public class TestClassA1170 + { + public TestClassA1170() + { + } + } + [Export] + public class TestClassA1171 + { + public TestClassA1171() + { + } + } + [Export] + public class TestClassA1172 + { + public TestClassA1172() + { + } + } + [Export] + public class TestClassA1173 + { + public TestClassA1173() + { + } + } + [Export] + public class TestClassA1174 + { + public TestClassA1174() + { + } + } + [Export] + public class TestClassA1175 + { + public TestClassA1175() + { + } + } + [Export] + public class TestClassA1176 + { + public TestClassA1176() + { + } + } + [Export] + public class TestClassA1177 + { + public TestClassA1177() + { + } + } + [Export] + public class TestClassA1178 + { + public TestClassA1178() + { + } + } + [Export] + public class TestClassA1179 + { + public TestClassA1179() + { + } + } + [Export] + public class TestClassA1180 + { + public TestClassA1180() + { + } + } + [Export] + public class TestClassA1181 + { + public TestClassA1181() + { + } + } + [Export] + public class TestClassA1182 + { + public TestClassA1182() + { + } + } + [Export] + public class TestClassA1183 + { + public TestClassA1183() + { + } + } + [Export] + public class TestClassA1184 + { + public TestClassA1184() + { + } + } + [Export] + public class TestClassA1185 + { + public TestClassA1185() + { + } + } + [Export] + public class TestClassA1186 + { + public TestClassA1186() + { + } + } + [Export] + public class TestClassA1187 + { + public TestClassA1187() + { + } + } + [Export] + public class TestClassA1188 + { + public TestClassA1188() + { + } + } + [Export] + public class TestClassA1189 + { + public TestClassA1189() + { + } + } + [Export] + public class TestClassA1190 + { + public TestClassA1190() + { + } + } + [Export] + public class TestClassA1191 + { + public TestClassA1191() + { + } + } + [Export] + public class TestClassA1192 + { + public TestClassA1192() + { + } + } + [Export] + public class TestClassA1193 + { + public TestClassA1193() + { + } + } + [Export] + public class TestClassA1194 + { + public TestClassA1194() + { + } + } + [Export] + public class TestClassA1195 + { + public TestClassA1195() + { + } + } + [Export] + public class TestClassA1196 + { + public TestClassA1196() + { + } + } + [Export] + public class TestClassA1197 + { + public TestClassA1197() + { + } + } + [Export] + public class TestClassA1198 + { + public TestClassA1198() + { + } + } + [Export] + public class TestClassA1199 + { + public TestClassA1199() + { + } + } + [Export] + public class TestClassA1200 + { + public TestClassA1200() + { + } + } + [Export] + public class TestClassA1201 + { + public TestClassA1201() + { + } + } + [Export] + public class TestClassA1202 + { + public TestClassA1202() + { + } + } + [Export] + public class TestClassA1203 + { + public TestClassA1203() + { + } + } + [Export] + public class TestClassA1204 + { + public TestClassA1204() + { + } + } + [Export] + public class TestClassA1205 + { + public TestClassA1205() + { + } + } + [Export] + public class TestClassA1206 + { + public TestClassA1206() + { + } + } + [Export] + public class TestClassA1207 + { + public TestClassA1207() + { + } + } + [Export] + public class TestClassA1208 + { + public TestClassA1208() + { + } + } + [Export] + public class TestClassA1209 + { + public TestClassA1209() + { + } + } + [Export] + public class TestClassA1210 + { + public TestClassA1210() + { + } + } + [Export] + public class TestClassA1211 + { + public TestClassA1211() + { + } + } + [Export] + public class TestClassA1212 + { + public TestClassA1212() + { + } + } + [Export] + public class TestClassA1213 + { + public TestClassA1213() + { + } + } + [Export] + public class TestClassA1214 + { + public TestClassA1214() + { + } + } + [Export] + public class TestClassA1215 + { + public TestClassA1215() + { + } + } + [Export] + public class TestClassA1216 + { + public TestClassA1216() + { + } + } + [Export] + public class TestClassA1217 + { + public TestClassA1217() + { + } + } + [Export] + public class TestClassA1218 + { + public TestClassA1218() + { + } + } + [Export] + public class TestClassA1219 + { + public TestClassA1219() + { + } + } + [Export] + public class TestClassA1220 + { + public TestClassA1220() + { + } + } + [Export] + public class TestClassA1221 + { + public TestClassA1221() + { + } + } + [Export] + public class TestClassA1222 + { + public TestClassA1222() + { + } + } + [Export] + public class TestClassA1223 + { + public TestClassA1223() + { + } + } + [Export] + public class TestClassA1224 + { + public TestClassA1224() + { + } + } + [Export] + public class TestClassA1225 + { + public TestClassA1225() + { + } + } + [Export] + public class TestClassA1226 + { + public TestClassA1226() + { + } + } + [Export] + public class TestClassA1227 + { + public TestClassA1227() + { + } + } + [Export] + public class TestClassA1228 + { + public TestClassA1228() + { + } + } + [Export] + public class TestClassA1229 + { + public TestClassA1229() + { + } + } + [Export] + public class TestClassA1230 + { + public TestClassA1230() + { + } + } + [Export] + public class TestClassA1231 + { + public TestClassA1231() + { + } + } + [Export] + public class TestClassA1232 + { + public TestClassA1232() + { + } + } + [Export] + public class TestClassA1233 + { + public TestClassA1233() + { + } + } + [Export] + public class TestClassA1234 + { + public TestClassA1234() + { + } + } + [Export] + public class TestClassA1235 + { + public TestClassA1235() + { + } + } + [Export] + public class TestClassA1236 + { + public TestClassA1236() + { + } + } + [Export] + public class TestClassA1237 + { + public TestClassA1237() + { + } + } + [Export] + public class TestClassA1238 + { + public TestClassA1238() + { + } + } + [Export] + public class TestClassA1239 + { + public TestClassA1239() + { + } + } + [Export] + public class TestClassA1240 + { + public TestClassA1240() + { + } + } + [Export] + public class TestClassA1241 + { + public TestClassA1241() + { + } + } + [Export] + public class TestClassA1242 + { + public TestClassA1242() + { + } + } + [Export] + public class TestClassA1243 + { + public TestClassA1243() + { + } + } + [Export] + public class TestClassA1244 + { + public TestClassA1244() + { + } + } + [Export] + public class TestClassA1245 + { + public TestClassA1245() + { + } + } + [Export] + public class TestClassA1246 + { + public TestClassA1246() + { + } + } + [Export] + public class TestClassA1247 + { + public TestClassA1247() + { + } + } + [Export] + public class TestClassA1248 + { + public TestClassA1248() + { + } + } + [Export] + public class TestClassA1249 + { + public TestClassA1249() + { + } + } + [Export] + public class TestClassA1250 + { + public TestClassA1250() + { + } + } + [Export] + public class TestClassA1251 + { + public TestClassA1251() + { + } + } + [Export] + public class TestClassA1252 + { + public TestClassA1252() + { + } + } + [Export] + public class TestClassA1253 + { + public TestClassA1253() + { + } + } + [Export] + public class TestClassA1254 + { + public TestClassA1254() + { + } + } + [Export] + public class TestClassA1255 + { + public TestClassA1255() + { + } + } + [Export] + public class TestClassA1256 + { + public TestClassA1256() + { + } + } + [Export] + public class TestClassA1257 + { + public TestClassA1257() + { + } + } + [Export] + public class TestClassA1258 + { + public TestClassA1258() + { + } + } + [Export] + public class TestClassA1259 + { + public TestClassA1259() + { + } + } + [Export] + public class TestClassA1260 + { + public TestClassA1260() + { + } + } + [Export] + public class TestClassA1261 + { + public TestClassA1261() + { + } + } + [Export] + public class TestClassA1262 + { + public TestClassA1262() + { + } + } + [Export] + public class TestClassA1263 + { + public TestClassA1263() + { + } + } + [Export] + public class TestClassA1264 + { + public TestClassA1264() + { + } + } + [Export] + public class TestClassA1265 + { + public TestClassA1265() + { + } + } + [Export] + public class TestClassA1266 + { + public TestClassA1266() + { + } + } + [Export] + public class TestClassA1267 + { + public TestClassA1267() + { + } + } + [Export] + public class TestClassA1268 + { + public TestClassA1268() + { + } + } + [Export] + public class TestClassA1269 + { + public TestClassA1269() + { + } + } + [Export] + public class TestClassA1270 + { + public TestClassA1270() + { + } + } + [Export] + public class TestClassA1271 + { + public TestClassA1271() + { + } + } + [Export] + public class TestClassA1272 + { + public TestClassA1272() + { + } + } + [Export] + public class TestClassA1273 + { + public TestClassA1273() + { + } + } + [Export] + public class TestClassA1274 + { + public TestClassA1274() + { + } + } + [Export] + public class TestClassA1275 + { + public TestClassA1275() + { + } + } + [Export] + public class TestClassA1276 + { + public TestClassA1276() + { + } + } + [Export] + public class TestClassA1277 + { + public TestClassA1277() + { + } + } + [Export] + public class TestClassA1278 + { + public TestClassA1278() + { + } + } + [Export] + public class TestClassA1279 + { + public TestClassA1279() + { + } + } + [Export] + public class TestClassA1280 + { + public TestClassA1280() + { + } + } + [Export] + public class TestClassA1281 + { + public TestClassA1281() + { + } + } + [Export] + public class TestClassA1282 + { + public TestClassA1282() + { + } + } + [Export] + public class TestClassA1283 + { + public TestClassA1283() + { + } + } + [Export] + public class TestClassA1284 + { + public TestClassA1284() + { + } + } + [Export] + public class TestClassA1285 + { + public TestClassA1285() + { + } + } + [Export] + public class TestClassA1286 + { + public TestClassA1286() + { + } + } + [Export] + public class TestClassA1287 + { + public TestClassA1287() + { + } + } + [Export] + public class TestClassA1288 + { + public TestClassA1288() + { + } + } + [Export] + public class TestClassA1289 + { + public TestClassA1289() + { + } + } + [Export] + public class TestClassA1290 + { + public TestClassA1290() + { + } + } + [Export] + public class TestClassA1291 + { + public TestClassA1291() + { + } + } + [Export] + public class TestClassA1292 + { + public TestClassA1292() + { + } + } + [Export] + public class TestClassA1293 + { + public TestClassA1293() + { + } + } + [Export] + public class TestClassA1294 + { + public TestClassA1294() + { + } + } + [Export] + public class TestClassA1295 + { + public TestClassA1295() + { + } + } + [Export] + public class TestClassA1296 + { + public TestClassA1296() + { + } + } + [Export] + public class TestClassA1297 + { + public TestClassA1297() + { + } + } + [Export] + public class TestClassA1298 + { + public TestClassA1298() + { + } + } + [Export] + public class TestClassA1299 + { + public TestClassA1299() + { + } + } + [Export] + public class TestClassA1300 + { + public TestClassA1300() + { + } + } + [Export] + public class TestClassA1301 + { + public TestClassA1301() + { + } + } + [Export] + public class TestClassA1302 + { + public TestClassA1302() + { + } + } + [Export] + public class TestClassA1303 + { + public TestClassA1303() + { + } + } + [Export] + public class TestClassA1304 + { + public TestClassA1304() + { + } + } + [Export] + public class TestClassA1305 + { + public TestClassA1305() + { + } + } + [Export] + public class TestClassA1306 + { + public TestClassA1306() + { + } + } + [Export] + public class TestClassA1307 + { + public TestClassA1307() + { + } + } + [Export] + public class TestClassA1308 + { + public TestClassA1308() + { + } + } + [Export] + public class TestClassA1309 + { + public TestClassA1309() + { + } + } + [Export] + public class TestClassA1310 + { + public TestClassA1310() + { + } + } + [Export] + public class TestClassA1311 + { + public TestClassA1311() + { + } + } + [Export] + public class TestClassA1312 + { + public TestClassA1312() + { + } + } + [Export] + public class TestClassA1313 + { + public TestClassA1313() + { + } + } + [Export] + public class TestClassA1314 + { + public TestClassA1314() + { + } + } + [Export] + public class TestClassA1315 + { + public TestClassA1315() + { + } + } + [Export] + public class TestClassA1316 + { + public TestClassA1316() + { + } + } + [Export] + public class TestClassA1317 + { + public TestClassA1317() + { + } + } + [Export] + public class TestClassA1318 + { + public TestClassA1318() + { + } + } + [Export] + public class TestClassA1319 + { + public TestClassA1319() + { + } + } + [Export] + public class TestClassA1320 + { + public TestClassA1320() + { + } + } + [Export] + public class TestClassA1321 + { + public TestClassA1321() + { + } + } + [Export] + public class TestClassA1322 + { + public TestClassA1322() + { + } + } + [Export] + public class TestClassA1323 + { + public TestClassA1323() + { + } + } + [Export] + public class TestClassA1324 + { + public TestClassA1324() + { + } + } + [Export] + public class TestClassA1325 + { + public TestClassA1325() + { + } + } + [Export] + public class TestClassA1326 + { + public TestClassA1326() + { + } + } + [Export] + public class TestClassA1327 + { + public TestClassA1327() + { + } + } + [Export] + public class TestClassA1328 + { + public TestClassA1328() + { + } + } + [Export] + public class TestClassA1329 + { + public TestClassA1329() + { + } + } + [Export] + public class TestClassA1330 + { + public TestClassA1330() + { + } + } + [Export] + public class TestClassA1331 + { + public TestClassA1331() + { + } + } + [Export] + public class TestClassA1332 + { + public TestClassA1332() + { + } + } + [Export] + public class TestClassA1333 + { + public TestClassA1333() + { + } + } + [Export] + public class TestClassA1334 + { + public TestClassA1334() + { + } + } + [Export] + public class TestClassA1335 + { + public TestClassA1335() + { + } + } + [Export] + public class TestClassA1336 + { + public TestClassA1336() + { + } + } + [Export] + public class TestClassA1337 + { + public TestClassA1337() + { + } + } + [Export] + public class TestClassA1338 + { + public TestClassA1338() + { + } + } + [Export] + public class TestClassA1339 + { + public TestClassA1339() + { + } + } + [Export] + public class TestClassA1340 + { + public TestClassA1340() + { + } + } + [Export] + public class TestClassA1341 + { + public TestClassA1341() + { + } + } + [Export] + public class TestClassA1342 + { + public TestClassA1342() + { + } + } + [Export] + public class TestClassA1343 + { + public TestClassA1343() + { + } + } + [Export] + public class TestClassA1344 + { + public TestClassA1344() + { + } + } + [Export] + public class TestClassA1345 + { + public TestClassA1345() + { + } + } + [Export] + public class TestClassA1346 + { + public TestClassA1346() + { + } + } + [Export] + public class TestClassA1347 + { + public TestClassA1347() + { + } + } + [Export] + public class TestClassA1348 + { + public TestClassA1348() + { + } + } + [Export] + public class TestClassA1349 + { + public TestClassA1349() + { + } + } + [Export] + public class TestClassA1350 + { + public TestClassA1350() + { + } + } + [Export] + public class TestClassA1351 + { + public TestClassA1351() + { + } + } + [Export] + public class TestClassA1352 + { + public TestClassA1352() + { + } + } + [Export] + public class TestClassA1353 + { + public TestClassA1353() + { + } + } + [Export] + public class TestClassA1354 + { + public TestClassA1354() + { + } + } + [Export] + public class TestClassA1355 + { + public TestClassA1355() + { + } + } + [Export] + public class TestClassA1356 + { + public TestClassA1356() + { + } + } + [Export] + public class TestClassA1357 + { + public TestClassA1357() + { + } + } + [Export] + public class TestClassA1358 + { + public TestClassA1358() + { + } + } + [Export] + public class TestClassA1359 + { + public TestClassA1359() + { + } + } + [Export] + public class TestClassA1360 + { + public TestClassA1360() + { + } + } + [Export] + public class TestClassA1361 + { + public TestClassA1361() + { + } + } + [Export] + public class TestClassA1362 + { + public TestClassA1362() + { + } + } + [Export] + public class TestClassA1363 + { + public TestClassA1363() + { + } + } + [Export] + public class TestClassA1364 + { + public TestClassA1364() + { + } + } + [Export] + public class TestClassA1365 + { + public TestClassA1365() + { + } + } + [Export] + public class TestClassA1366 + { + public TestClassA1366() + { + } + } + [Export] + public class TestClassA1367 + { + public TestClassA1367() + { + } + } + [Export] + public class TestClassA1368 + { + public TestClassA1368() + { + } + } + [Export] + public class TestClassA1369 + { + public TestClassA1369() + { + } + } + [Export] + public class TestClassA1370 + { + public TestClassA1370() + { + } + } + [Export] + public class TestClassA1371 + { + public TestClassA1371() + { + } + } + [Export] + public class TestClassA1372 + { + public TestClassA1372() + { + } + } + [Export] + public class TestClassA1373 + { + public TestClassA1373() + { + } + } + [Export] + public class TestClassA1374 + { + public TestClassA1374() + { + } + } + [Export] + public class TestClassA1375 + { + public TestClassA1375() + { + } + } + [Export] + public class TestClassA1376 + { + public TestClassA1376() + { + } + } + [Export] + public class TestClassA1377 + { + public TestClassA1377() + { + } + } + [Export] + public class TestClassA1378 + { + public TestClassA1378() + { + } + } + [Export] + public class TestClassA1379 + { + public TestClassA1379() + { + } + } + [Export] + public class TestClassA1380 + { + public TestClassA1380() + { + } + } + [Export] + public class TestClassA1381 + { + public TestClassA1381() + { + } + } + [Export] + public class TestClassA1382 + { + public TestClassA1382() + { + } + } + [Export] + public class TestClassA1383 + { + public TestClassA1383() + { + } + } + [Export] + public class TestClassA1384 + { + public TestClassA1384() + { + } + } + [Export] + public class TestClassA1385 + { + public TestClassA1385() + { + } + } + [Export] + public class TestClassA1386 + { + public TestClassA1386() + { + } + } + [Export] + public class TestClassA1387 + { + public TestClassA1387() + { + } + } + [Export] + public class TestClassA1388 + { + public TestClassA1388() + { + } + } + [Export] + public class TestClassA1389 + { + public TestClassA1389() + { + } + } + [Export] + public class TestClassA1390 + { + public TestClassA1390() + { + } + } + [Export] + public class TestClassA1391 + { + public TestClassA1391() + { + } + } + [Export] + public class TestClassA1392 + { + public TestClassA1392() + { + } + } + [Export] + public class TestClassA1393 + { + public TestClassA1393() + { + } + } + [Export] + public class TestClassA1394 + { + public TestClassA1394() + { + } + } + [Export] + public class TestClassA1395 + { + public TestClassA1395() + { + } + } + [Export] + public class TestClassA1396 + { + public TestClassA1396() + { + } + } + [Export] + public class TestClassA1397 + { + public TestClassA1397() + { + } + } + [Export] + public class TestClassA1398 + { + public TestClassA1398() + { + } + } + [Export] + public class TestClassA1399 + { + public TestClassA1399() + { + } + } + [Export] + public class TestClassA1400 + { + public TestClassA1400() + { + } + } + [Export] + public class TestClassA1401 + { + public TestClassA1401() + { + } + } + [Export] + public class TestClassA1402 + { + public TestClassA1402() + { + } + } + [Export] + public class TestClassA1403 + { + public TestClassA1403() + { + } + } + [Export] + public class TestClassA1404 + { + public TestClassA1404() + { + } + } + [Export] + public class TestClassA1405 + { + public TestClassA1405() + { + } + } + [Export] + public class TestClassA1406 + { + public TestClassA1406() + { + } + } + [Export] + public class TestClassA1407 + { + public TestClassA1407() + { + } + } + [Export] + public class TestClassA1408 + { + public TestClassA1408() + { + } + } + [Export] + public class TestClassA1409 + { + public TestClassA1409() + { + } + } + [Export] + public class TestClassA1410 + { + public TestClassA1410() + { + } + } + [Export] + public class TestClassA1411 + { + public TestClassA1411() + { + } + } + [Export] + public class TestClassA1412 + { + public TestClassA1412() + { + } + } + [Export] + public class TestClassA1413 + { + public TestClassA1413() + { + } + } + [Export] + public class TestClassA1414 + { + public TestClassA1414() + { + } + } + [Export] + public class TestClassA1415 + { + public TestClassA1415() + { + } + } + [Export] + public class TestClassA1416 + { + public TestClassA1416() + { + } + } + [Export] + public class TestClassA1417 + { + public TestClassA1417() + { + } + } + [Export] + public class TestClassA1418 + { + public TestClassA1418() + { + } + } + [Export] + public class TestClassA1419 + { + public TestClassA1419() + { + } + } + [Export] + public class TestClassA1420 + { + public TestClassA1420() + { + } + } + [Export] + public class TestClassA1421 + { + public TestClassA1421() + { + } + } + [Export] + public class TestClassA1422 + { + public TestClassA1422() + { + } + } + [Export] + public class TestClassA1423 + { + public TestClassA1423() + { + } + } + [Export] + public class TestClassA1424 + { + public TestClassA1424() + { + } + } + [Export] + public class TestClassA1425 + { + public TestClassA1425() + { + } + } + [Export] + public class TestClassA1426 + { + public TestClassA1426() + { + } + } + [Export] + public class TestClassA1427 + { + public TestClassA1427() + { + } + } + [Export] + public class TestClassA1428 + { + public TestClassA1428() + { + } + } + [Export] + public class TestClassA1429 + { + public TestClassA1429() + { + } + } + [Export] + public class TestClassA1430 + { + public TestClassA1430() + { + } + } + [Export] + public class TestClassA1431 + { + public TestClassA1431() + { + } + } + [Export] + public class TestClassA1432 + { + public TestClassA1432() + { + } + } + [Export] + public class TestClassA1433 + { + public TestClassA1433() + { + } + } + [Export] + public class TestClassA1434 + { + public TestClassA1434() + { + } + } + [Export] + public class TestClassA1435 + { + public TestClassA1435() + { + } + } + [Export] + public class TestClassA1436 + { + public TestClassA1436() + { + } + } + [Export] + public class TestClassA1437 + { + public TestClassA1437() + { + } + } + [Export] + public class TestClassA1438 + { + public TestClassA1438() + { + } + } + [Export] + public class TestClassA1439 + { + public TestClassA1439() + { + } + } + [Export] + public class TestClassA1440 + { + public TestClassA1440() + { + } + } + [Export] + public class TestClassA1441 + { + public TestClassA1441() + { + } + } + [Export] + public class TestClassA1442 + { + public TestClassA1442() + { + } + } + [Export] + public class TestClassA1443 + { + public TestClassA1443() + { + } + } + [Export] + public class TestClassA1444 + { + public TestClassA1444() + { + } + } + [Export] + public class TestClassA1445 + { + public TestClassA1445() + { + } + } + [Export] + public class TestClassA1446 + { + public TestClassA1446() + { + } + } + [Export] + public class TestClassA1447 + { + public TestClassA1447() + { + } + } + [Export] + public class TestClassA1448 + { + public TestClassA1448() + { + } + } + [Export] + public class TestClassA1449 + { + public TestClassA1449() + { + } + } + [Export] + public class TestClassA1450 + { + public TestClassA1450() + { + } + } + [Export] + public class TestClassA1451 + { + public TestClassA1451() + { + } + } + [Export] + public class TestClassA1452 + { + public TestClassA1452() + { + } + } + [Export] + public class TestClassA1453 + { + public TestClassA1453() + { + } + } + [Export] + public class TestClassA1454 + { + public TestClassA1454() + { + } + } + [Export] + public class TestClassA1455 + { + public TestClassA1455() + { + } + } + [Export] + public class TestClassA1456 + { + public TestClassA1456() + { + } + } + [Export] + public class TestClassA1457 + { + public TestClassA1457() + { + } + } + [Export] + public class TestClassA1458 + { + public TestClassA1458() + { + } + } + [Export] + public class TestClassA1459 + { + public TestClassA1459() + { + } + } + [Export] + public class TestClassA1460 + { + public TestClassA1460() + { + } + } + [Export] + public class TestClassA1461 + { + public TestClassA1461() + { + } + } + [Export] + public class TestClassA1462 + { + public TestClassA1462() + { + } + } + [Export] + public class TestClassA1463 + { + public TestClassA1463() + { + } + } + [Export] + public class TestClassA1464 + { + public TestClassA1464() + { + } + } + [Export] + public class TestClassA1465 + { + public TestClassA1465() + { + } + } + [Export] + public class TestClassA1466 + { + public TestClassA1466() + { + } + } + [Export] + public class TestClassA1467 + { + public TestClassA1467() + { + } + } + [Export] + public class TestClassA1468 + { + public TestClassA1468() + { + } + } + [Export] + public class TestClassA1469 + { + public TestClassA1469() + { + } + } + [Export] + public class TestClassA1470 + { + public TestClassA1470() + { + } + } + [Export] + public class TestClassA1471 + { + public TestClassA1471() + { + } + } + [Export] + public class TestClassA1472 + { + public TestClassA1472() + { + } + } + [Export] + public class TestClassA1473 + { + public TestClassA1473() + { + } + } + [Export] + public class TestClassA1474 + { + public TestClassA1474() + { + } + } + [Export] + public class TestClassA1475 + { + public TestClassA1475() + { + } + } + [Export] + public class TestClassA1476 + { + public TestClassA1476() + { + } + } + [Export] + public class TestClassA1477 + { + public TestClassA1477() + { + } + } + [Export] + public class TestClassA1478 + { + public TestClassA1478() + { + } + } + [Export] + public class TestClassA1479 + { + public TestClassA1479() + { + } + } + [Export] + public class TestClassA1480 + { + public TestClassA1480() + { + } + } + [Export] + public class TestClassA1481 + { + public TestClassA1481() + { + } + } + [Export] + public class TestClassA1482 + { + public TestClassA1482() + { + } + } + [Export] + public class TestClassA1483 + { + public TestClassA1483() + { + } + } + [Export] + public class TestClassA1484 + { + public TestClassA1484() + { + } + } + [Export] + public class TestClassA1485 + { + public TestClassA1485() + { + } + } + [Export] + public class TestClassA1486 + { + public TestClassA1486() + { + } + } + [Export] + public class TestClassA1487 + { + public TestClassA1487() + { + } + } + [Export] + public class TestClassA1488 + { + public TestClassA1488() + { + } + } + [Export] + public class TestClassA1489 + { + public TestClassA1489() + { + } + } + [Export] + public class TestClassA1490 + { + public TestClassA1490() + { + } + } + [Export] + public class TestClassA1491 + { + public TestClassA1491() + { + } + } + [Export] + public class TestClassA1492 + { + public TestClassA1492() + { + } + } + [Export] + public class TestClassA1493 + { + public TestClassA1493() + { + } + } + [Export] + public class TestClassA1494 + { + public TestClassA1494() + { + } + } + [Export] + public class TestClassA1495 + { + public TestClassA1495() + { + } + } + [Export] + public class TestClassA1496 + { + public TestClassA1496() + { + } + } + [Export] + public class TestClassA1497 + { + public TestClassA1497() + { + } + } + [Export] + public class TestClassA1498 + { + public TestClassA1498() + { + } + } + [Export] + public class TestClassA1499 + { + public TestClassA1499() + { + } + } + [Export] + public class TestClassA1500 + { + public TestClassA1500() + { + } + } + [Export] + public class TestClassA1501 + { + public TestClassA1501() + { + } + } + [Export] + public class TestClassA1502 + { + public TestClassA1502() + { + } + } + [Export] + public class TestClassA1503 + { + public TestClassA1503() + { + } + } + [Export] + public class TestClassA1504 + { + public TestClassA1504() + { + } + } + [Export] + public class TestClassA1505 + { + public TestClassA1505() + { + } + } + [Export] + public class TestClassA1506 + { + public TestClassA1506() + { + } + } + [Export] + public class TestClassA1507 + { + public TestClassA1507() + { + } + } + [Export] + public class TestClassA1508 + { + public TestClassA1508() + { + } + } + [Export] + public class TestClassA1509 + { + public TestClassA1509() + { + } + } + [Export] + public class TestClassA1510 + { + public TestClassA1510() + { + } + } + [Export] + public class TestClassA1511 + { + public TestClassA1511() + { + } + } + [Export] + public class TestClassA1512 + { + public TestClassA1512() + { + } + } + [Export] + public class TestClassA1513 + { + public TestClassA1513() + { + } + } + [Export] + public class TestClassA1514 + { + public TestClassA1514() + { + } + } + [Export] + public class TestClassA1515 + { + public TestClassA1515() + { + } + } + [Export] + public class TestClassA1516 + { + public TestClassA1516() + { + } + } + [Export] + public class TestClassA1517 + { + public TestClassA1517() + { + } + } + [Export] + public class TestClassA1518 + { + public TestClassA1518() + { + } + } + [Export] + public class TestClassA1519 + { + public TestClassA1519() + { + } + } + [Export] + public class TestClassA1520 + { + public TestClassA1520() + { + } + } + [Export] + public class TestClassA1521 + { + public TestClassA1521() + { + } + } + [Export] + public class TestClassA1522 + { + public TestClassA1522() + { + } + } + [Export] + public class TestClassA1523 + { + public TestClassA1523() + { + } + } + [Export] + public class TestClassA1524 + { + public TestClassA1524() + { + } + } + [Export] + public class TestClassA1525 + { + public TestClassA1525() + { + } + } + [Export] + public class TestClassA1526 + { + public TestClassA1526() + { + } + } + [Export] + public class TestClassA1527 + { + public TestClassA1527() + { + } + } + [Export] + public class TestClassA1528 + { + public TestClassA1528() + { + } + } + [Export] + public class TestClassA1529 + { + public TestClassA1529() + { + } + } + [Export] + public class TestClassA1530 + { + public TestClassA1530() + { + } + } + [Export] + public class TestClassA1531 + { + public TestClassA1531() + { + } + } + [Export] + public class TestClassA1532 + { + public TestClassA1532() + { + } + } + [Export] + public class TestClassA1533 + { + public TestClassA1533() + { + } + } + [Export] + public class TestClassA1534 + { + public TestClassA1534() + { + } + } + [Export] + public class TestClassA1535 + { + public TestClassA1535() + { + } + } + [Export] + public class TestClassA1536 + { + public TestClassA1536() + { + } + } + [Export] + public class TestClassA1537 + { + public TestClassA1537() + { + } + } + [Export] + public class TestClassA1538 + { + public TestClassA1538() + { + } + } + [Export] + public class TestClassA1539 + { + public TestClassA1539() + { + } + } + [Export] + public class TestClassA1540 + { + public TestClassA1540() + { + } + } + [Export] + public class TestClassA1541 + { + public TestClassA1541() + { + } + } + [Export] + public class TestClassA1542 + { + public TestClassA1542() + { + } + } + [Export] + public class TestClassA1543 + { + public TestClassA1543() + { + } + } + [Export] + public class TestClassA1544 + { + public TestClassA1544() + { + } + } + [Export] + public class TestClassA1545 + { + public TestClassA1545() + { + } + } + [Export] + public class TestClassA1546 + { + public TestClassA1546() + { + } + } + [Export] + public class TestClassA1547 + { + public TestClassA1547() + { + } + } + [Export] + public class TestClassA1548 + { + public TestClassA1548() + { + } + } + [Export] + public class TestClassA1549 + { + public TestClassA1549() + { + } + } + [Export] + public class TestClassA1550 + { + public TestClassA1550() + { + } + } + [Export] + public class TestClassA1551 + { + public TestClassA1551() + { + } + } + [Export] + public class TestClassA1552 + { + public TestClassA1552() + { + } + } + [Export] + public class TestClassA1553 + { + public TestClassA1553() + { + } + } + [Export] + public class TestClassA1554 + { + public TestClassA1554() + { + } + } + [Export] + public class TestClassA1555 + { + public TestClassA1555() + { + } + } + [Export] + public class TestClassA1556 + { + public TestClassA1556() + { + } + } + [Export] + public class TestClassA1557 + { + public TestClassA1557() + { + } + } + [Export] + public class TestClassA1558 + { + public TestClassA1558() + { + } + } + [Export] + public class TestClassA1559 + { + public TestClassA1559() + { + } + } + [Export] + public class TestClassA1560 + { + public TestClassA1560() + { + } + } + [Export] + public class TestClassA1561 + { + public TestClassA1561() + { + } + } + [Export] + public class TestClassA1562 + { + public TestClassA1562() + { + } + } + [Export] + public class TestClassA1563 + { + public TestClassA1563() + { + } + } + [Export] + public class TestClassA1564 + { + public TestClassA1564() + { + } + } + [Export] + public class TestClassA1565 + { + public TestClassA1565() + { + } + } + [Export] + public class TestClassA1566 + { + public TestClassA1566() + { + } + } + [Export] + public class TestClassA1567 + { + public TestClassA1567() + { + } + } + [Export] + public class TestClassA1568 + { + public TestClassA1568() + { + } + } + [Export] + public class TestClassA1569 + { + public TestClassA1569() + { + } + } + [Export] + public class TestClassA1570 + { + public TestClassA1570() + { + } + } + [Export] + public class TestClassA1571 + { + public TestClassA1571() + { + } + } + [Export] + public class TestClassA1572 + { + public TestClassA1572() + { + } + } + [Export] + public class TestClassA1573 + { + public TestClassA1573() + { + } + } + [Export] + public class TestClassA1574 + { + public TestClassA1574() + { + } + } + [Export] + public class TestClassA1575 + { + public TestClassA1575() + { + } + } + [Export] + public class TestClassA1576 + { + public TestClassA1576() + { + } + } + [Export] + public class TestClassA1577 + { + public TestClassA1577() + { + } + } + [Export] + public class TestClassA1578 + { + public TestClassA1578() + { + } + } + [Export] + public class TestClassA1579 + { + public TestClassA1579() + { + } + } + [Export] + public class TestClassA1580 + { + public TestClassA1580() + { + } + } + [Export] + public class TestClassA1581 + { + public TestClassA1581() + { + } + } + [Export] + public class TestClassA1582 + { + public TestClassA1582() + { + } + } + [Export] + public class TestClassA1583 + { + public TestClassA1583() + { + } + } + [Export] + public class TestClassA1584 + { + public TestClassA1584() + { + } + } + [Export] + public class TestClassA1585 + { + public TestClassA1585() + { + } + } + [Export] + public class TestClassA1586 + { + public TestClassA1586() + { + } + } + [Export] + public class TestClassA1587 + { + public TestClassA1587() + { + } + } + [Export] + public class TestClassA1588 + { + public TestClassA1588() + { + } + } + [Export] + public class TestClassA1589 + { + public TestClassA1589() + { + } + } + [Export] + public class TestClassA1590 + { + public TestClassA1590() + { + } + } + [Export] + public class TestClassA1591 + { + public TestClassA1591() + { + } + } + [Export] + public class TestClassA1592 + { + public TestClassA1592() + { + } + } + [Export] + public class TestClassA1593 + { + public TestClassA1593() + { + } + } + [Export] + public class TestClassA1594 + { + public TestClassA1594() + { + } + } + [Export] + public class TestClassA1595 + { + public TestClassA1595() + { + } + } + [Export] + public class TestClassA1596 + { + public TestClassA1596() + { + } + } + [Export] + public class TestClassA1597 + { + public TestClassA1597() + { + } + } + [Export] + public class TestClassA1598 + { + public TestClassA1598() + { + } + } + [Export] + public class TestClassA1599 + { + public TestClassA1599() + { + } + } + [Export] + public class TestClassA1600 + { + public TestClassA1600() + { + } + } + [Export] + public class TestClassA1601 + { + public TestClassA1601() + { + } + } + [Export] + public class TestClassA1602 + { + public TestClassA1602() + { + } + } + [Export] + public class TestClassA1603 + { + public TestClassA1603() + { + } + } + [Export] + public class TestClassA1604 + { + public TestClassA1604() + { + } + } + [Export] + public class TestClassA1605 + { + public TestClassA1605() + { + } + } + [Export] + public class TestClassA1606 + { + public TestClassA1606() + { + } + } + [Export] + public class TestClassA1607 + { + public TestClassA1607() + { + } + } + [Export] + public class TestClassA1608 + { + public TestClassA1608() + { + } + } + [Export] + public class TestClassA1609 + { + public TestClassA1609() + { + } + } + [Export] + public class TestClassA1610 + { + public TestClassA1610() + { + } + } + [Export] + public class TestClassA1611 + { + public TestClassA1611() + { + } + } + [Export] + public class TestClassA1612 + { + public TestClassA1612() + { + } + } + [Export] + public class TestClassA1613 + { + public TestClassA1613() + { + } + } + [Export] + public class TestClassA1614 + { + public TestClassA1614() + { + } + } + [Export] + public class TestClassA1615 + { + public TestClassA1615() + { + } + } + [Export] + public class TestClassA1616 + { + public TestClassA1616() + { + } + } + [Export] + public class TestClassA1617 + { + public TestClassA1617() + { + } + } + [Export] + public class TestClassA1618 + { + public TestClassA1618() + { + } + } + [Export] + public class TestClassA1619 + { + public TestClassA1619() + { + } + } + [Export] + public class TestClassA1620 + { + public TestClassA1620() + { + } + } + [Export] + public class TestClassA1621 + { + public TestClassA1621() + { + } + } + [Export] + public class TestClassA1622 + { + public TestClassA1622() + { + } + } + [Export] + public class TestClassA1623 + { + public TestClassA1623() + { + } + } + [Export] + public class TestClassA1624 + { + public TestClassA1624() + { + } + } + [Export] + public class TestClassA1625 + { + public TestClassA1625() + { + } + } + [Export] + public class TestClassA1626 + { + public TestClassA1626() + { + } + } + [Export] + public class TestClassA1627 + { + public TestClassA1627() + { + } + } + [Export] + public class TestClassA1628 + { + public TestClassA1628() + { + } + } + [Export] + public class TestClassA1629 + { + public TestClassA1629() + { + } + } + [Export] + public class TestClassA1630 + { + public TestClassA1630() + { + } + } + [Export] + public class TestClassA1631 + { + public TestClassA1631() + { + } + } + [Export] + public class TestClassA1632 + { + public TestClassA1632() + { + } + } + [Export] + public class TestClassA1633 + { + public TestClassA1633() + { + } + } + [Export] + public class TestClassA1634 + { + public TestClassA1634() + { + } + } + [Export] + public class TestClassA1635 + { + public TestClassA1635() + { + } + } + [Export] + public class TestClassA1636 + { + public TestClassA1636() + { + } + } + [Export] + public class TestClassA1637 + { + public TestClassA1637() + { + } + } + [Export] + public class TestClassA1638 + { + public TestClassA1638() + { + } + } + [Export] + public class TestClassA1639 + { + public TestClassA1639() + { + } + } + [Export] + public class TestClassA1640 + { + public TestClassA1640() + { + } + } + [Export] + public class TestClassA1641 + { + public TestClassA1641() + { + } + } + [Export] + public class TestClassA1642 + { + public TestClassA1642() + { + } + } + [Export] + public class TestClassA1643 + { + public TestClassA1643() + { + } + } + [Export] + public class TestClassA1644 + { + public TestClassA1644() + { + } + } + [Export] + public class TestClassA1645 + { + public TestClassA1645() + { + } + } + [Export] + public class TestClassA1646 + { + public TestClassA1646() + { + } + } + [Export] + public class TestClassA1647 + { + public TestClassA1647() + { + } + } + [Export] + public class TestClassA1648 + { + public TestClassA1648() + { + } + } + [Export] + public class TestClassA1649 + { + public TestClassA1649() + { + } + } + [Export] + public class TestClassA1650 + { + public TestClassA1650() + { + } + } + [Export] + public class TestClassA1651 + { + public TestClassA1651() + { + } + } + [Export] + public class TestClassA1652 + { + public TestClassA1652() + { + } + } + [Export] + public class TestClassA1653 + { + public TestClassA1653() + { + } + } + [Export] + public class TestClassA1654 + { + public TestClassA1654() + { + } + } + [Export] + public class TestClassA1655 + { + public TestClassA1655() + { + } + } + [Export] + public class TestClassA1656 + { + public TestClassA1656() + { + } + } + [Export] + public class TestClassA1657 + { + public TestClassA1657() + { + } + } + [Export] + public class TestClassA1658 + { + public TestClassA1658() + { + } + } + [Export] + public class TestClassA1659 + { + public TestClassA1659() + { + } + } + [Export] + public class TestClassA1660 + { + public TestClassA1660() + { + } + } + [Export] + public class TestClassA1661 + { + public TestClassA1661() + { + } + } + [Export] + public class TestClassA1662 + { + public TestClassA1662() + { + } + } + [Export] + public class TestClassA1663 + { + public TestClassA1663() + { + } + } + [Export] + public class TestClassA1664 + { + public TestClassA1664() + { + } + } + [Export] + public class TestClassA1665 + { + public TestClassA1665() + { + } + } + [Export] + public class TestClassA1666 + { + public TestClassA1666() + { + } + } + [Export] + public class TestClassA1667 + { + public TestClassA1667() + { + } + } + [Export] + public class TestClassA1668 + { + public TestClassA1668() + { + } + } + [Export] + public class TestClassA1669 + { + public TestClassA1669() + { + } + } + [Export] + public class TestClassA1670 + { + public TestClassA1670() + { + } + } + [Export] + public class TestClassA1671 + { + public TestClassA1671() + { + } + } + [Export] + public class TestClassA1672 + { + public TestClassA1672() + { + } + } + [Export] + public class TestClassA1673 + { + public TestClassA1673() + { + } + } + [Export] + public class TestClassA1674 + { + public TestClassA1674() + { + } + } + [Export] + public class TestClassA1675 + { + public TestClassA1675() + { + } + } + [Export] + public class TestClassA1676 + { + public TestClassA1676() + { + } + } + [Export] + public class TestClassA1677 + { + public TestClassA1677() + { + } + } + [Export] + public class TestClassA1678 + { + public TestClassA1678() + { + } + } + [Export] + public class TestClassA1679 + { + public TestClassA1679() + { + } + } + [Export] + public class TestClassA1680 + { + public TestClassA1680() + { + } + } + [Export] + public class TestClassA1681 + { + public TestClassA1681() + { + } + } + [Export] + public class TestClassA1682 + { + public TestClassA1682() + { + } + } + [Export] + public class TestClassA1683 + { + public TestClassA1683() + { + } + } + [Export] + public class TestClassA1684 + { + public TestClassA1684() + { + } + } + [Export] + public class TestClassA1685 + { + public TestClassA1685() + { + } + } + [Export] + public class TestClassA1686 + { + public TestClassA1686() + { + } + } + [Export] + public class TestClassA1687 + { + public TestClassA1687() + { + } + } + [Export] + public class TestClassA1688 + { + public TestClassA1688() + { + } + } + [Export] + public class TestClassA1689 + { + public TestClassA1689() + { + } + } + [Export] + public class TestClassA1690 + { + public TestClassA1690() + { + } + } + [Export] + public class TestClassA1691 + { + public TestClassA1691() + { + } + } + [Export] + public class TestClassA1692 + { + public TestClassA1692() + { + } + } + [Export] + public class TestClassA1693 + { + public TestClassA1693() + { + } + } + [Export] + public class TestClassA1694 + { + public TestClassA1694() + { + } + } + [Export] + public class TestClassA1695 + { + public TestClassA1695() + { + } + } + [Export] + public class TestClassA1696 + { + public TestClassA1696() + { + } + } + [Export] + public class TestClassA1697 + { + public TestClassA1697() + { + } + } + [Export] + public class TestClassA1698 + { + public TestClassA1698() + { + } + } + [Export] + public class TestClassA1699 + { + public TestClassA1699() + { + } + } + [Export] + public class TestClassA1700 + { + public TestClassA1700() + { + } + } + [Export] + public class TestClassA1701 + { + public TestClassA1701() + { + } + } + [Export] + public class TestClassA1702 + { + public TestClassA1702() + { + } + } + [Export] + public class TestClassA1703 + { + public TestClassA1703() + { + } + } + [Export] + public class TestClassA1704 + { + public TestClassA1704() + { + } + } + [Export] + public class TestClassA1705 + { + public TestClassA1705() + { + } + } + [Export] + public class TestClassA1706 + { + public TestClassA1706() + { + } + } + [Export] + public class TestClassA1707 + { + public TestClassA1707() + { + } + } + [Export] + public class TestClassA1708 + { + public TestClassA1708() + { + } + } + [Export] + public class TestClassA1709 + { + public TestClassA1709() + { + } + } + [Export] + public class TestClassA1710 + { + public TestClassA1710() + { + } + } + [Export] + public class TestClassA1711 + { + public TestClassA1711() + { + } + } + [Export] + public class TestClassA1712 + { + public TestClassA1712() + { + } + } + [Export] + public class TestClassA1713 + { + public TestClassA1713() + { + } + } + [Export] + public class TestClassA1714 + { + public TestClassA1714() + { + } + } + [Export] + public class TestClassA1715 + { + public TestClassA1715() + { + } + } + [Export] + public class TestClassA1716 + { + public TestClassA1716() + { + } + } + [Export] + public class TestClassA1717 + { + public TestClassA1717() + { + } + } + [Export] + public class TestClassA1718 + { + public TestClassA1718() + { + } + } + [Export] + public class TestClassA1719 + { + public TestClassA1719() + { + } + } + [Export] + public class TestClassA1720 + { + public TestClassA1720() + { + } + } + [Export] + public class TestClassA1721 + { + public TestClassA1721() + { + } + } + [Export] + public class TestClassA1722 + { + public TestClassA1722() + { + } + } + [Export] + public class TestClassA1723 + { + public TestClassA1723() + { + } + } + [Export] + public class TestClassA1724 + { + public TestClassA1724() + { + } + } + [Export] + public class TestClassA1725 + { + public TestClassA1725() + { + } + } + [Export] + public class TestClassA1726 + { + public TestClassA1726() + { + } + } + [Export] + public class TestClassA1727 + { + public TestClassA1727() + { + } + } + [Export] + public class TestClassA1728 + { + public TestClassA1728() + { + } + } + [Export] + public class TestClassA1729 + { + public TestClassA1729() + { + } + } + [Export] + public class TestClassA1730 + { + public TestClassA1730() + { + } + } + [Export] + public class TestClassA1731 + { + public TestClassA1731() + { + } + } + [Export] + public class TestClassA1732 + { + public TestClassA1732() + { + } + } + [Export] + public class TestClassA1733 + { + public TestClassA1733() + { + } + } + [Export] + public class TestClassA1734 + { + public TestClassA1734() + { + } + } + [Export] + public class TestClassA1735 + { + public TestClassA1735() + { + } + } + [Export] + public class TestClassA1736 + { + public TestClassA1736() + { + } + } + [Export] + public class TestClassA1737 + { + public TestClassA1737() + { + } + } + [Export] + public class TestClassA1738 + { + public TestClassA1738() + { + } + } + [Export] + public class TestClassA1739 + { + public TestClassA1739() + { + } + } + [Export] + public class TestClassA1740 + { + public TestClassA1740() + { + } + } + [Export] + public class TestClassA1741 + { + public TestClassA1741() + { + } + } + [Export] + public class TestClassA1742 + { + public TestClassA1742() + { + } + } + [Export] + public class TestClassA1743 + { + public TestClassA1743() + { + } + } + [Export] + public class TestClassA1744 + { + public TestClassA1744() + { + } + } + [Export] + public class TestClassA1745 + { + public TestClassA1745() + { + } + } + [Export] + public class TestClassA1746 + { + public TestClassA1746() + { + } + } + [Export] + public class TestClassA1747 + { + public TestClassA1747() + { + } + } + [Export] + public class TestClassA1748 + { + public TestClassA1748() + { + } + } + [Export] + public class TestClassA1749 + { + public TestClassA1749() + { + } + } + [Export] + public class TestClassA1750 + { + public TestClassA1750() + { + } + } + [Export] + public class TestClassA1751 + { + public TestClassA1751() + { + } + } + [Export] + public class TestClassA1752 + { + public TestClassA1752() + { + } + } + [Export] + public class TestClassA1753 + { + public TestClassA1753() + { + } + } + [Export] + public class TestClassA1754 + { + public TestClassA1754() + { + } + } + [Export] + public class TestClassA1755 + { + public TestClassA1755() + { + } + } + [Export] + public class TestClassA1756 + { + public TestClassA1756() + { + } + } + [Export] + public class TestClassA1757 + { + public TestClassA1757() + { + } + } + [Export] + public class TestClassA1758 + { + public TestClassA1758() + { + } + } + [Export] + public class TestClassA1759 + { + public TestClassA1759() + { + } + } + [Export] + public class TestClassA1760 + { + public TestClassA1760() + { + } + } + [Export] + public class TestClassA1761 + { + public TestClassA1761() + { + } + } + [Export] + public class TestClassA1762 + { + public TestClassA1762() + { + } + } + [Export] + public class TestClassA1763 + { + public TestClassA1763() + { + } + } + [Export] + public class TestClassA1764 + { + public TestClassA1764() + { + } + } + [Export] + public class TestClassA1765 + { + public TestClassA1765() + { + } + } + [Export] + public class TestClassA1766 + { + public TestClassA1766() + { + } + } + [Export] + public class TestClassA1767 + { + public TestClassA1767() + { + } + } + [Export] + public class TestClassA1768 + { + public TestClassA1768() + { + } + } + [Export] + public class TestClassA1769 + { + public TestClassA1769() + { + } + } + [Export] + public class TestClassA1770 + { + public TestClassA1770() + { + } + } + [Export] + public class TestClassA1771 + { + public TestClassA1771() + { + } + } + [Export] + public class TestClassA1772 + { + public TestClassA1772() + { + } + } + [Export] + public class TestClassA1773 + { + public TestClassA1773() + { + } + } + [Export] + public class TestClassA1774 + { + public TestClassA1774() + { + } + } + [Export] + public class TestClassA1775 + { + public TestClassA1775() + { + } + } + [Export] + public class TestClassA1776 + { + public TestClassA1776() + { + } + } + [Export] + public class TestClassA1777 + { + public TestClassA1777() + { + } + } + [Export] + public class TestClassA1778 + { + public TestClassA1778() + { + } + } + [Export] + public class TestClassA1779 + { + public TestClassA1779() + { + } + } + [Export] + public class TestClassA1780 + { + public TestClassA1780() + { + } + } + [Export] + public class TestClassA1781 + { + public TestClassA1781() + { + } + } + [Export] + public class TestClassA1782 + { + public TestClassA1782() + { + } + } + [Export] + public class TestClassA1783 + { + public TestClassA1783() + { + } + } + [Export] + public class TestClassA1784 + { + public TestClassA1784() + { + } + } + [Export] + public class TestClassA1785 + { + public TestClassA1785() + { + } + } + [Export] + public class TestClassA1786 + { + public TestClassA1786() + { + } + } + [Export] + public class TestClassA1787 + { + public TestClassA1787() + { + } + } + [Export] + public class TestClassA1788 + { + public TestClassA1788() + { + } + } + [Export] + public class TestClassA1789 + { + public TestClassA1789() + { + } + } + [Export] + public class TestClassA1790 + { + public TestClassA1790() + { + } + } + [Export] + public class TestClassA1791 + { + public TestClassA1791() + { + } + } + [Export] + public class TestClassA1792 + { + public TestClassA1792() + { + } + } + [Export] + public class TestClassA1793 + { + public TestClassA1793() + { + } + } + [Export] + public class TestClassA1794 + { + public TestClassA1794() + { + } + } + [Export] + public class TestClassA1795 + { + public TestClassA1795() + { + } + } + [Export] + public class TestClassA1796 + { + public TestClassA1796() + { + } + } + [Export] + public class TestClassA1797 + { + public TestClassA1797() + { + } + } + [Export] + public class TestClassA1798 + { + public TestClassA1798() + { + } + } + [Export] + public class TestClassA1799 + { + public TestClassA1799() + { + } + } + [Export] + public class TestClassA1800 + { + public TestClassA1800() + { + } + } + [Export] + public class TestClassA1801 + { + public TestClassA1801() + { + } + } + [Export] + public class TestClassA1802 + { + public TestClassA1802() + { + } + } + [Export] + public class TestClassA1803 + { + public TestClassA1803() + { + } + } + [Export] + public class TestClassA1804 + { + public TestClassA1804() + { + } + } + [Export] + public class TestClassA1805 + { + public TestClassA1805() + { + } + } + [Export] + public class TestClassA1806 + { + public TestClassA1806() + { + } + } + [Export] + public class TestClassA1807 + { + public TestClassA1807() + { + } + } + [Export] + public class TestClassA1808 + { + public TestClassA1808() + { + } + } + [Export] + public class TestClassA1809 + { + public TestClassA1809() + { + } + } + [Export] + public class TestClassA1810 + { + public TestClassA1810() + { + } + } + [Export] + public class TestClassA1811 + { + public TestClassA1811() + { + } + } + [Export] + public class TestClassA1812 + { + public TestClassA1812() + { + } + } + [Export] + public class TestClassA1813 + { + public TestClassA1813() + { + } + } + [Export] + public class TestClassA1814 + { + public TestClassA1814() + { + } + } + [Export] + public class TestClassA1815 + { + public TestClassA1815() + { + } + } + [Export] + public class TestClassA1816 + { + public TestClassA1816() + { + } + } + [Export] + public class TestClassA1817 + { + public TestClassA1817() + { + } + } + [Export] + public class TestClassA1818 + { + public TestClassA1818() + { + } + } + [Export] + public class TestClassA1819 + { + public TestClassA1819() + { + } + } + [Export] + public class TestClassA1820 + { + public TestClassA1820() + { + } + } + [Export] + public class TestClassA1821 + { + public TestClassA1821() + { + } + } + [Export] + public class TestClassA1822 + { + public TestClassA1822() + { + } + } + [Export] + public class TestClassA1823 + { + public TestClassA1823() + { + } + } + [Export] + public class TestClassA1824 + { + public TestClassA1824() + { + } + } + [Export] + public class TestClassA1825 + { + public TestClassA1825() + { + } + } + [Export] + public class TestClassA1826 + { + public TestClassA1826() + { + } + } + [Export] + public class TestClassA1827 + { + public TestClassA1827() + { + } + } + [Export] + public class TestClassA1828 + { + public TestClassA1828() + { + } + } + [Export] + public class TestClassA1829 + { + public TestClassA1829() + { + } + } + [Export] + public class TestClassA1830 + { + public TestClassA1830() + { + } + } + [Export] + public class TestClassA1831 + { + public TestClassA1831() + { + } + } + [Export] + public class TestClassA1832 + { + public TestClassA1832() + { + } + } + [Export] + public class TestClassA1833 + { + public TestClassA1833() + { + } + } + [Export] + public class TestClassA1834 + { + public TestClassA1834() + { + } + } + [Export] + public class TestClassA1835 + { + public TestClassA1835() + { + } + } + [Export] + public class TestClassA1836 + { + public TestClassA1836() + { + } + } + [Export] + public class TestClassA1837 + { + public TestClassA1837() + { + } + } + [Export] + public class TestClassA1838 + { + public TestClassA1838() + { + } + } + [Export] + public class TestClassA1839 + { + public TestClassA1839() + { + } + } + [Export] + public class TestClassA1840 + { + public TestClassA1840() + { + } + } + [Export] + public class TestClassA1841 + { + public TestClassA1841() + { + } + } + [Export] + public class TestClassA1842 + { + public TestClassA1842() + { + } + } + [Export] + public class TestClassA1843 + { + public TestClassA1843() + { + } + } + [Export] + public class TestClassA1844 + { + public TestClassA1844() + { + } + } + [Export] + public class TestClassA1845 + { + public TestClassA1845() + { + } + } + [Export] + public class TestClassA1846 + { + public TestClassA1846() + { + } + } + [Export] + public class TestClassA1847 + { + public TestClassA1847() + { + } + } + [Export] + public class TestClassA1848 + { + public TestClassA1848() + { + } + } + [Export] + public class TestClassA1849 + { + public TestClassA1849() + { + } + } + [Export] + public class TestClassA1850 + { + public TestClassA1850() + { + } + } + [Export] + public class TestClassA1851 + { + public TestClassA1851() + { + } + } + [Export] + public class TestClassA1852 + { + public TestClassA1852() + { + } + } + [Export] + public class TestClassA1853 + { + public TestClassA1853() + { + } + } + [Export] + public class TestClassA1854 + { + public TestClassA1854() + { + } + } + [Export] + public class TestClassA1855 + { + public TestClassA1855() + { + } + } + [Export] + public class TestClassA1856 + { + public TestClassA1856() + { + } + } + [Export] + public class TestClassA1857 + { + public TestClassA1857() + { + } + } + [Export] + public class TestClassA1858 + { + public TestClassA1858() + { + } + } + [Export] + public class TestClassA1859 + { + public TestClassA1859() + { + } + } + [Export] + public class TestClassA1860 + { + public TestClassA1860() + { + } + } + [Export] + public class TestClassA1861 + { + public TestClassA1861() + { + } + } + [Export] + public class TestClassA1862 + { + public TestClassA1862() + { + } + } + [Export] + public class TestClassA1863 + { + public TestClassA1863() + { + } + } + [Export] + public class TestClassA1864 + { + public TestClassA1864() + { + } + } + [Export] + public class TestClassA1865 + { + public TestClassA1865() + { + } + } + [Export] + public class TestClassA1866 + { + public TestClassA1866() + { + } + } + [Export] + public class TestClassA1867 + { + public TestClassA1867() + { + } + } + [Export] + public class TestClassA1868 + { + public TestClassA1868() + { + } + } + [Export] + public class TestClassA1869 + { + public TestClassA1869() + { + } + } + [Export] + public class TestClassA1870 + { + public TestClassA1870() + { + } + } + [Export] + public class TestClassA1871 + { + public TestClassA1871() + { + } + } + [Export] + public class TestClassA1872 + { + public TestClassA1872() + { + } + } + [Export] + public class TestClassA1873 + { + public TestClassA1873() + { + } + } +} diff --git a/src/System.Composition/perftests/HugeGraphBenchmark.cs b/src/System.Composition/perftests/HugeGraphBenchmark.cs new file mode 100644 index 000000000000..da3742348e1e --- /dev/null +++ b/src/System.Composition/perftests/HugeGraphBenchmark.cs @@ -0,0 +1,90 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Composition.Hosting; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using CompositionThroughput.HugeGraph; + +namespace CompositionThroughput +{ + internal abstract class HugeGraphBenchmark : Benchmark + { + public override bool SelfTest() + { + return true; + } + + protected IEnumerable GetHugeGraphTypes(Type example) + { + return example.GetTypeInfo().Assembly.DefinedTypes.Where(t => t.Namespace == example.Namespace).Select(ti => ti.AsType()); + } + } + + internal abstract class LightweightHugeGraphBenchmark : HugeGraphBenchmark + { + private ExportFactory ConfigureContainer() + { + return new ContainerConfiguration() + .WithParts(GetHugeGraphTypes(typeof(T))) + .CreateContainer() + .GetExport>(); + } + + protected Action GetOperationFor() + { + var c = ConfigureContainer(); + return () => + { + var scope = c.CreateExport(); + var x = scope.Value; + scope.Dispose(); + }; + } + + public override Version Version + { + get + { + return typeof(CompositionContext).GetTypeInfo().Assembly.GetName().Version; + } + } + } + + internal class LightweightHugeGraphABenchmark : LightweightHugeGraphBenchmark + { + public override Action GetOperation() + { + return GetOperationFor(); + } + } + + internal class LightweightLongGraphBBenchmark : LightweightHugeGraphBenchmark + { + public override Action GetOperation() + { + return GetOperationFor(); + } + } + + internal class LightweightHugeGraphCBenchmark : LightweightHugeGraphBenchmark + { + public override Action GetOperation() + { + return GetOperationFor(); + } + } + + internal class LightweightHugeGraph4Benchmark : LightweightHugeGraphBenchmark + { + public override Action GetOperation() + { + return GetOperationFor(); + } + } +} diff --git a/src/System.Composition/perftests/HugeGraphScenario.cs b/src/System.Composition/perftests/HugeGraphScenario.cs new file mode 100644 index 000000000000..9c7528ed8157 --- /dev/null +++ b/src/System.Composition/perftests/HugeGraphScenario.cs @@ -0,0 +1,25293 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.IO; +using System.Composition; + +namespace CompositionThroughput.HugeGraph +{ + [Export] + public class TestClassA1 + { + [ImportingConstructor] + public TestClassA1(TestClassA2 testclassa2, TestClassA3 testclassa3, TestClassA4 testclassa4, TestClassA5 testclassa5) + { + } + } + [Export] + public class TestClassA2 + { + [ImportingConstructor] + public TestClassA2(TestClassA6 testclassa6, TestClassA7 testclassa7, TestClassA8 testclassa8, TestClassA9 testclassa9) + { + } + } + [Export] + public class TestClassA3 + { + [ImportingConstructor] + public TestClassA3(TestClassA10 testclassa10, TestClassA11 testclassa11, TestClassA12 testclassa12, TestClassA13 testclassa13) + { + } + } + [Export] + public class TestClassA4 + { + [ImportingConstructor] + public TestClassA4(TestClassA14 testclassa14, TestClassA15 testclassa15, TestClassA16 testclassa16, TestClassA17 testclassa17) + { + } + } + [Export] + public class TestClassA5 + { + [ImportingConstructor] + public TestClassA5(TestClassA18 testclassa18, TestClassA19 testclassa19, TestClassA20 testclassa20, TestClassA21 testclassa21) + { + } + } + [Export] + public class TestClassA6 + { + [ImportingConstructor] + public TestClassA6(TestClassA22 testclassa22, TestClassA23 testclassa23, TestClassA24 testclassa24, TestClassA25 testclassa25) + { + } + } + [Export] + public class TestClassA7 + { + [ImportingConstructor] + public TestClassA7(TestClassA26 testclassa26, TestClassA27 testclassa27, TestClassA28 testclassa28, TestClassA29 testclassa29) + { + } + } + [Export] + public class TestClassA8 + { + [ImportingConstructor] + public TestClassA8(TestClassA30 testclassa30, TestClassA31 testclassa31, TestClassA32 testclassa32, TestClassA33 testclassa33) + { + } + } + [Export] + public class TestClassA9 + { + [ImportingConstructor] + public TestClassA9(TestClassA34 testclassa34, TestClassA35 testclassa35, TestClassA36 testclassa36, TestClassA37 testclassa37) + { + } + } + [Export] + public class TestClassA10 + { + [ImportingConstructor] + public TestClassA10(TestClassA38 testclassa38, TestClassA39 testclassa39, TestClassA40 testclassa40, TestClassA41 testclassa41) + { + } + } + [Export] + public class TestClassA11 + { + [ImportingConstructor] + public TestClassA11(TestClassA42 testclassa42, TestClassA43 testclassa43, TestClassA44 testclassa44, TestClassA45 testclassa45) + { + } + } + [Export] + public class TestClassA12 + { + [ImportingConstructor] + public TestClassA12(TestClassA46 testclassa46, TestClassA47 testclassa47, TestClassA48 testclassa48, TestClassA49 testclassa49) + { + } + } + [Export] + public class TestClassA13 + { + [ImportingConstructor] + public TestClassA13(TestClassA50 testclassa50, TestClassA51 testclassa51, TestClassA52 testclassa52, TestClassA53 testclassa53) + { + } + } + [Export] + public class TestClassA14 + { + [ImportingConstructor] + public TestClassA14(TestClassA54 testclassa54, TestClassA55 testclassa55, TestClassA56 testclassa56, TestClassA57 testclassa57) + { + } + } + [Export] + public class TestClassA15 + { + [ImportingConstructor] + public TestClassA15(TestClassA58 testclassa58, TestClassA59 testclassa59, TestClassA60 testclassa60, TestClassA61 testclassa61) + { + } + } + [Export] + public class TestClassA16 + { + [ImportingConstructor] + public TestClassA16(TestClassA62 testclassa62, TestClassA63 testclassa63, TestClassA64 testclassa64, TestClassA65 testclassa65) + { + } + } + [Export] + public class TestClassA17 + { + [ImportingConstructor] + public TestClassA17(TestClassA66 testclassa66, TestClassA67 testclassa67, TestClassA68 testclassa68, TestClassA69 testclassa69) + { + } + } + [Export] + public class TestClassA18 + { + [ImportingConstructor] + public TestClassA18(TestClassA70 testclassa70, TestClassA71 testclassa71, TestClassA72 testclassa72, TestClassA73 testclassa73) + { + } + } + [Export] + public class TestClassA19 + { + [ImportingConstructor] + public TestClassA19(TestClassA74 testclassa74, TestClassA75 testclassa75, TestClassA76 testclassa76, TestClassA77 testclassa77) + { + } + } + [Export] + public class TestClassA20 + { + [ImportingConstructor] + public TestClassA20(TestClassA78 testclassa78, TestClassA79 testclassa79, TestClassA80 testclassa80, TestClassA81 testclassa81) + { + } + } + [Export] + public class TestClassA21 + { + [ImportingConstructor] + public TestClassA21(TestClassA82 testclassa82, TestClassA83 testclassa83, TestClassA84 testclassa84, TestClassA85 testclassa85) + { + } + } + [Export] + public class TestClassA22 + { + [ImportingConstructor] + public TestClassA22(TestClassA86 testclassa86, TestClassA87 testclassa87, TestClassA88 testclassa88, TestClassA89 testclassa89) + { + } + } + [Export] + public class TestClassA23 + { + [ImportingConstructor] + public TestClassA23(TestClassA90 testclassa90, TestClassA91 testclassa91, TestClassA92 testclassa92, TestClassA93 testclassa93) + { + } + } + [Export] + public class TestClassA24 + { + [ImportingConstructor] + public TestClassA24(TestClassA94 testclassa94, TestClassA95 testclassa95, TestClassA96 testclassa96, TestClassA97 testclassa97) + { + } + } + [Export] + public class TestClassA25 + { + [ImportingConstructor] + public TestClassA25(TestClassA98 testclassa98, TestClassA99 testclassa99, TestClassA100 testclassa100, TestClassA101 testclassa101) + { + } + } + [Export] + public class TestClassA26 + { + [ImportingConstructor] + public TestClassA26(TestClassA102 testclassa102, TestClassA103 testclassa103, TestClassA104 testclassa104, TestClassA105 testclassa105) + { + } + } + [Export] + public class TestClassA27 + { + [ImportingConstructor] + public TestClassA27(TestClassA106 testclassa106, TestClassA107 testclassa107, TestClassA108 testclassa108, TestClassA109 testclassa109) + { + } + } + [Export] + public class TestClassA28 + { + [ImportingConstructor] + public TestClassA28(TestClassA110 testclassa110, TestClassA111 testclassa111, TestClassA112 testclassa112, TestClassA113 testclassa113) + { + } + } + [Export] + public class TestClassA29 + { + [ImportingConstructor] + public TestClassA29(TestClassA114 testclassa114, TestClassA115 testclassa115, TestClassA116 testclassa116, TestClassA117 testclassa117) + { + } + } + [Export] + public class TestClassA30 + { + [ImportingConstructor] + public TestClassA30(TestClassA118 testclassa118, TestClassA119 testclassa119, TestClassA120 testclassa120, TestClassA121 testclassa121) + { + } + } + [Export] + public class TestClassA31 + { + [ImportingConstructor] + public TestClassA31(TestClassA122 testclassa122, TestClassA123 testclassa123, TestClassA124 testclassa124, TestClassA125 testclassa125) + { + } + } + [Export] + public class TestClassA32 + { + [ImportingConstructor] + public TestClassA32(TestClassA126 testclassa126, TestClassA127 testclassa127, TestClassA128 testclassa128, TestClassA129 testclassa129) + { + } + } + [Export] + public class TestClassA33 + { + [ImportingConstructor] + public TestClassA33(TestClassA130 testclassa130, TestClassA131 testclassa131, TestClassA132 testclassa132, TestClassA133 testclassa133) + { + } + } + [Export] + public class TestClassA34 + { + [ImportingConstructor] + public TestClassA34(TestClassA134 testclassa134, TestClassA135 testclassa135, TestClassA136 testclassa136, TestClassA137 testclassa137) + { + } + } + [Export] + public class TestClassA35 + { + [ImportingConstructor] + public TestClassA35(TestClassA138 testclassa138, TestClassA139 testclassa139, TestClassA140 testclassa140, TestClassA141 testclassa141) + { + } + } + [Export] + public class TestClassA36 + { + [ImportingConstructor] + public TestClassA36(TestClassA142 testclassa142, TestClassA143 testclassa143, TestClassA144 testclassa144, TestClassA145 testclassa145) + { + } + } + [Export] + public class TestClassA37 + { + [ImportingConstructor] + public TestClassA37(TestClassA146 testclassa146, TestClassA147 testclassa147, TestClassA148 testclassa148, TestClassA149 testclassa149) + { + } + } + [Export] + public class TestClassA38 + { + [ImportingConstructor] + public TestClassA38(TestClassA150 testclassa150, TestClassA151 testclassa151, TestClassA152 testclassa152, TestClassA153 testclassa153) + { + } + } + [Export] + public class TestClassA39 + { + [ImportingConstructor] + public TestClassA39(TestClassA154 testclassa154, TestClassA155 testclassa155, TestClassA156 testclassa156, TestClassA157 testclassa157) + { + } + } + [Export] + public class TestClassA40 + { + [ImportingConstructor] + public TestClassA40(TestClassA158 testclassa158, TestClassA159 testclassa159, TestClassA160 testclassa160, TestClassA161 testclassa161) + { + } + } + [Export] + public class TestClassA41 + { + [ImportingConstructor] + public TestClassA41(TestClassA162 testclassa162, TestClassA163 testclassa163, TestClassA164 testclassa164, TestClassA165 testclassa165) + { + } + } + [Export] + public class TestClassA42 + { + [ImportingConstructor] + public TestClassA42(TestClassA166 testclassa166, TestClassA167 testclassa167, TestClassA168 testclassa168, TestClassA169 testclassa169) + { + } + } + [Export] + public class TestClassA43 + { + [ImportingConstructor] + public TestClassA43(TestClassA170 testclassa170, TestClassA171 testclassa171, TestClassA172 testclassa172, TestClassA173 testclassa173) + { + } + } + [Export] + public class TestClassA44 + { + [ImportingConstructor] + public TestClassA44(TestClassA174 testclassa174, TestClassA175 testclassa175, TestClassA176 testclassa176, TestClassA177 testclassa177) + { + } + } + [Export] + public class TestClassA45 + { + [ImportingConstructor] + public TestClassA45(TestClassA178 testclassa178, TestClassA179 testclassa179, TestClassA180 testclassa180, TestClassA181 testclassa181) + { + } + } + [Export] + public class TestClassA46 + { + [ImportingConstructor] + public TestClassA46(TestClassA182 testclassa182, TestClassA183 testclassa183, TestClassA184 testclassa184, TestClassA185 testclassa185) + { + } + } + [Export] + public class TestClassA47 + { + [ImportingConstructor] + public TestClassA47(TestClassA186 testclassa186, TestClassA187 testclassa187, TestClassA188 testclassa188, TestClassA189 testclassa189) + { + } + } + [Export] + public class TestClassA48 + { + [ImportingConstructor] + public TestClassA48(TestClassA190 testclassa190, TestClassA191 testclassa191, TestClassA192 testclassa192, TestClassA193 testclassa193) + { + } + } + [Export] + public class TestClassA49 + { + [ImportingConstructor] + public TestClassA49(TestClassA194 testclassa194, TestClassA195 testclassa195, TestClassA196 testclassa196, TestClassA197 testclassa197) + { + } + } + [Export] + public class TestClassA50 + { + [ImportingConstructor] + public TestClassA50(TestClassA198 testclassa198, TestClassA199 testclassa199, TestClassA200 testclassa200, TestClassA201 testclassa201) + { + } + } + [Export] + public class TestClassA51 + { + [ImportingConstructor] + public TestClassA51(TestClassA202 testclassa202, TestClassA203 testclassa203, TestClassA204 testclassa204, TestClassA205 testclassa205) + { + } + } + [Export] + public class TestClassA52 + { + [ImportingConstructor] + public TestClassA52(TestClassA206 testclassa206, TestClassA207 testclassa207, TestClassA208 testclassa208, TestClassA209 testclassa209) + { + } + } + [Export] + public class TestClassA53 + { + [ImportingConstructor] + public TestClassA53(TestClassA210 testclassa210, TestClassA211 testclassa211, TestClassA212 testclassa212, TestClassA213 testclassa213) + { + } + } + [Export] + public class TestClassA54 + { + [ImportingConstructor] + public TestClassA54(TestClassA214 testclassa214, TestClassA215 testclassa215, TestClassA216 testclassa216, TestClassA217 testclassa217) + { + } + } + [Export] + public class TestClassA55 + { + [ImportingConstructor] + public TestClassA55(TestClassA218 testclassa218, TestClassA219 testclassa219, TestClassA220 testclassa220, TestClassA221 testclassa221) + { + } + } + [Export] + public class TestClassA56 + { + [ImportingConstructor] + public TestClassA56(TestClassA222 testclassa222, TestClassA223 testclassa223, TestClassA224 testclassa224, TestClassA225 testclassa225) + { + } + } + [Export] + public class TestClassA57 + { + [ImportingConstructor] + public TestClassA57(TestClassA226 testclassa226, TestClassA227 testclassa227, TestClassA228 testclassa228, TestClassA229 testclassa229) + { + } + } + [Export] + public class TestClassA58 + { + [ImportingConstructor] + public TestClassA58(TestClassA230 testclassa230, TestClassA231 testclassa231, TestClassA232 testclassa232, TestClassA233 testclassa233) + { + } + } + [Export] + public class TestClassA59 + { + [ImportingConstructor] + public TestClassA59(TestClassA234 testclassa234, TestClassA235 testclassa235, TestClassA236 testclassa236, TestClassA237 testclassa237) + { + } + } + [Export] + public class TestClassA60 + { + [ImportingConstructor] + public TestClassA60(TestClassA238 testclassa238, TestClassA239 testclassa239, TestClassA240 testclassa240, TestClassA241 testclassa241) + { + } + } + [Export] + public class TestClassA61 + { + [ImportingConstructor] + public TestClassA61(TestClassA242 testclassa242, TestClassA243 testclassa243, TestClassA244 testclassa244, TestClassA245 testclassa245) + { + } + } + [Export] + public class TestClassA62 + { + [ImportingConstructor] + public TestClassA62(TestClassA246 testclassa246, TestClassA247 testclassa247, TestClassA248 testclassa248, TestClassA249 testclassa249) + { + } + } + [Export] + public class TestClassA63 + { + [ImportingConstructor] + public TestClassA63(TestClassA250 testclassa250, TestClassA251 testclassa251, TestClassA252 testclassa252, TestClassA253 testclassa253) + { + } + } + [Export] + public class TestClassA64 + { + [ImportingConstructor] + public TestClassA64(TestClassA254 testclassa254, TestClassA255 testclassa255, TestClassA256 testclassa256, TestClassA257 testclassa257) + { + } + } + [Export] + public class TestClassA65 + { + [ImportingConstructor] + public TestClassA65(TestClassA258 testclassa258, TestClassA259 testclassa259, TestClassA260 testclassa260, TestClassA261 testclassa261) + { + } + } + [Export] + public class TestClassA66 + { + [ImportingConstructor] + public TestClassA66(TestClassA262 testclassa262, TestClassA263 testclassa263, TestClassA264 testclassa264, TestClassA265 testclassa265) + { + } + } + [Export] + public class TestClassA67 + { + [ImportingConstructor] + public TestClassA67(TestClassA266 testclassa266, TestClassA267 testclassa267, TestClassA268 testclassa268, TestClassA269 testclassa269) + { + } + } + [Export] + public class TestClassA68 + { + [ImportingConstructor] + public TestClassA68(TestClassA270 testclassa270, TestClassA271 testclassa271, TestClassA272 testclassa272, TestClassA273 testclassa273) + { + } + } + [Export] + public class TestClassA69 + { + [ImportingConstructor] + public TestClassA69(TestClassA274 testclassa274, TestClassA275 testclassa275, TestClassA276 testclassa276, TestClassA277 testclassa277) + { + } + } + [Export] + public class TestClassA70 + { + [ImportingConstructor] + public TestClassA70(TestClassA278 testclassa278, TestClassA279 testclassa279, TestClassA280 testclassa280, TestClassA281 testclassa281) + { + } + } + [Export] + public class TestClassA71 + { + [ImportingConstructor] + public TestClassA71(TestClassA282 testclassa282, TestClassA283 testclassa283, TestClassA284 testclassa284, TestClassA285 testclassa285) + { + } + } + [Export] + public class TestClassA72 + { + [ImportingConstructor] + public TestClassA72(TestClassA286 testclassa286, TestClassA287 testclassa287, TestClassA288 testclassa288, TestClassA289 testclassa289) + { + } + } + [Export] + public class TestClassA73 + { + [ImportingConstructor] + public TestClassA73(TestClassA290 testclassa290, TestClassA291 testclassa291, TestClassA292 testclassa292, TestClassA293 testclassa293) + { + } + } + [Export] + public class TestClassA74 + { + [ImportingConstructor] + public TestClassA74(TestClassA294 testclassa294, TestClassA295 testclassa295, TestClassA296 testclassa296, TestClassA297 testclassa297) + { + } + } + [Export] + public class TestClassA75 + { + [ImportingConstructor] + public TestClassA75(TestClassA298 testclassa298, TestClassA299 testclassa299, TestClassA300 testclassa300, TestClassA301 testclassa301) + { + } + } + [Export] + public class TestClassA76 + { + [ImportingConstructor] + public TestClassA76(TestClassA302 testclassa302, TestClassA303 testclassa303, TestClassA304 testclassa304, TestClassA305 testclassa305) + { + } + } + [Export] + public class TestClassA77 + { + [ImportingConstructor] + public TestClassA77(TestClassA306 testclassa306, TestClassA307 testclassa307, TestClassA308 testclassa308, TestClassA309 testclassa309) + { + } + } + [Export] + public class TestClassA78 + { + [ImportingConstructor] + public TestClassA78(TestClassA310 testclassa310, TestClassA311 testclassa311, TestClassA312 testclassa312, TestClassA313 testclassa313) + { + } + } + [Export] + public class TestClassA79 + { + [ImportingConstructor] + public TestClassA79(TestClassA314 testclassa314, TestClassA315 testclassa315, TestClassA316 testclassa316, TestClassA317 testclassa317) + { + } + } + [Export] + public class TestClassA80 + { + [ImportingConstructor] + public TestClassA80(TestClassA318 testclassa318, TestClassA319 testclassa319, TestClassA320 testclassa320, TestClassA321 testclassa321) + { + } + } + [Export] + public class TestClassA81 + { + [ImportingConstructor] + public TestClassA81(TestClassA322 testclassa322, TestClassA323 testclassa323, TestClassA324 testclassa324, TestClassA325 testclassa325) + { + } + } + [Export] + public class TestClassA82 + { + [ImportingConstructor] + public TestClassA82(TestClassA326 testclassa326, TestClassA327 testclassa327, TestClassA328 testclassa328, TestClassA329 testclassa329) + { + } + } + [Export] + public class TestClassA83 + { + [ImportingConstructor] + public TestClassA83(TestClassA330 testclassa330, TestClassA331 testclassa331, TestClassA332 testclassa332, TestClassA333 testclassa333) + { + } + } + [Export] + public class TestClassA84 + { + [ImportingConstructor] + public TestClassA84(TestClassA334 testclassa334, TestClassA335 testclassa335, TestClassA336 testclassa336, TestClassA337 testclassa337) + { + } + } + [Export] + public class TestClassA85 + { + [ImportingConstructor] + public TestClassA85(TestClassA338 testclassa338, TestClassA339 testclassa339, TestClassA340 testclassa340, TestClassA341 testclassa341) + { + } + } + [Export] + public class TestClassA86 + { + [ImportingConstructor] + public TestClassA86(TestClassA342 testclassa342, TestClassA343 testclassa343, TestClassA344 testclassa344, TestClassA345 testclassa345) + { + } + } + [Export] + public class TestClassA87 + { + [ImportingConstructor] + public TestClassA87(TestClassA346 testclassa346, TestClassA347 testclassa347, TestClassA348 testclassa348, TestClassA349 testclassa349) + { + } + } + [Export] + public class TestClassA88 + { + [ImportingConstructor] + public TestClassA88(TestClassA350 testclassa350, TestClassA351 testclassa351, TestClassA352 testclassa352, TestClassA353 testclassa353) + { + } + } + [Export] + public class TestClassA89 + { + [ImportingConstructor] + public TestClassA89(TestClassA354 testclassa354, TestClassA355 testclassa355, TestClassA356 testclassa356, TestClassA357 testclassa357) + { + } + } + [Export] + public class TestClassA90 + { + [ImportingConstructor] + public TestClassA90(TestClassA358 testclassa358, TestClassA359 testclassa359, TestClassA360 testclassa360, TestClassA361 testclassa361) + { + } + } + [Export] + public class TestClassA91 + { + [ImportingConstructor] + public TestClassA91(TestClassA362 testclassa362, TestClassA363 testclassa363, TestClassA364 testclassa364, TestClassA365 testclassa365) + { + } + } + [Export] + public class TestClassA92 + { + [ImportingConstructor] + public TestClassA92(TestClassA366 testclassa366, TestClassA367 testclassa367, TestClassA368 testclassa368, TestClassA369 testclassa369) + { + } + } + [Export] + public class TestClassA93 + { + [ImportingConstructor] + public TestClassA93(TestClassA370 testclassa370, TestClassA371 testclassa371, TestClassA372 testclassa372, TestClassA373 testclassa373) + { + } + } + [Export] + public class TestClassA94 + { + [ImportingConstructor] + public TestClassA94(TestClassA374 testclassa374, TestClassA375 testclassa375, TestClassA376 testclassa376, TestClassA377 testclassa377) + { + } + } + [Export] + public class TestClassA95 + { + [ImportingConstructor] + public TestClassA95(TestClassA378 testclassa378, TestClassA379 testclassa379, TestClassA380 testclassa380, TestClassA381 testclassa381) + { + } + } + [Export] + public class TestClassA96 + { + [ImportingConstructor] + public TestClassA96(TestClassA382 testclassa382, TestClassA383 testclassa383, TestClassA384 testclassa384, TestClassA385 testclassa385) + { + } + } + [Export] + public class TestClassA97 + { + [ImportingConstructor] + public TestClassA97(TestClassA386 testclassa386, TestClassA387 testclassa387, TestClassA388 testclassa388, TestClassA389 testclassa389) + { + } + } + [Export] + public class TestClassA98 + { + [ImportingConstructor] + public TestClassA98(TestClassA390 testclassa390, TestClassA391 testclassa391, TestClassA392 testclassa392, TestClassA393 testclassa393) + { + } + } + [Export] + public class TestClassA99 + { + [ImportingConstructor] + public TestClassA99(TestClassA394 testclassa394, TestClassA395 testclassa395, TestClassA396 testclassa396, TestClassA397 testclassa397) + { + } + } + [Export] + public class TestClassA100 + { + [ImportingConstructor] + public TestClassA100(TestClassA398 testclassa398, TestClassA399 testclassa399, TestClassA400 testclassa400, TestClassA401 testclassa401) + { + } + } + [Export] + public class TestClassA101 + { + [ImportingConstructor] + public TestClassA101(TestClassA402 testclassa402, TestClassA403 testclassa403, TestClassA404 testclassa404, TestClassA405 testclassa405) + { + } + } + [Export] + public class TestClassA102 + { + [ImportingConstructor] + public TestClassA102(TestClassA406 testclassa406, TestClassA407 testclassa407, TestClassA408 testclassa408, TestClassA409 testclassa409) + { + } + } + [Export] + public class TestClassA103 + { + [ImportingConstructor] + public TestClassA103(TestClassA410 testclassa410, TestClassA411 testclassa411, TestClassA412 testclassa412, TestClassA413 testclassa413) + { + } + } + [Export] + public class TestClassA104 + { + [ImportingConstructor] + public TestClassA104(TestClassA414 testclassa414, TestClassA415 testclassa415, TestClassA416 testclassa416, TestClassA417 testclassa417) + { + } + } + [Export] + public class TestClassA105 + { + [ImportingConstructor] + public TestClassA105(TestClassA418 testclassa418, TestClassA419 testclassa419, TestClassA420 testclassa420, TestClassA421 testclassa421) + { + } + } + [Export] + public class TestClassA106 + { + [ImportingConstructor] + public TestClassA106(TestClassA422 testclassa422, TestClassA423 testclassa423, TestClassA424 testclassa424, TestClassA425 testclassa425) + { + } + } + [Export] + public class TestClassA107 + { + [ImportingConstructor] + public TestClassA107(TestClassA426 testclassa426, TestClassA427 testclassa427, TestClassA428 testclassa428, TestClassA429 testclassa429) + { + } + } + [Export] + public class TestClassA108 + { + [ImportingConstructor] + public TestClassA108(TestClassA430 testclassa430, TestClassA431 testclassa431, TestClassA432 testclassa432, TestClassA433 testclassa433) + { + } + } + [Export] + public class TestClassA109 + { + [ImportingConstructor] + public TestClassA109(TestClassA434 testclassa434, TestClassA435 testclassa435, TestClassA436 testclassa436, TestClassA437 testclassa437) + { + } + } + [Export] + public class TestClassA110 + { + [ImportingConstructor] + public TestClassA110(TestClassA438 testclassa438, TestClassA439 testclassa439, TestClassA440 testclassa440, TestClassA441 testclassa441) + { + } + } + [Export] + public class TestClassA111 + { + [ImportingConstructor] + public TestClassA111(TestClassA442 testclassa442, TestClassA443 testclassa443, TestClassA444 testclassa444, TestClassA445 testclassa445) + { + } + } + [Export] + public class TestClassA112 + { + [ImportingConstructor] + public TestClassA112(TestClassA446 testclassa446, TestClassA447 testclassa447, TestClassA448 testclassa448, TestClassA449 testclassa449) + { + } + } + [Export] + public class TestClassA113 + { + [ImportingConstructor] + public TestClassA113(TestClassA450 testclassa450, TestClassA451 testclassa451, TestClassA452 testclassa452, TestClassA453 testclassa453) + { + } + } + [Export] + public class TestClassA114 + { + [ImportingConstructor] + public TestClassA114(TestClassA454 testclassa454, TestClassA455 testclassa455, TestClassA456 testclassa456, TestClassA457 testclassa457) + { + } + } + [Export] + public class TestClassA115 + { + [ImportingConstructor] + public TestClassA115(TestClassA458 testclassa458, TestClassA459 testclassa459, TestClassA460 testclassa460, TestClassA461 testclassa461) + { + } + } + [Export] + public class TestClassA116 + { + [ImportingConstructor] + public TestClassA116(TestClassA462 testclassa462, TestClassA463 testclassa463, TestClassA464 testclassa464, TestClassA465 testclassa465) + { + } + } + [Export] + public class TestClassA117 + { + [ImportingConstructor] + public TestClassA117(TestClassA466 testclassa466, TestClassA467 testclassa467, TestClassA468 testclassa468, TestClassA469 testclassa469) + { + } + } + [Export] + public class TestClassA118 + { + [ImportingConstructor] + public TestClassA118(TestClassA470 testclassa470, TestClassA471 testclassa471, TestClassA472 testclassa472, TestClassA473 testclassa473) + { + } + } + [Export] + public class TestClassA119 + { + [ImportingConstructor] + public TestClassA119(TestClassA474 testclassa474, TestClassA475 testclassa475, TestClassA476 testclassa476, TestClassA477 testclassa477) + { + } + } + [Export] + public class TestClassA120 + { + [ImportingConstructor] + public TestClassA120(TestClassA478 testclassa478, TestClassA479 testclassa479, TestClassA480 testclassa480, TestClassA481 testclassa481) + { + } + } + [Export] + public class TestClassA121 + { + [ImportingConstructor] + public TestClassA121(TestClassA482 testclassa482, TestClassA483 testclassa483, TestClassA484 testclassa484, TestClassA485 testclassa485) + { + } + } + [Export] + public class TestClassA122 + { + [ImportingConstructor] + public TestClassA122(TestClassA486 testclassa486, TestClassA487 testclassa487, TestClassA488 testclassa488, TestClassA489 testclassa489) + { + } + } + [Export] + public class TestClassA123 + { + [ImportingConstructor] + public TestClassA123(TestClassA490 testclassa490, TestClassA491 testclassa491, TestClassA492 testclassa492, TestClassA493 testclassa493) + { + } + } + [Export] + public class TestClassA124 + { + [ImportingConstructor] + public TestClassA124(TestClassA494 testclassa494, TestClassA495 testclassa495, TestClassA496 testclassa496, TestClassA497 testclassa497) + { + } + } + [Export] + public class TestClassA125 + { + [ImportingConstructor] + public TestClassA125(TestClassA498 testclassa498, TestClassA499 testclassa499, TestClassA500 testclassa500, TestClassA501 testclassa501) + { + } + } + [Export] + public class TestClassA126 + { + [ImportingConstructor] + public TestClassA126(TestClassA502 testclassa502, TestClassA503 testclassa503, TestClassA504 testclassa504, TestClassA505 testclassa505) + { + } + } + [Export] + public class TestClassA127 + { + [ImportingConstructor] + public TestClassA127(TestClassA506 testclassa506, TestClassA507 testclassa507, TestClassA508 testclassa508, TestClassA509 testclassa509) + { + } + } + [Export] + public class TestClassA128 + { + [ImportingConstructor] + public TestClassA128(TestClassA510 testclassa510, TestClassA511 testclassa511, TestClassA512 testclassa512, TestClassA513 testclassa513) + { + } + } + [Export] + public class TestClassA129 + { + [ImportingConstructor] + public TestClassA129(TestClassA514 testclassa514, TestClassA515 testclassa515, TestClassA516 testclassa516, TestClassA517 testclassa517) + { + } + } + [Export] + public class TestClassA130 + { + [ImportingConstructor] + public TestClassA130(TestClassA518 testclassa518, TestClassA519 testclassa519, TestClassA520 testclassa520, TestClassA521 testclassa521) + { + } + } + [Export] + public class TestClassA131 + { + [ImportingConstructor] + public TestClassA131(TestClassA522 testclassa522, TestClassA523 testclassa523, TestClassA524 testclassa524, TestClassA525 testclassa525) + { + } + } + [Export] + public class TestClassA132 + { + [ImportingConstructor] + public TestClassA132(TestClassA526 testclassa526, TestClassA527 testclassa527, TestClassA528 testclassa528, TestClassA529 testclassa529) + { + } + } + [Export] + public class TestClassA133 + { + [ImportingConstructor] + public TestClassA133(TestClassA530 testclassa530, TestClassA531 testclassa531, TestClassA532 testclassa532, TestClassA533 testclassa533) + { + } + } + [Export] + public class TestClassA134 + { + [ImportingConstructor] + public TestClassA134(TestClassA534 testclassa534, TestClassA535 testclassa535, TestClassA536 testclassa536, TestClassA537 testclassa537) + { + } + } + [Export] + public class TestClassA135 + { + [ImportingConstructor] + public TestClassA135(TestClassA538 testclassa538, TestClassA539 testclassa539, TestClassA540 testclassa540, TestClassA541 testclassa541) + { + } + } + [Export] + public class TestClassA136 + { + [ImportingConstructor] + public TestClassA136(TestClassA542 testclassa542, TestClassA543 testclassa543, TestClassA544 testclassa544, TestClassA545 testclassa545) + { + } + } + [Export] + public class TestClassA137 + { + [ImportingConstructor] + public TestClassA137(TestClassA546 testclassa546, TestClassA547 testclassa547, TestClassA548 testclassa548, TestClassA549 testclassa549) + { + } + } + [Export] + public class TestClassA138 + { + [ImportingConstructor] + public TestClassA138(TestClassA550 testclassa550, TestClassA551 testclassa551, TestClassA552 testclassa552, TestClassA553 testclassa553) + { + } + } + [Export] + public class TestClassA139 + { + [ImportingConstructor] + public TestClassA139(TestClassA554 testclassa554, TestClassA555 testclassa555, TestClassA556 testclassa556, TestClassA557 testclassa557) + { + } + } + [Export] + public class TestClassA140 + { + [ImportingConstructor] + public TestClassA140(TestClassA558 testclassa558, TestClassA559 testclassa559, TestClassA560 testclassa560, TestClassA561 testclassa561) + { + } + } + [Export] + public class TestClassA141 + { + [ImportingConstructor] + public TestClassA141(TestClassA562 testclassa562, TestClassA563 testclassa563, TestClassA564 testclassa564, TestClassA565 testclassa565) + { + } + } + [Export] + public class TestClassA142 + { + [ImportingConstructor] + public TestClassA142(TestClassA566 testclassa566, TestClassA567 testclassa567, TestClassA568 testclassa568, TestClassA569 testclassa569) + { + } + } + [Export] + public class TestClassA143 + { + [ImportingConstructor] + public TestClassA143(TestClassA570 testclassa570, TestClassA571 testclassa571, TestClassA572 testclassa572, TestClassA573 testclassa573) + { + } + } + [Export] + public class TestClassA144 + { + [ImportingConstructor] + public TestClassA144(TestClassA574 testclassa574, TestClassA575 testclassa575, TestClassA576 testclassa576, TestClassA577 testclassa577) + { + } + } + [Export] + public class TestClassA145 + { + [ImportingConstructor] + public TestClassA145(TestClassA578 testclassa578, TestClassA579 testclassa579, TestClassA580 testclassa580, TestClassA581 testclassa581) + { + } + } + [Export] + public class TestClassA146 + { + [ImportingConstructor] + public TestClassA146(TestClassA582 testclassa582, TestClassA583 testclassa583, TestClassA584 testclassa584, TestClassA585 testclassa585) + { + } + } + [Export] + public class TestClassA147 + { + [ImportingConstructor] + public TestClassA147(TestClassA586 testclassa586, TestClassA587 testclassa587, TestClassA588 testclassa588, TestClassA589 testclassa589) + { + } + } + [Export] + public class TestClassA148 + { + [ImportingConstructor] + public TestClassA148(TestClassA590 testclassa590, TestClassA591 testclassa591, TestClassA592 testclassa592, TestClassA593 testclassa593) + { + } + } + [Export] + public class TestClassA149 + { + [ImportingConstructor] + public TestClassA149(TestClassA594 testclassa594, TestClassA595 testclassa595, TestClassA596 testclassa596, TestClassA597 testclassa597) + { + } + } + [Export] + public class TestClassA150 + { + [ImportingConstructor] + public TestClassA150(TestClassA598 testclassa598, TestClassA599 testclassa599, TestClassA600 testclassa600, TestClassA601 testclassa601) + { + } + } + [Export] + public class TestClassA151 + { + [ImportingConstructor] + public TestClassA151(TestClassA602 testclassa602, TestClassA603 testclassa603, TestClassA604 testclassa604, TestClassA605 testclassa605) + { + } + } + [Export] + public class TestClassA152 + { + [ImportingConstructor] + public TestClassA152(TestClassA606 testclassa606, TestClassA607 testclassa607, TestClassA608 testclassa608, TestClassA609 testclassa609) + { + } + } + [Export] + public class TestClassA153 + { + [ImportingConstructor] + public TestClassA153(TestClassA610 testclassa610, TestClassA611 testclassa611, TestClassA612 testclassa612, TestClassA613 testclassa613) + { + } + } + [Export] + public class TestClassA154 + { + [ImportingConstructor] + public TestClassA154(TestClassA614 testclassa614, TestClassA615 testclassa615, TestClassA616 testclassa616, TestClassA617 testclassa617) + { + } + } + [Export] + public class TestClassA155 + { + [ImportingConstructor] + public TestClassA155(TestClassA618 testclassa618, TestClassA619 testclassa619, TestClassA620 testclassa620, TestClassA621 testclassa621) + { + } + } + [Export] + public class TestClassA156 + { + [ImportingConstructor] + public TestClassA156(TestClassA622 testclassa622, TestClassA623 testclassa623, TestClassA624 testclassa624, TestClassA625 testclassa625) + { + } + } + [Export] + public class TestClassA157 + { + [ImportingConstructor] + public TestClassA157(TestClassA626 testclassa626, TestClassA627 testclassa627, TestClassA628 testclassa628, TestClassA629 testclassa629) + { + } + } + [Export] + public class TestClassA158 + { + [ImportingConstructor] + public TestClassA158(TestClassA630 testclassa630, TestClassA631 testclassa631, TestClassA632 testclassa632, TestClassA633 testclassa633) + { + } + } + [Export] + public class TestClassA159 + { + [ImportingConstructor] + public TestClassA159(TestClassA634 testclassa634, TestClassA635 testclassa635, TestClassA636 testclassa636, TestClassA637 testclassa637) + { + } + } + [Export] + public class TestClassA160 + { + [ImportingConstructor] + public TestClassA160(TestClassA638 testclassa638, TestClassA639 testclassa639, TestClassA640 testclassa640, TestClassA641 testclassa641) + { + } + } + [Export] + public class TestClassA161 + { + [ImportingConstructor] + public TestClassA161(TestClassA642 testclassa642, TestClassA643 testclassa643, TestClassA644 testclassa644, TestClassA645 testclassa645) + { + } + } + [Export] + public class TestClassA162 + { + [ImportingConstructor] + public TestClassA162(TestClassA646 testclassa646, TestClassA647 testclassa647, TestClassA648 testclassa648, TestClassA649 testclassa649) + { + } + } + [Export] + public class TestClassA163 + { + [ImportingConstructor] + public TestClassA163(TestClassA650 testclassa650, TestClassA651 testclassa651, TestClassA652 testclassa652, TestClassA653 testclassa653) + { + } + } + [Export] + public class TestClassA164 + { + [ImportingConstructor] + public TestClassA164(TestClassA654 testclassa654, TestClassA655 testclassa655, TestClassA656 testclassa656, TestClassA657 testclassa657) + { + } + } + [Export] + public class TestClassA165 + { + [ImportingConstructor] + public TestClassA165(TestClassA658 testclassa658, TestClassA659 testclassa659, TestClassA660 testclassa660, TestClassA661 testclassa661) + { + } + } + [Export] + public class TestClassA166 + { + [ImportingConstructor] + public TestClassA166(TestClassA662 testclassa662, TestClassA663 testclassa663, TestClassA664 testclassa664, TestClassA665 testclassa665) + { + } + } + [Export] + public class TestClassA167 + { + [ImportingConstructor] + public TestClassA167(TestClassA666 testclassa666, TestClassA667 testclassa667, TestClassA668 testclassa668, TestClassA669 testclassa669) + { + } + } + [Export] + public class TestClassA168 + { + [ImportingConstructor] + public TestClassA168(TestClassA670 testclassa670, TestClassA671 testclassa671, TestClassA672 testclassa672, TestClassA673 testclassa673) + { + } + } + [Export] + public class TestClassA169 + { + [ImportingConstructor] + public TestClassA169(TestClassA674 testclassa674, TestClassA675 testclassa675, TestClassA676 testclassa676, TestClassA677 testclassa677) + { + } + } + [Export] + public class TestClassA170 + { + [ImportingConstructor] + public TestClassA170(TestClassA678 testclassa678, TestClassA679 testclassa679, TestClassA680 testclassa680, TestClassA681 testclassa681) + { + } + } + [Export] + public class TestClassA171 + { + [ImportingConstructor] + public TestClassA171(TestClassA682 testclassa682, TestClassA683 testclassa683, TestClassA684 testclassa684, TestClassA685 testclassa685) + { + } + } + [Export] + public class TestClassA172 + { + [ImportingConstructor] + public TestClassA172(TestClassA686 testclassa686, TestClassA687 testclassa687, TestClassA688 testclassa688, TestClassA689 testclassa689) + { + } + } + [Export] + public class TestClassA173 + { + [ImportingConstructor] + public TestClassA173(TestClassA690 testclassa690, TestClassA691 testclassa691, TestClassA692 testclassa692, TestClassA693 testclassa693) + { + } + } + [Export] + public class TestClassA174 + { + [ImportingConstructor] + public TestClassA174(TestClassA694 testclassa694, TestClassA695 testclassa695, TestClassA696 testclassa696, TestClassA697 testclassa697) + { + } + } + [Export] + public class TestClassA175 + { + [ImportingConstructor] + public TestClassA175(TestClassA698 testclassa698, TestClassA699 testclassa699, TestClassA700 testclassa700, TestClassA701 testclassa701) + { + } + } + [Export] + public class TestClassA176 + { + [ImportingConstructor] + public TestClassA176(TestClassA702 testclassa702, TestClassA703 testclassa703, TestClassA704 testclassa704, TestClassA705 testclassa705) + { + } + } + [Export] + public class TestClassA177 + { + [ImportingConstructor] + public TestClassA177(TestClassA706 testclassa706, TestClassA707 testclassa707, TestClassA708 testclassa708, TestClassA709 testclassa709) + { + } + } + [Export] + public class TestClassA178 + { + [ImportingConstructor] + public TestClassA178(TestClassA710 testclassa710, TestClassA711 testclassa711, TestClassA712 testclassa712, TestClassA713 testclassa713) + { + } + } + [Export] + public class TestClassA179 + { + [ImportingConstructor] + public TestClassA179(TestClassA714 testclassa714, TestClassA715 testclassa715, TestClassA716 testclassa716, TestClassA717 testclassa717) + { + } + } + [Export] + public class TestClassA180 + { + [ImportingConstructor] + public TestClassA180(TestClassA718 testclassa718, TestClassA719 testclassa719, TestClassA720 testclassa720, TestClassA721 testclassa721) + { + } + } + [Export] + public class TestClassA181 + { + [ImportingConstructor] + public TestClassA181(TestClassA722 testclassa722, TestClassA723 testclassa723, TestClassA724 testclassa724, TestClassA725 testclassa725) + { + } + } + [Export] + public class TestClassA182 + { + [ImportingConstructor] + public TestClassA182(TestClassA726 testclassa726, TestClassA727 testclassa727, TestClassA728 testclassa728, TestClassA729 testclassa729) + { + } + } + [Export] + public class TestClassA183 + { + [ImportingConstructor] + public TestClassA183(TestClassA730 testclassa730, TestClassA731 testclassa731, TestClassA732 testclassa732, TestClassA733 testclassa733) + { + } + } + [Export] + public class TestClassA184 + { + [ImportingConstructor] + public TestClassA184(TestClassA734 testclassa734, TestClassA735 testclassa735, TestClassA736 testclassa736, TestClassA737 testclassa737) + { + } + } + [Export] + public class TestClassA185 + { + [ImportingConstructor] + public TestClassA185(TestClassA738 testclassa738, TestClassA739 testclassa739, TestClassA740 testclassa740, TestClassA741 testclassa741) + { + } + } + [Export] + public class TestClassA186 + { + [ImportingConstructor] + public TestClassA186(TestClassA742 testclassa742, TestClassA743 testclassa743, TestClassA744 testclassa744, TestClassA745 testclassa745) + { + } + } + [Export] + public class TestClassA187 + { + [ImportingConstructor] + public TestClassA187(TestClassA746 testclassa746, TestClassA747 testclassa747, TestClassA748 testclassa748, TestClassA749 testclassa749) + { + } + } + [Export] + public class TestClassA188 + { + [ImportingConstructor] + public TestClassA188(TestClassA750 testclassa750, TestClassA751 testclassa751, TestClassA752 testclassa752, TestClassA753 testclassa753) + { + } + } + [Export] + public class TestClassA189 + { + [ImportingConstructor] + public TestClassA189(TestClassA754 testclassa754, TestClassA755 testclassa755, TestClassA756 testclassa756, TestClassA757 testclassa757) + { + } + } + [Export] + public class TestClassA190 + { + [ImportingConstructor] + public TestClassA190(TestClassA758 testclassa758, TestClassA759 testclassa759, TestClassA760 testclassa760, TestClassA761 testclassa761) + { + } + } + [Export] + public class TestClassA191 + { + [ImportingConstructor] + public TestClassA191(TestClassA762 testclassa762, TestClassA763 testclassa763, TestClassA764 testclassa764, TestClassA765 testclassa765) + { + } + } + [Export] + public class TestClassA192 + { + [ImportingConstructor] + public TestClassA192(TestClassA766 testclassa766, TestClassA767 testclassa767, TestClassA768 testclassa768, TestClassA769 testclassa769) + { + } + } + [Export] + public class TestClassA193 + { + [ImportingConstructor] + public TestClassA193(TestClassA770 testclassa770, TestClassA771 testclassa771, TestClassA772 testclassa772, TestClassA773 testclassa773) + { + } + } + [Export] + public class TestClassA194 + { + [ImportingConstructor] + public TestClassA194(TestClassA774 testclassa774, TestClassA775 testclassa775, TestClassA776 testclassa776, TestClassA777 testclassa777) + { + } + } + [Export] + public class TestClassA195 + { + [ImportingConstructor] + public TestClassA195(TestClassA778 testclassa778, TestClassA779 testclassa779, TestClassA780 testclassa780, TestClassA781 testclassa781) + { + } + } + [Export] + public class TestClassA196 + { + [ImportingConstructor] + public TestClassA196(TestClassA782 testclassa782, TestClassA783 testclassa783, TestClassA784 testclassa784, TestClassA785 testclassa785) + { + } + } + [Export] + public class TestClassA197 + { + [ImportingConstructor] + public TestClassA197(TestClassA786 testclassa786, TestClassA787 testclassa787, TestClassA788 testclassa788, TestClassA789 testclassa789) + { + } + } + [Export] + public class TestClassA198 + { + [ImportingConstructor] + public TestClassA198(TestClassA790 testclassa790, TestClassA791 testclassa791, TestClassA792 testclassa792, TestClassA793 testclassa793) + { + } + } + [Export] + public class TestClassA199 + { + [ImportingConstructor] + public TestClassA199(TestClassA794 testclassa794, TestClassA795 testclassa795, TestClassA796 testclassa796, TestClassA797 testclassa797) + { + } + } + [Export] + public class TestClassA200 + { + [ImportingConstructor] + public TestClassA200(TestClassA798 testclassa798, TestClassA799 testclassa799, TestClassA800 testclassa800, TestClassA801 testclassa801) + { + } + } + [Export] + public class TestClassA201 + { + [ImportingConstructor] + public TestClassA201(TestClassA802 testclassa802, TestClassA803 testclassa803, TestClassA804 testclassa804, TestClassA805 testclassa805) + { + } + } + [Export] + public class TestClassA202 + { + [ImportingConstructor] + public TestClassA202(TestClassA806 testclassa806, TestClassA807 testclassa807, TestClassA808 testclassa808, TestClassA809 testclassa809) + { + } + } + [Export] + public class TestClassA203 + { + [ImportingConstructor] + public TestClassA203(TestClassA810 testclassa810, TestClassA811 testclassa811, TestClassA812 testclassa812, TestClassA813 testclassa813) + { + } + } + [Export] + public class TestClassA204 + { + [ImportingConstructor] + public TestClassA204(TestClassA814 testclassa814, TestClassA815 testclassa815, TestClassA816 testclassa816, TestClassA817 testclassa817) + { + } + } + [Export] + public class TestClassA205 + { + [ImportingConstructor] + public TestClassA205(TestClassA818 testclassa818, TestClassA819 testclassa819, TestClassA820 testclassa820, TestClassA821 testclassa821) + { + } + } + [Export] + public class TestClassA206 + { + [ImportingConstructor] + public TestClassA206(TestClassA822 testclassa822, TestClassA823 testclassa823, TestClassA824 testclassa824, TestClassA825 testclassa825) + { + } + } + [Export] + public class TestClassA207 + { + [ImportingConstructor] + public TestClassA207(TestClassA826 testclassa826, TestClassA827 testclassa827, TestClassA828 testclassa828, TestClassA829 testclassa829) + { + } + } + [Export] + public class TestClassA208 + { + [ImportingConstructor] + public TestClassA208(TestClassA830 testclassa830, TestClassA831 testclassa831, TestClassA832 testclassa832, TestClassA833 testclassa833) + { + } + } + [Export] + public class TestClassA209 + { + [ImportingConstructor] + public TestClassA209(TestClassA834 testclassa834, TestClassA835 testclassa835, TestClassA836 testclassa836, TestClassA837 testclassa837) + { + } + } + [Export] + public class TestClassA210 + { + [ImportingConstructor] + public TestClassA210(TestClassA838 testclassa838, TestClassA839 testclassa839, TestClassA840 testclassa840, TestClassA841 testclassa841) + { + } + } + [Export] + public class TestClassA211 + { + [ImportingConstructor] + public TestClassA211(TestClassA842 testclassa842, TestClassA843 testclassa843, TestClassA844 testclassa844, TestClassA845 testclassa845) + { + } + } + [Export] + public class TestClassA212 + { + [ImportingConstructor] + public TestClassA212(TestClassA846 testclassa846, TestClassA847 testclassa847, TestClassA848 testclassa848, TestClassA849 testclassa849) + { + } + } + [Export] + public class TestClassA213 + { + [ImportingConstructor] + public TestClassA213(TestClassA850 testclassa850, TestClassA851 testclassa851, TestClassA852 testclassa852, TestClassA853 testclassa853) + { + } + } + [Export] + public class TestClassA214 + { + [ImportingConstructor] + public TestClassA214(TestClassA854 testclassa854, TestClassA855 testclassa855, TestClassA856 testclassa856, TestClassA857 testclassa857) + { + } + } + [Export] + public class TestClassA215 + { + [ImportingConstructor] + public TestClassA215(TestClassA858 testclassa858, TestClassA859 testclassa859, TestClassA860 testclassa860, TestClassA861 testclassa861) + { + } + } + [Export] + public class TestClassA216 + { + [ImportingConstructor] + public TestClassA216(TestClassA862 testclassa862, TestClassA863 testclassa863, TestClassA864 testclassa864, TestClassA865 testclassa865) + { + } + } + [Export] + public class TestClassA217 + { + [ImportingConstructor] + public TestClassA217(TestClassA866 testclassa866, TestClassA867 testclassa867, TestClassA868 testclassa868, TestClassA869 testclassa869) + { + } + } + [Export] + public class TestClassA218 + { + [ImportingConstructor] + public TestClassA218(TestClassA870 testclassa870, TestClassA871 testclassa871, TestClassA872 testclassa872, TestClassA873 testclassa873) + { + } + } + [Export] + public class TestClassA219 + { + [ImportingConstructor] + public TestClassA219(TestClassA874 testclassa874, TestClassA875 testclassa875, TestClassA876 testclassa876, TestClassA877 testclassa877) + { + } + } + [Export] + public class TestClassA220 + { + [ImportingConstructor] + public TestClassA220(TestClassA878 testclassa878, TestClassA879 testclassa879, TestClassA880 testclassa880, TestClassA881 testclassa881) + { + } + } + [Export] + public class TestClassA221 + { + [ImportingConstructor] + public TestClassA221(TestClassA882 testclassa882, TestClassA883 testclassa883, TestClassA884 testclassa884, TestClassA885 testclassa885) + { + } + } + [Export] + public class TestClassA222 + { + [ImportingConstructor] + public TestClassA222(TestClassA886 testclassa886, TestClassA887 testclassa887, TestClassA888 testclassa888, TestClassA889 testclassa889) + { + } + } + [Export] + public class TestClassA223 + { + [ImportingConstructor] + public TestClassA223(TestClassA890 testclassa890, TestClassA891 testclassa891, TestClassA892 testclassa892, TestClassA893 testclassa893) + { + } + } + [Export] + public class TestClassA224 + { + [ImportingConstructor] + public TestClassA224(TestClassA894 testclassa894, TestClassA895 testclassa895, TestClassA896 testclassa896, TestClassA897 testclassa897) + { + } + } + [Export] + public class TestClassA225 + { + [ImportingConstructor] + public TestClassA225(TestClassA898 testclassa898, TestClassA899 testclassa899, TestClassA900 testclassa900, TestClassA901 testclassa901) + { + } + } + [Export] + public class TestClassA226 + { + [ImportingConstructor] + public TestClassA226(TestClassA902 testclassa902, TestClassA903 testclassa903, TestClassA904 testclassa904, TestClassA905 testclassa905) + { + } + } + [Export] + public class TestClassA227 + { + [ImportingConstructor] + public TestClassA227(TestClassA906 testclassa906, TestClassA907 testclassa907, TestClassA908 testclassa908, TestClassA909 testclassa909) + { + } + } + [Export] + public class TestClassA228 + { + [ImportingConstructor] + public TestClassA228(TestClassA910 testclassa910, TestClassA911 testclassa911, TestClassA912 testclassa912, TestClassA913 testclassa913) + { + } + } + [Export] + public class TestClassA229 + { + [ImportingConstructor] + public TestClassA229(TestClassA914 testclassa914, TestClassA915 testclassa915, TestClassA916 testclassa916, TestClassA917 testclassa917) + { + } + } + [Export] + public class TestClassA230 + { + [ImportingConstructor] + public TestClassA230(TestClassA918 testclassa918, TestClassA919 testclassa919, TestClassA920 testclassa920, TestClassA921 testclassa921) + { + } + } + [Export] + public class TestClassA231 + { + [ImportingConstructor] + public TestClassA231(TestClassA922 testclassa922, TestClassA923 testclassa923, TestClassA924 testclassa924, TestClassA925 testclassa925) + { + } + } + [Export] + public class TestClassA232 + { + [ImportingConstructor] + public TestClassA232(TestClassA926 testclassa926, TestClassA927 testclassa927, TestClassA928 testclassa928, TestClassA929 testclassa929) + { + } + } + [Export] + public class TestClassA233 + { + [ImportingConstructor] + public TestClassA233(TestClassA930 testclassa930, TestClassA931 testclassa931, TestClassA932 testclassa932, TestClassA933 testclassa933) + { + } + } + [Export] + public class TestClassA234 + { + [ImportingConstructor] + public TestClassA234(TestClassA934 testclassa934, TestClassA935 testclassa935, TestClassA936 testclassa936, TestClassA937 testclassa937) + { + } + } + [Export] + public class TestClassA235 + { + [ImportingConstructor] + public TestClassA235(TestClassA938 testclassa938, TestClassA939 testclassa939, TestClassA940 testclassa940, TestClassA941 testclassa941) + { + } + } + [Export] + public class TestClassA236 + { + [ImportingConstructor] + public TestClassA236(TestClassA942 testclassa942, TestClassA943 testclassa943, TestClassA944 testclassa944, TestClassA945 testclassa945) + { + } + } + [Export] + public class TestClassA237 + { + [ImportingConstructor] + public TestClassA237(TestClassA946 testclassa946, TestClassA947 testclassa947, TestClassA948 testclassa948, TestClassA949 testclassa949) + { + } + } + [Export] + public class TestClassA238 + { + [ImportingConstructor] + public TestClassA238(TestClassA950 testclassa950, TestClassA951 testclassa951, TestClassA952 testclassa952, TestClassA953 testclassa953) + { + } + } + [Export] + public class TestClassA239 + { + [ImportingConstructor] + public TestClassA239(TestClassA954 testclassa954, TestClassA955 testclassa955, TestClassA956 testclassa956, TestClassA957 testclassa957) + { + } + } + [Export] + public class TestClassA240 + { + [ImportingConstructor] + public TestClassA240(TestClassA958 testclassa958, TestClassA959 testclassa959, TestClassA960 testclassa960, TestClassA961 testclassa961) + { + } + } + [Export] + public class TestClassA241 + { + [ImportingConstructor] + public TestClassA241(TestClassA962 testclassa962, TestClassA963 testclassa963, TestClassA964 testclassa964, TestClassA965 testclassa965) + { + } + } + [Export] + public class TestClassA242 + { + [ImportingConstructor] + public TestClassA242(TestClassA966 testclassa966, TestClassA967 testclassa967, TestClassA968 testclassa968, TestClassA969 testclassa969) + { + } + } + [Export] + public class TestClassA243 + { + [ImportingConstructor] + public TestClassA243(TestClassA970 testclassa970, TestClassA971 testclassa971, TestClassA972 testclassa972, TestClassA973 testclassa973) + { + } + } + [Export] + public class TestClassA244 + { + [ImportingConstructor] + public TestClassA244(TestClassA974 testclassa974, TestClassA975 testclassa975, TestClassA976 testclassa976, TestClassA977 testclassa977) + { + } + } + [Export] + public class TestClassA245 + { + [ImportingConstructor] + public TestClassA245(TestClassA978 testclassa978, TestClassA979 testclassa979, TestClassA980 testclassa980, TestClassA981 testclassa981) + { + } + } + [Export] + public class TestClassA246 + { + [ImportingConstructor] + public TestClassA246(TestClassA982 testclassa982, TestClassA983 testclassa983, TestClassA984 testclassa984, TestClassA985 testclassa985) + { + } + } + [Export] + public class TestClassA247 + { + [ImportingConstructor] + public TestClassA247(TestClassA986 testclassa986, TestClassA987 testclassa987, TestClassA988 testclassa988, TestClassA989 testclassa989) + { + } + } + [Export] + public class TestClassA248 + { + [ImportingConstructor] + public TestClassA248(TestClassA990 testclassa990, TestClassA991 testclassa991, TestClassA992 testclassa992, TestClassA993 testclassa993) + { + } + } + [Export] + public class TestClassA249 + { + [ImportingConstructor] + public TestClassA249(TestClassA994 testclassa994, TestClassA995 testclassa995, TestClassA996 testclassa996, TestClassA997 testclassa997) + { + } + } + [Export] + public class TestClassA250 + { + [ImportingConstructor] + public TestClassA250(TestClassA998 testclassa998, TestClassA999 testclassa999, TestClassA1000 testclassa1000, TestClassA1001 testclassa1001) + { + } + } + [Export] + public class TestClassA251 + { + [ImportingConstructor] + public TestClassA251(TestClassA1002 testclassa1002, TestClassA1003 testclassa1003, TestClassA1004 testclassa1004, TestClassA1005 testclassa1005) + { + } + } + [Export] + public class TestClassA252 + { + [ImportingConstructor] + public TestClassA252(TestClassA1006 testclassa1006, TestClassA1007 testclassa1007, TestClassA1008 testclassa1008, TestClassA1009 testclassa1009) + { + } + } + [Export] + public class TestClassA253 + { + [ImportingConstructor] + public TestClassA253(TestClassA1010 testclassa1010, TestClassA1011 testclassa1011, TestClassA1012 testclassa1012, TestClassA1013 testclassa1013) + { + } + } + [Export] + public class TestClassA254 + { + [ImportingConstructor] + public TestClassA254(TestClassA1014 testclassa1014, TestClassA1015 testclassa1015, TestClassA1016 testclassa1016, TestClassA1017 testclassa1017) + { + } + } + [Export] + public class TestClassA255 + { + [ImportingConstructor] + public TestClassA255(TestClassA1018 testclassa1018, TestClassA1019 testclassa1019, TestClassA1020 testclassa1020, TestClassA1021 testclassa1021) + { + } + } + [Export] + public class TestClassA256 + { + [ImportingConstructor] + public TestClassA256(TestClassA1022 testclassa1022, TestClassA1023 testclassa1023, TestClassA1024 testclassa1024, TestClassA1025 testclassa1025) + { + } + } + [Export] + public class TestClassA257 + { + [ImportingConstructor] + public TestClassA257(TestClassA1026 testclassa1026, TestClassA1027 testclassa1027, TestClassA1028 testclassa1028, TestClassA1029 testclassa1029) + { + } + } + [Export] + public class TestClassA258 + { + [ImportingConstructor] + public TestClassA258(TestClassA1030 testclassa1030, TestClassA1031 testclassa1031, TestClassA1032 testclassa1032, TestClassA1033 testclassa1033) + { + } + } + [Export] + public class TestClassA259 + { + [ImportingConstructor] + public TestClassA259(TestClassA1034 testclassa1034, TestClassA1035 testclassa1035, TestClassA1036 testclassa1036, TestClassA1037 testclassa1037) + { + } + } + [Export] + public class TestClassA260 + { + [ImportingConstructor] + public TestClassA260(TestClassA1038 testclassa1038, TestClassA1039 testclassa1039, TestClassA1040 testclassa1040, TestClassA1041 testclassa1041) + { + } + } + [Export] + public class TestClassA261 + { + [ImportingConstructor] + public TestClassA261(TestClassA1042 testclassa1042, TestClassA1043 testclassa1043, TestClassA1044 testclassa1044, TestClassA1045 testclassa1045) + { + } + } + [Export] + public class TestClassA262 + { + [ImportingConstructor] + public TestClassA262(TestClassA1046 testclassa1046, TestClassA1047 testclassa1047, TestClassA1048 testclassa1048, TestClassA1049 testclassa1049) + { + } + } + [Export] + public class TestClassA263 + { + [ImportingConstructor] + public TestClassA263(TestClassA1050 testclassa1050, TestClassA1051 testclassa1051, TestClassA1052 testclassa1052, TestClassA1053 testclassa1053) + { + } + } + [Export] + public class TestClassA264 + { + [ImportingConstructor] + public TestClassA264(TestClassA1054 testclassa1054, TestClassA1055 testclassa1055, TestClassA1056 testclassa1056, TestClassA1057 testclassa1057) + { + } + } + [Export] + public class TestClassA265 + { + [ImportingConstructor] + public TestClassA265(TestClassA1058 testclassa1058, TestClassA1059 testclassa1059, TestClassA1060 testclassa1060, TestClassA1061 testclassa1061) + { + } + } + [Export] + public class TestClassA266 + { + [ImportingConstructor] + public TestClassA266(TestClassA1062 testclassa1062, TestClassA1063 testclassa1063, TestClassA1064 testclassa1064, TestClassA1065 testclassa1065) + { + } + } + [Export] + public class TestClassA267 + { + [ImportingConstructor] + public TestClassA267(TestClassA1066 testclassa1066, TestClassA1067 testclassa1067, TestClassA1068 testclassa1068, TestClassA1069 testclassa1069) + { + } + } + [Export] + public class TestClassA268 + { + [ImportingConstructor] + public TestClassA268(TestClassA1070 testclassa1070, TestClassA1071 testclassa1071, TestClassA1072 testclassa1072, TestClassA1073 testclassa1073) + { + } + } + [Export] + public class TestClassA269 + { + [ImportingConstructor] + public TestClassA269(TestClassA1074 testclassa1074, TestClassA1075 testclassa1075, TestClassA1076 testclassa1076, TestClassA1077 testclassa1077) + { + } + } + [Export] + public class TestClassA270 + { + [ImportingConstructor] + public TestClassA270(TestClassA1078 testclassa1078, TestClassA1079 testclassa1079, TestClassA1080 testclassa1080, TestClassA1081 testclassa1081) + { + } + } + [Export] + public class TestClassA271 + { + [ImportingConstructor] + public TestClassA271(TestClassA1082 testclassa1082, TestClassA1083 testclassa1083, TestClassA1084 testclassa1084, TestClassA1085 testclassa1085) + { + } + } + [Export] + public class TestClassA272 + { + [ImportingConstructor] + public TestClassA272(TestClassA1086 testclassa1086, TestClassA1087 testclassa1087, TestClassA1088 testclassa1088, TestClassA1089 testclassa1089) + { + } + } + [Export] + public class TestClassA273 + { + [ImportingConstructor] + public TestClassA273(TestClassA1090 testclassa1090, TestClassA1091 testclassa1091, TestClassA1092 testclassa1092, TestClassA1093 testclassa1093) + { + } + } + [Export] + public class TestClassA274 + { + [ImportingConstructor] + public TestClassA274(TestClassA1094 testclassa1094, TestClassA1095 testclassa1095, TestClassA1096 testclassa1096, TestClassA1097 testclassa1097) + { + } + } + [Export] + public class TestClassA275 + { + [ImportingConstructor] + public TestClassA275(TestClassA1098 testclassa1098, TestClassA1099 testclassa1099, TestClassA1100 testclassa1100, TestClassA1101 testclassa1101) + { + } + } + [Export] + public class TestClassA276 + { + [ImportingConstructor] + public TestClassA276(TestClassA1102 testclassa1102, TestClassA1103 testclassa1103, TestClassA1104 testclassa1104, TestClassA1105 testclassa1105) + { + } + } + [Export] + public class TestClassA277 + { + [ImportingConstructor] + public TestClassA277(TestClassA1106 testclassa1106, TestClassA1107 testclassa1107, TestClassA1108 testclassa1108, TestClassA1109 testclassa1109) + { + } + } + [Export] + public class TestClassA278 + { + [ImportingConstructor] + public TestClassA278(TestClassA1110 testclassa1110, TestClassA1111 testclassa1111, TestClassA1112 testclassa1112, TestClassA1113 testclassa1113) + { + } + } + [Export] + public class TestClassA279 + { + [ImportingConstructor] + public TestClassA279(TestClassA1114 testclassa1114, TestClassA1115 testclassa1115, TestClassA1116 testclassa1116, TestClassA1117 testclassa1117) + { + } + } + [Export] + public class TestClassA280 + { + [ImportingConstructor] + public TestClassA280(TestClassA1118 testclassa1118, TestClassA1119 testclassa1119, TestClassA1120 testclassa1120, TestClassA1121 testclassa1121) + { + } + } + [Export] + public class TestClassA281 + { + [ImportingConstructor] + public TestClassA281(TestClassA1122 testclassa1122, TestClassA1123 testclassa1123, TestClassA1124 testclassa1124, TestClassA1125 testclassa1125) + { + } + } + [Export] + public class TestClassA282 + { + [ImportingConstructor] + public TestClassA282(TestClassA1126 testclassa1126, TestClassA1127 testclassa1127, TestClassA1128 testclassa1128, TestClassA1129 testclassa1129) + { + } + } + [Export] + public class TestClassA283 + { + [ImportingConstructor] + public TestClassA283(TestClassA1130 testclassa1130, TestClassA1131 testclassa1131, TestClassA1132 testclassa1132, TestClassA1133 testclassa1133) + { + } + } + [Export] + public class TestClassA284 + { + [ImportingConstructor] + public TestClassA284(TestClassA1134 testclassa1134, TestClassA1135 testclassa1135, TestClassA1136 testclassa1136, TestClassA1137 testclassa1137) + { + } + } + [Export] + public class TestClassA285 + { + [ImportingConstructor] + public TestClassA285(TestClassA1138 testclassa1138, TestClassA1139 testclassa1139, TestClassA1140 testclassa1140, TestClassA1141 testclassa1141) + { + } + } + [Export] + public class TestClassA286 + { + [ImportingConstructor] + public TestClassA286(TestClassA1142 testclassa1142, TestClassA1143 testclassa1143, TestClassA1144 testclassa1144, TestClassA1145 testclassa1145) + { + } + } + [Export] + public class TestClassA287 + { + [ImportingConstructor] + public TestClassA287(TestClassA1146 testclassa1146, TestClassA1147 testclassa1147, TestClassA1148 testclassa1148, TestClassA1149 testclassa1149) + { + } + } + [Export] + public class TestClassA288 + { + [ImportingConstructor] + public TestClassA288(TestClassA1150 testclassa1150, TestClassA1151 testclassa1151, TestClassA1152 testclassa1152, TestClassA1153 testclassa1153) + { + } + } + [Export] + public class TestClassA289 + { + [ImportingConstructor] + public TestClassA289(TestClassA1154 testclassa1154, TestClassA1155 testclassa1155, TestClassA1156 testclassa1156, TestClassA1157 testclassa1157) + { + } + } + [Export] + public class TestClassA290 + { + [ImportingConstructor] + public TestClassA290(TestClassA1158 testclassa1158, TestClassA1159 testclassa1159, TestClassA1160 testclassa1160, TestClassA1161 testclassa1161) + { + } + } + [Export] + public class TestClassA291 + { + [ImportingConstructor] + public TestClassA291(TestClassA1162 testclassa1162, TestClassA1163 testclassa1163, TestClassA1164 testclassa1164, TestClassA1165 testclassa1165) + { + } + } + [Export] + public class TestClassA292 + { + [ImportingConstructor] + public TestClassA292(TestClassA1166 testclassa1166, TestClassA1167 testclassa1167, TestClassA1168 testclassa1168, TestClassA1169 testclassa1169) + { + } + } + [Export] + public class TestClassA293 + { + [ImportingConstructor] + public TestClassA293(TestClassA1170 testclassa1170, TestClassA1171 testclassa1171, TestClassA1172 testclassa1172, TestClassA1173 testclassa1173) + { + } + } + [Export] + public class TestClassA294 + { + [ImportingConstructor] + public TestClassA294(TestClassA1174 testclassa1174, TestClassA1175 testclassa1175, TestClassA1176 testclassa1176, TestClassA1177 testclassa1177) + { + } + } + [Export] + public class TestClassA295 + { + [ImportingConstructor] + public TestClassA295(TestClassA1178 testclassa1178, TestClassA1179 testclassa1179, TestClassA1180 testclassa1180, TestClassA1181 testclassa1181) + { + } + } + [Export] + public class TestClassA296 + { + [ImportingConstructor] + public TestClassA296(TestClassA1182 testclassa1182, TestClassA1183 testclassa1183, TestClassA1184 testclassa1184, TestClassA1185 testclassa1185) + { + } + } + [Export] + public class TestClassA297 + { + [ImportingConstructor] + public TestClassA297(TestClassA1186 testclassa1186, TestClassA1187 testclassa1187, TestClassA1188 testclassa1188, TestClassA1189 testclassa1189) + { + } + } + [Export] + public class TestClassA298 + { + [ImportingConstructor] + public TestClassA298(TestClassA1190 testclassa1190, TestClassA1191 testclassa1191, TestClassA1192 testclassa1192, TestClassA1193 testclassa1193) + { + } + } + [Export] + public class TestClassA299 + { + [ImportingConstructor] + public TestClassA299(TestClassA1194 testclassa1194, TestClassA1195 testclassa1195, TestClassA1196 testclassa1196, TestClassA1197 testclassa1197) + { + } + } + [Export] + public class TestClassA300 + { + [ImportingConstructor] + public TestClassA300(TestClassA1198 testclassa1198, TestClassA1199 testclassa1199, TestClassA1200 testclassa1200, TestClassA1201 testclassa1201) + { + } + } + [Export] + public class TestClassA301 + { + [ImportingConstructor] + public TestClassA301(TestClassA1202 testclassa1202, TestClassA1203 testclassa1203, TestClassA1204 testclassa1204, TestClassA1205 testclassa1205) + { + } + } + [Export] + public class TestClassA302 + { + [ImportingConstructor] + public TestClassA302(TestClassA1206 testclassa1206, TestClassA1207 testclassa1207, TestClassA1208 testclassa1208, TestClassA1209 testclassa1209) + { + } + } + [Export] + public class TestClassA303 + { + [ImportingConstructor] + public TestClassA303(TestClassA1210 testclassa1210, TestClassA1211 testclassa1211, TestClassA1212 testclassa1212, TestClassA1213 testclassa1213) + { + } + } + [Export] + public class TestClassA304 + { + [ImportingConstructor] + public TestClassA304(TestClassA1214 testclassa1214, TestClassA1215 testclassa1215, TestClassA1216 testclassa1216, TestClassA1217 testclassa1217) + { + } + } + [Export] + public class TestClassA305 + { + [ImportingConstructor] + public TestClassA305(TestClassA1218 testclassa1218, TestClassA1219 testclassa1219, TestClassA1220 testclassa1220, TestClassA1221 testclassa1221) + { + } + } + [Export] + public class TestClassA306 + { + [ImportingConstructor] + public TestClassA306(TestClassA1222 testclassa1222, TestClassA1223 testclassa1223, TestClassA1224 testclassa1224, TestClassA1225 testclassa1225) + { + } + } + [Export] + public class TestClassA307 + { + [ImportingConstructor] + public TestClassA307(TestClassA1226 testclassa1226, TestClassA1227 testclassa1227, TestClassA1228 testclassa1228, TestClassA1229 testclassa1229) + { + } + } + [Export] + public class TestClassA308 + { + [ImportingConstructor] + public TestClassA308(TestClassA1230 testclassa1230, TestClassA1231 testclassa1231, TestClassA1232 testclassa1232, TestClassA1233 testclassa1233) + { + } + } + [Export] + public class TestClassA309 + { + [ImportingConstructor] + public TestClassA309(TestClassA1234 testclassa1234, TestClassA1235 testclassa1235, TestClassA1236 testclassa1236, TestClassA1237 testclassa1237) + { + } + } + [Export] + public class TestClassA310 + { + [ImportingConstructor] + public TestClassA310(TestClassA1238 testclassa1238, TestClassA1239 testclassa1239, TestClassA1240 testclassa1240, TestClassA1241 testclassa1241) + { + } + } + [Export] + public class TestClassA311 + { + [ImportingConstructor] + public TestClassA311(TestClassA1242 testclassa1242, TestClassA1243 testclassa1243, TestClassA1244 testclassa1244, TestClassA1245 testclassa1245) + { + } + } + [Export] + public class TestClassA312 + { + [ImportingConstructor] + public TestClassA312(TestClassA1246 testclassa1246, TestClassA1247 testclassa1247, TestClassA1248 testclassa1248, TestClassA1249 testclassa1249) + { + } + } + [Export] + public class TestClassA313 + { + [ImportingConstructor] + public TestClassA313(TestClassA1250 testclassa1250, TestClassA1251 testclassa1251, TestClassA1252 testclassa1252, TestClassA1253 testclassa1253) + { + } + } + [Export] + public class TestClassA314 + { + [ImportingConstructor] + public TestClassA314(TestClassA1254 testclassa1254, TestClassA1255 testclassa1255, TestClassA1256 testclassa1256, TestClassA1257 testclassa1257) + { + } + } + [Export] + public class TestClassA315 + { + [ImportingConstructor] + public TestClassA315(TestClassA1258 testclassa1258, TestClassA1259 testclassa1259, TestClassA1260 testclassa1260, TestClassA1261 testclassa1261) + { + } + } + [Export] + public class TestClassA316 + { + [ImportingConstructor] + public TestClassA316(TestClassA1262 testclassa1262, TestClassA1263 testclassa1263, TestClassA1264 testclassa1264, TestClassA1265 testclassa1265) + { + } + } + [Export] + public class TestClassA317 + { + [ImportingConstructor] + public TestClassA317(TestClassA1266 testclassa1266, TestClassA1267 testclassa1267, TestClassA1268 testclassa1268, TestClassA1269 testclassa1269) + { + } + } + [Export] + public class TestClassA318 + { + [ImportingConstructor] + public TestClassA318(TestClassA1270 testclassa1270, TestClassA1271 testclassa1271, TestClassA1272 testclassa1272, TestClassA1273 testclassa1273) + { + } + } + [Export] + public class TestClassA319 + { + [ImportingConstructor] + public TestClassA319(TestClassA1274 testclassa1274, TestClassA1275 testclassa1275, TestClassA1276 testclassa1276, TestClassA1277 testclassa1277) + { + } + } + [Export] + public class TestClassA320 + { + [ImportingConstructor] + public TestClassA320(TestClassA1278 testclassa1278, TestClassA1279 testclassa1279, TestClassA1280 testclassa1280, TestClassA1281 testclassa1281) + { + } + } + [Export] + public class TestClassA321 + { + [ImportingConstructor] + public TestClassA321(TestClassA1282 testclassa1282, TestClassA1283 testclassa1283, TestClassA1284 testclassa1284, TestClassA1285 testclassa1285) + { + } + } + [Export] + public class TestClassA322 + { + [ImportingConstructor] + public TestClassA322(TestClassA1286 testclassa1286, TestClassA1287 testclassa1287, TestClassA1288 testclassa1288, TestClassA1289 testclassa1289) + { + } + } + [Export] + public class TestClassA323 + { + [ImportingConstructor] + public TestClassA323(TestClassA1290 testclassa1290, TestClassA1291 testclassa1291, TestClassA1292 testclassa1292, TestClassA1293 testclassa1293) + { + } + } + [Export] + public class TestClassA324 + { + [ImportingConstructor] + public TestClassA324(TestClassA1294 testclassa1294, TestClassA1295 testclassa1295, TestClassA1296 testclassa1296, TestClassA1297 testclassa1297) + { + } + } + [Export] + public class TestClassA325 + { + [ImportingConstructor] + public TestClassA325(TestClassA1298 testclassa1298, TestClassA1299 testclassa1299, TestClassA1300 testclassa1300, TestClassA1301 testclassa1301) + { + } + } + [Export] + public class TestClassA326 + { + [ImportingConstructor] + public TestClassA326(TestClassA1302 testclassa1302, TestClassA1303 testclassa1303, TestClassA1304 testclassa1304, TestClassA1305 testclassa1305) + { + } + } + [Export] + public class TestClassA327 + { + [ImportingConstructor] + public TestClassA327(TestClassA1306 testclassa1306, TestClassA1307 testclassa1307, TestClassA1308 testclassa1308, TestClassA1309 testclassa1309) + { + } + } + [Export] + public class TestClassA328 + { + [ImportingConstructor] + public TestClassA328(TestClassA1310 testclassa1310, TestClassA1311 testclassa1311, TestClassA1312 testclassa1312, TestClassA1313 testclassa1313) + { + } + } + [Export] + public class TestClassA329 + { + [ImportingConstructor] + public TestClassA329(TestClassA1314 testclassa1314, TestClassA1315 testclassa1315, TestClassA1316 testclassa1316, TestClassA1317 testclassa1317) + { + } + } + [Export] + public class TestClassA330 + { + [ImportingConstructor] + public TestClassA330(TestClassA1318 testclassa1318, TestClassA1319 testclassa1319, TestClassA1320 testclassa1320, TestClassA1321 testclassa1321) + { + } + } + [Export] + public class TestClassA331 + { + [ImportingConstructor] + public TestClassA331(TestClassA1322 testclassa1322, TestClassA1323 testclassa1323, TestClassA1324 testclassa1324, TestClassA1325 testclassa1325) + { + } + } + [Export] + public class TestClassA332 + { + [ImportingConstructor] + public TestClassA332(TestClassA1326 testclassa1326, TestClassA1327 testclassa1327, TestClassA1328 testclassa1328, TestClassA1329 testclassa1329) + { + } + } + [Export] + public class TestClassA333 + { + [ImportingConstructor] + public TestClassA333(TestClassA1330 testclassa1330, TestClassA1331 testclassa1331, TestClassA1332 testclassa1332, TestClassA1333 testclassa1333) + { + } + } + [Export] + public class TestClassA334 + { + [ImportingConstructor] + public TestClassA334(TestClassA1334 testclassa1334, TestClassA1335 testclassa1335, TestClassA1336 testclassa1336, TestClassA1337 testclassa1337) + { + } + } + [Export] + public class TestClassA335 + { + [ImportingConstructor] + public TestClassA335(TestClassA1338 testclassa1338, TestClassA1339 testclassa1339, TestClassA1340 testclassa1340, TestClassA1341 testclassa1341) + { + } + } + [Export] + public class TestClassA336 + { + [ImportingConstructor] + public TestClassA336(TestClassA1342 testclassa1342, TestClassA1343 testclassa1343, TestClassA1344 testclassa1344, TestClassA1345 testclassa1345) + { + } + } + [Export] + public class TestClassA337 + { + [ImportingConstructor] + public TestClassA337(TestClassA1346 testclassa1346, TestClassA1347 testclassa1347, TestClassA1348 testclassa1348, TestClassA1349 testclassa1349) + { + } + } + [Export] + public class TestClassA338 + { + [ImportingConstructor] + public TestClassA338(TestClassA1350 testclassa1350, TestClassA1351 testclassa1351, TestClassA1352 testclassa1352, TestClassA1353 testclassa1353) + { + } + } + [Export] + public class TestClassA339 + { + [ImportingConstructor] + public TestClassA339(TestClassA1354 testclassa1354, TestClassA1355 testclassa1355, TestClassA1356 testclassa1356, TestClassA1357 testclassa1357) + { + } + } + [Export] + public class TestClassA340 + { + [ImportingConstructor] + public TestClassA340(TestClassA1358 testclassa1358, TestClassA1359 testclassa1359, TestClassA1360 testclassa1360, TestClassA1361 testclassa1361) + { + } + } + [Export] + public class TestClassA341 + { + public TestClassA341() + { + } + } + [Export] + public class TestClassA342 + { + public TestClassA342() + { + } + } + [Export] + public class TestClassA343 + { + public TestClassA343() + { + } + } + [Export] + public class TestClassA344 + { + public TestClassA344() + { + } + } + [Export] + public class TestClassA345 + { + public TestClassA345() + { + } + } + [Export] + public class TestClassA346 + { + public TestClassA346() + { + } + } + [Export] + public class TestClassA347 + { + public TestClassA347() + { + } + } + [Export] + public class TestClassA348 + { + public TestClassA348() + { + } + } + [Export] + public class TestClassA349 + { + public TestClassA349() + { + } + } + [Export] + public class TestClassA350 + { + public TestClassA350() + { + } + } + [Export] + public class TestClassA351 + { + public TestClassA351() + { + } + } + [Export] + public class TestClassA352 + { + public TestClassA352() + { + } + } + [Export] + public class TestClassA353 + { + public TestClassA353() + { + } + } + [Export] + public class TestClassA354 + { + public TestClassA354() + { + } + } + [Export] + public class TestClassA355 + { + public TestClassA355() + { + } + } + [Export] + public class TestClassA356 + { + public TestClassA356() + { + } + } + [Export] + public class TestClassA357 + { + public TestClassA357() + { + } + } + [Export] + public class TestClassA358 + { + public TestClassA358() + { + } + } + [Export] + public class TestClassA359 + { + public TestClassA359() + { + } + } + [Export] + public class TestClassA360 + { + public TestClassA360() + { + } + } + [Export] + public class TestClassA361 + { + public TestClassA361() + { + } + } + [Export] + public class TestClassA362 + { + public TestClassA362() + { + } + } + [Export] + public class TestClassA363 + { + public TestClassA363() + { + } + } + [Export] + public class TestClassA364 + { + public TestClassA364() + { + } + } + [Export] + public class TestClassA365 + { + public TestClassA365() + { + } + } + [Export] + public class TestClassA366 + { + public TestClassA366() + { + } + } + [Export] + public class TestClassA367 + { + public TestClassA367() + { + } + } + [Export] + public class TestClassA368 + { + public TestClassA368() + { + } + } + [Export] + public class TestClassA369 + { + public TestClassA369() + { + } + } + [Export] + public class TestClassA370 + { + public TestClassA370() + { + } + } + [Export] + public class TestClassA371 + { + public TestClassA371() + { + } + } + [Export] + public class TestClassA372 + { + public TestClassA372() + { + } + } + [Export] + public class TestClassA373 + { + public TestClassA373() + { + } + } + [Export] + public class TestClassA374 + { + public TestClassA374() + { + } + } + [Export] + public class TestClassA375 + { + public TestClassA375() + { + } + } + [Export] + public class TestClassA376 + { + public TestClassA376() + { + } + } + [Export] + public class TestClassA377 + { + public TestClassA377() + { + } + } + [Export] + public class TestClassA378 + { + public TestClassA378() + { + } + } + [Export] + public class TestClassA379 + { + public TestClassA379() + { + } + } + [Export] + public class TestClassA380 + { + public TestClassA380() + { + } + } + [Export] + public class TestClassA381 + { + public TestClassA381() + { + } + } + [Export] + public class TestClassA382 + { + public TestClassA382() + { + } + } + [Export] + public class TestClassA383 + { + public TestClassA383() + { + } + } + [Export] + public class TestClassA384 + { + public TestClassA384() + { + } + } + [Export] + public class TestClassA385 + { + public TestClassA385() + { + } + } + [Export] + public class TestClassA386 + { + public TestClassA386() + { + } + } + [Export] + public class TestClassA387 + { + public TestClassA387() + { + } + } + [Export] + public class TestClassA388 + { + public TestClassA388() + { + } + } + [Export] + public class TestClassA389 + { + public TestClassA389() + { + } + } + [Export] + public class TestClassA390 + { + public TestClassA390() + { + } + } + [Export] + public class TestClassA391 + { + public TestClassA391() + { + } + } + [Export] + public class TestClassA392 + { + public TestClassA392() + { + } + } + [Export] + public class TestClassA393 + { + public TestClassA393() + { + } + } + [Export] + public class TestClassA394 + { + public TestClassA394() + { + } + } + [Export] + public class TestClassA395 + { + public TestClassA395() + { + } + } + [Export] + public class TestClassA396 + { + public TestClassA396() + { + } + } + [Export] + public class TestClassA397 + { + public TestClassA397() + { + } + } + [Export] + public class TestClassA398 + { + public TestClassA398() + { + } + } + [Export] + public class TestClassA399 + { + public TestClassA399() + { + } + } + [Export] + public class TestClassA400 + { + public TestClassA400() + { + } + } + [Export] + public class TestClassA401 + { + public TestClassA401() + { + } + } + [Export] + public class TestClassA402 + { + public TestClassA402() + { + } + } + [Export] + public class TestClassA403 + { + public TestClassA403() + { + } + } + [Export] + public class TestClassA404 + { + public TestClassA404() + { + } + } + [Export] + public class TestClassA405 + { + public TestClassA405() + { + } + } + [Export] + public class TestClassA406 + { + public TestClassA406() + { + } + } + [Export] + public class TestClassA407 + { + public TestClassA407() + { + } + } + [Export] + public class TestClassA408 + { + public TestClassA408() + { + } + } + [Export] + public class TestClassA409 + { + public TestClassA409() + { + } + } + [Export] + public class TestClassA410 + { + public TestClassA410() + { + } + } + [Export] + public class TestClassA411 + { + public TestClassA411() + { + } + } + [Export] + public class TestClassA412 + { + public TestClassA412() + { + } + } + [Export] + public class TestClassA413 + { + public TestClassA413() + { + } + } + [Export] + public class TestClassA414 + { + public TestClassA414() + { + } + } + [Export] + public class TestClassA415 + { + public TestClassA415() + { + } + } + [Export] + public class TestClassA416 + { + public TestClassA416() + { + } + } + [Export] + public class TestClassA417 + { + public TestClassA417() + { + } + } + [Export] + public class TestClassA418 + { + public TestClassA418() + { + } + } + [Export] + public class TestClassA419 + { + public TestClassA419() + { + } + } + [Export] + public class TestClassA420 + { + public TestClassA420() + { + } + } + [Export] + public class TestClassA421 + { + public TestClassA421() + { + } + } + [Export] + public class TestClassA422 + { + public TestClassA422() + { + } + } + [Export] + public class TestClassA423 + { + public TestClassA423() + { + } + } + [Export] + public class TestClassA424 + { + public TestClassA424() + { + } + } + [Export] + public class TestClassA425 + { + public TestClassA425() + { + } + } + [Export] + public class TestClassA426 + { + public TestClassA426() + { + } + } + [Export] + public class TestClassA427 + { + public TestClassA427() + { + } + } + [Export] + public class TestClassA428 + { + public TestClassA428() + { + } + } + [Export] + public class TestClassA429 + { + public TestClassA429() + { + } + } + [Export] + public class TestClassA430 + { + public TestClassA430() + { + } + } + [Export] + public class TestClassA431 + { + public TestClassA431() + { + } + } + [Export] + public class TestClassA432 + { + public TestClassA432() + { + } + } + [Export] + public class TestClassA433 + { + public TestClassA433() + { + } + } + [Export] + public class TestClassA434 + { + public TestClassA434() + { + } + } + [Export] + public class TestClassA435 + { + public TestClassA435() + { + } + } + [Export] + public class TestClassA436 + { + public TestClassA436() + { + } + } + [Export] + public class TestClassA437 + { + public TestClassA437() + { + } + } + [Export] + public class TestClassA438 + { + public TestClassA438() + { + } + } + [Export] + public class TestClassA439 + { + public TestClassA439() + { + } + } + [Export] + public class TestClassA440 + { + public TestClassA440() + { + } + } + [Export] + public class TestClassA441 + { + public TestClassA441() + { + } + } + [Export] + public class TestClassA442 + { + public TestClassA442() + { + } + } + [Export] + public class TestClassA443 + { + public TestClassA443() + { + } + } + [Export] + public class TestClassA444 + { + public TestClassA444() + { + } + } + [Export] + public class TestClassA445 + { + public TestClassA445() + { + } + } + [Export] + public class TestClassA446 + { + public TestClassA446() + { + } + } + [Export] + public class TestClassA447 + { + public TestClassA447() + { + } + } + [Export] + public class TestClassA448 + { + public TestClassA448() + { + } + } + [Export] + public class TestClassA449 + { + public TestClassA449() + { + } + } + [Export] + public class TestClassA450 + { + public TestClassA450() + { + } + } + [Export] + public class TestClassA451 + { + public TestClassA451() + { + } + } + [Export] + public class TestClassA452 + { + public TestClassA452() + { + } + } + [Export] + public class TestClassA453 + { + public TestClassA453() + { + } + } + [Export] + public class TestClassA454 + { + public TestClassA454() + { + } + } + [Export] + public class TestClassA455 + { + public TestClassA455() + { + } + } + [Export] + public class TestClassA456 + { + public TestClassA456() + { + } + } + [Export] + public class TestClassA457 + { + public TestClassA457() + { + } + } + [Export] + public class TestClassA458 + { + public TestClassA458() + { + } + } + [Export] + public class TestClassA459 + { + public TestClassA459() + { + } + } + [Export] + public class TestClassA460 + { + public TestClassA460() + { + } + } + [Export] + public class TestClassA461 + { + public TestClassA461() + { + } + } + [Export] + public class TestClassA462 + { + public TestClassA462() + { + } + } + [Export] + public class TestClassA463 + { + public TestClassA463() + { + } + } + [Export] + public class TestClassA464 + { + public TestClassA464() + { + } + } + [Export] + public class TestClassA465 + { + public TestClassA465() + { + } + } + [Export] + public class TestClassA466 + { + public TestClassA466() + { + } + } + [Export] + public class TestClassA467 + { + public TestClassA467() + { + } + } + [Export] + public class TestClassA468 + { + public TestClassA468() + { + } + } + [Export] + public class TestClassA469 + { + public TestClassA469() + { + } + } + [Export] + public class TestClassA470 + { + public TestClassA470() + { + } + } + [Export] + public class TestClassA471 + { + public TestClassA471() + { + } + } + [Export] + public class TestClassA472 + { + public TestClassA472() + { + } + } + [Export] + public class TestClassA473 + { + public TestClassA473() + { + } + } + [Export] + public class TestClassA474 + { + public TestClassA474() + { + } + } + [Export] + public class TestClassA475 + { + public TestClassA475() + { + } + } + [Export] + public class TestClassA476 + { + public TestClassA476() + { + } + } + [Export] + public class TestClassA477 + { + public TestClassA477() + { + } + } + [Export] + public class TestClassA478 + { + public TestClassA478() + { + } + } + [Export] + public class TestClassA479 + { + public TestClassA479() + { + } + } + [Export] + public class TestClassA480 + { + public TestClassA480() + { + } + } + [Export] + public class TestClassA481 + { + public TestClassA481() + { + } + } + [Export] + public class TestClassA482 + { + public TestClassA482() + { + } + } + [Export] + public class TestClassA483 + { + public TestClassA483() + { + } + } + [Export] + public class TestClassA484 + { + public TestClassA484() + { + } + } + [Export] + public class TestClassA485 + { + public TestClassA485() + { + } + } + [Export] + public class TestClassA486 + { + public TestClassA486() + { + } + } + [Export] + public class TestClassA487 + { + public TestClassA487() + { + } + } + [Export] + public class TestClassA488 + { + public TestClassA488() + { + } + } + [Export] + public class TestClassA489 + { + public TestClassA489() + { + } + } + [Export] + public class TestClassA490 + { + public TestClassA490() + { + } + } + [Export] + public class TestClassA491 + { + public TestClassA491() + { + } + } + [Export] + public class TestClassA492 + { + public TestClassA492() + { + } + } + [Export] + public class TestClassA493 + { + public TestClassA493() + { + } + } + [Export] + public class TestClassA494 + { + public TestClassA494() + { + } + } + [Export] + public class TestClassA495 + { + public TestClassA495() + { + } + } + [Export] + public class TestClassA496 + { + public TestClassA496() + { + } + } + [Export] + public class TestClassA497 + { + public TestClassA497() + { + } + } + [Export] + public class TestClassA498 + { + public TestClassA498() + { + } + } + [Export] + public class TestClassA499 + { + public TestClassA499() + { + } + } + [Export] + public class TestClassA500 + { + public TestClassA500() + { + } + } + [Export] + public class TestClassA501 + { + public TestClassA501() + { + } + } + [Export] + public class TestClassA502 + { + public TestClassA502() + { + } + } + [Export] + public class TestClassA503 + { + public TestClassA503() + { + } + } + [Export] + public class TestClassA504 + { + public TestClassA504() + { + } + } + [Export] + public class TestClassA505 + { + public TestClassA505() + { + } + } + [Export] + public class TestClassA506 + { + public TestClassA506() + { + } + } + [Export] + public class TestClassA507 + { + public TestClassA507() + { + } + } + [Export] + public class TestClassA508 + { + public TestClassA508() + { + } + } + [Export] + public class TestClassA509 + { + public TestClassA509() + { + } + } + [Export] + public class TestClassA510 + { + public TestClassA510() + { + } + } + [Export] + public class TestClassA511 + { + public TestClassA511() + { + } + } + [Export] + public class TestClassA512 + { + public TestClassA512() + { + } + } + [Export] + public class TestClassA513 + { + public TestClassA513() + { + } + } + [Export] + public class TestClassA514 + { + public TestClassA514() + { + } + } + [Export] + public class TestClassA515 + { + public TestClassA515() + { + } + } + [Export] + public class TestClassA516 + { + public TestClassA516() + { + } + } + [Export] + public class TestClassA517 + { + public TestClassA517() + { + } + } + [Export] + public class TestClassA518 + { + public TestClassA518() + { + } + } + [Export] + public class TestClassA519 + { + public TestClassA519() + { + } + } + [Export] + public class TestClassA520 + { + public TestClassA520() + { + } + } + [Export] + public class TestClassA521 + { + public TestClassA521() + { + } + } + [Export] + public class TestClassA522 + { + public TestClassA522() + { + } + } + [Export] + public class TestClassA523 + { + public TestClassA523() + { + } + } + [Export] + public class TestClassA524 + { + public TestClassA524() + { + } + } + [Export] + public class TestClassA525 + { + public TestClassA525() + { + } + } + [Export] + public class TestClassA526 + { + public TestClassA526() + { + } + } + [Export] + public class TestClassA527 + { + public TestClassA527() + { + } + } + [Export] + public class TestClassA528 + { + public TestClassA528() + { + } + } + [Export] + public class TestClassA529 + { + public TestClassA529() + { + } + } + [Export] + public class TestClassA530 + { + public TestClassA530() + { + } + } + [Export] + public class TestClassA531 + { + public TestClassA531() + { + } + } + [Export] + public class TestClassA532 + { + public TestClassA532() + { + } + } + [Export] + public class TestClassA533 + { + public TestClassA533() + { + } + } + [Export] + public class TestClassA534 + { + public TestClassA534() + { + } + } + [Export] + public class TestClassA535 + { + public TestClassA535() + { + } + } + [Export] + public class TestClassA536 + { + public TestClassA536() + { + } + } + [Export] + public class TestClassA537 + { + public TestClassA537() + { + } + } + [Export] + public class TestClassA538 + { + public TestClassA538() + { + } + } + [Export] + public class TestClassA539 + { + public TestClassA539() + { + } + } + [Export] + public class TestClassA540 + { + public TestClassA540() + { + } + } + [Export] + public class TestClassA541 + { + public TestClassA541() + { + } + } + [Export] + public class TestClassA542 + { + public TestClassA542() + { + } + } + [Export] + public class TestClassA543 + { + public TestClassA543() + { + } + } + [Export] + public class TestClassA544 + { + public TestClassA544() + { + } + } + [Export] + public class TestClassA545 + { + public TestClassA545() + { + } + } + [Export] + public class TestClassA546 + { + public TestClassA546() + { + } + } + [Export] + public class TestClassA547 + { + public TestClassA547() + { + } + } + [Export] + public class TestClassA548 + { + public TestClassA548() + { + } + } + [Export] + public class TestClassA549 + { + public TestClassA549() + { + } + } + [Export] + public class TestClassA550 + { + public TestClassA550() + { + } + } + [Export] + public class TestClassA551 + { + public TestClassA551() + { + } + } + [Export] + public class TestClassA552 + { + public TestClassA552() + { + } + } + [Export] + public class TestClassA553 + { + public TestClassA553() + { + } + } + [Export] + public class TestClassA554 + { + public TestClassA554() + { + } + } + [Export] + public class TestClassA555 + { + public TestClassA555() + { + } + } + [Export] + public class TestClassA556 + { + public TestClassA556() + { + } + } + [Export] + public class TestClassA557 + { + public TestClassA557() + { + } + } + [Export] + public class TestClassA558 + { + public TestClassA558() + { + } + } + [Export] + public class TestClassA559 + { + public TestClassA559() + { + } + } + [Export] + public class TestClassA560 + { + public TestClassA560() + { + } + } + [Export] + public class TestClassA561 + { + public TestClassA561() + { + } + } + [Export] + public class TestClassA562 + { + public TestClassA562() + { + } + } + [Export] + public class TestClassA563 + { + public TestClassA563() + { + } + } + [Export] + public class TestClassA564 + { + public TestClassA564() + { + } + } + [Export] + public class TestClassA565 + { + public TestClassA565() + { + } + } + [Export] + public class TestClassA566 + { + public TestClassA566() + { + } + } + [Export] + public class TestClassA567 + { + public TestClassA567() + { + } + } + [Export] + public class TestClassA568 + { + public TestClassA568() + { + } + } + [Export] + public class TestClassA569 + { + public TestClassA569() + { + } + } + [Export] + public class TestClassA570 + { + public TestClassA570() + { + } + } + [Export] + public class TestClassA571 + { + public TestClassA571() + { + } + } + [Export] + public class TestClassA572 + { + public TestClassA572() + { + } + } + [Export] + public class TestClassA573 + { + public TestClassA573() + { + } + } + [Export] + public class TestClassA574 + { + public TestClassA574() + { + } + } + [Export] + public class TestClassA575 + { + public TestClassA575() + { + } + } + [Export] + public class TestClassA576 + { + public TestClassA576() + { + } + } + [Export] + public class TestClassA577 + { + public TestClassA577() + { + } + } + [Export] + public class TestClassA578 + { + public TestClassA578() + { + } + } + [Export] + public class TestClassA579 + { + public TestClassA579() + { + } + } + [Export] + public class TestClassA580 + { + public TestClassA580() + { + } + } + [Export] + public class TestClassA581 + { + public TestClassA581() + { + } + } + [Export] + public class TestClassA582 + { + public TestClassA582() + { + } + } + [Export] + public class TestClassA583 + { + public TestClassA583() + { + } + } + [Export] + public class TestClassA584 + { + public TestClassA584() + { + } + } + [Export] + public class TestClassA585 + { + public TestClassA585() + { + } + } + [Export] + public class TestClassA586 + { + public TestClassA586() + { + } + } + [Export] + public class TestClassA587 + { + public TestClassA587() + { + } + } + [Export] + public class TestClassA588 + { + public TestClassA588() + { + } + } + [Export] + public class TestClassA589 + { + public TestClassA589() + { + } + } + [Export] + public class TestClassA590 + { + public TestClassA590() + { + } + } + [Export] + public class TestClassA591 + { + public TestClassA591() + { + } + } + [Export] + public class TestClassA592 + { + public TestClassA592() + { + } + } + [Export] + public class TestClassA593 + { + public TestClassA593() + { + } + } + [Export] + public class TestClassA594 + { + public TestClassA594() + { + } + } + [Export] + public class TestClassA595 + { + public TestClassA595() + { + } + } + [Export] + public class TestClassA596 + { + public TestClassA596() + { + } + } + [Export] + public class TestClassA597 + { + public TestClassA597() + { + } + } + [Export] + public class TestClassA598 + { + public TestClassA598() + { + } + } + [Export] + public class TestClassA599 + { + public TestClassA599() + { + } + } + [Export] + public class TestClassA600 + { + public TestClassA600() + { + } + } + [Export] + public class TestClassA601 + { + public TestClassA601() + { + } + } + [Export] + public class TestClassA602 + { + public TestClassA602() + { + } + } + [Export] + public class TestClassA603 + { + public TestClassA603() + { + } + } + [Export] + public class TestClassA604 + { + public TestClassA604() + { + } + } + [Export] + public class TestClassA605 + { + public TestClassA605() + { + } + } + [Export] + public class TestClassA606 + { + public TestClassA606() + { + } + } + [Export] + public class TestClassA607 + { + public TestClassA607() + { + } + } + [Export] + public class TestClassA608 + { + public TestClassA608() + { + } + } + [Export] + public class TestClassA609 + { + public TestClassA609() + { + } + } + [Export] + public class TestClassA610 + { + public TestClassA610() + { + } + } + [Export] + public class TestClassA611 + { + public TestClassA611() + { + } + } + [Export] + public class TestClassA612 + { + public TestClassA612() + { + } + } + [Export] + public class TestClassA613 + { + public TestClassA613() + { + } + } + [Export] + public class TestClassA614 + { + public TestClassA614() + { + } + } + [Export] + public class TestClassA615 + { + public TestClassA615() + { + } + } + [Export] + public class TestClassA616 + { + public TestClassA616() + { + } + } + [Export] + public class TestClassA617 + { + public TestClassA617() + { + } + } + [Export] + public class TestClassA618 + { + public TestClassA618() + { + } + } + [Export] + public class TestClassA619 + { + public TestClassA619() + { + } + } + [Export] + public class TestClassA620 + { + public TestClassA620() + { + } + } + [Export] + public class TestClassA621 + { + public TestClassA621() + { + } + } + [Export] + public class TestClassA622 + { + public TestClassA622() + { + } + } + [Export] + public class TestClassA623 + { + public TestClassA623() + { + } + } + [Export] + public class TestClassA624 + { + public TestClassA624() + { + } + } + [Export] + public class TestClassA625 + { + public TestClassA625() + { + } + } + [Export] + public class TestClassA626 + { + public TestClassA626() + { + } + } + [Export] + public class TestClassA627 + { + public TestClassA627() + { + } + } + [Export] + public class TestClassA628 + { + public TestClassA628() + { + } + } + [Export] + public class TestClassA629 + { + public TestClassA629() + { + } + } + [Export] + public class TestClassA630 + { + public TestClassA630() + { + } + } + [Export] + public class TestClassA631 + { + public TestClassA631() + { + } + } + [Export] + public class TestClassA632 + { + public TestClassA632() + { + } + } + [Export] + public class TestClassA633 + { + public TestClassA633() + { + } + } + [Export] + public class TestClassA634 + { + public TestClassA634() + { + } + } + [Export] + public class TestClassA635 + { + public TestClassA635() + { + } + } + [Export] + public class TestClassA636 + { + public TestClassA636() + { + } + } + [Export] + public class TestClassA637 + { + public TestClassA637() + { + } + } + [Export] + public class TestClassA638 + { + public TestClassA638() + { + } + } + [Export] + public class TestClassA639 + { + public TestClassA639() + { + } + } + [Export] + public class TestClassA640 + { + public TestClassA640() + { + } + } + [Export] + public class TestClassA641 + { + public TestClassA641() + { + } + } + [Export] + public class TestClassA642 + { + public TestClassA642() + { + } + } + [Export] + public class TestClassA643 + { + public TestClassA643() + { + } + } + [Export] + public class TestClassA644 + { + public TestClassA644() + { + } + } + [Export] + public class TestClassA645 + { + public TestClassA645() + { + } + } + [Export] + public class TestClassA646 + { + public TestClassA646() + { + } + } + [Export] + public class TestClassA647 + { + public TestClassA647() + { + } + } + [Export] + public class TestClassA648 + { + public TestClassA648() + { + } + } + [Export] + public class TestClassA649 + { + public TestClassA649() + { + } + } + [Export] + public class TestClassA650 + { + public TestClassA650() + { + } + } + [Export] + public class TestClassA651 + { + public TestClassA651() + { + } + } + [Export] + public class TestClassA652 + { + public TestClassA652() + { + } + } + [Export] + public class TestClassA653 + { + public TestClassA653() + { + } + } + [Export] + public class TestClassA654 + { + public TestClassA654() + { + } + } + [Export] + public class TestClassA655 + { + public TestClassA655() + { + } + } + [Export] + public class TestClassA656 + { + public TestClassA656() + { + } + } + [Export] + public class TestClassA657 + { + public TestClassA657() + { + } + } + [Export] + public class TestClassA658 + { + public TestClassA658() + { + } + } + [Export] + public class TestClassA659 + { + public TestClassA659() + { + } + } + [Export] + public class TestClassA660 + { + public TestClassA660() + { + } + } + [Export] + public class TestClassA661 + { + public TestClassA661() + { + } + } + [Export] + public class TestClassA662 + { + public TestClassA662() + { + } + } + [Export] + public class TestClassA663 + { + public TestClassA663() + { + } + } + [Export] + public class TestClassA664 + { + public TestClassA664() + { + } + } + [Export] + public class TestClassA665 + { + public TestClassA665() + { + } + } + [Export] + public class TestClassA666 + { + public TestClassA666() + { + } + } + [Export] + public class TestClassA667 + { + public TestClassA667() + { + } + } + [Export] + public class TestClassA668 + { + public TestClassA668() + { + } + } + [Export] + public class TestClassA669 + { + public TestClassA669() + { + } + } + [Export] + public class TestClassA670 + { + public TestClassA670() + { + } + } + [Export] + public class TestClassA671 + { + public TestClassA671() + { + } + } + [Export] + public class TestClassA672 + { + public TestClassA672() + { + } + } + [Export] + public class TestClassA673 + { + public TestClassA673() + { + } + } + [Export] + public class TestClassA674 + { + public TestClassA674() + { + } + } + [Export] + public class TestClassA675 + { + public TestClassA675() + { + } + } + [Export] + public class TestClassA676 + { + public TestClassA676() + { + } + } + [Export] + public class TestClassA677 + { + public TestClassA677() + { + } + } + [Export] + public class TestClassA678 + { + public TestClassA678() + { + } + } + [Export] + public class TestClassA679 + { + public TestClassA679() + { + } + } + [Export] + public class TestClassA680 + { + public TestClassA680() + { + } + } + [Export] + public class TestClassA681 + { + public TestClassA681() + { + } + } + [Export] + public class TestClassA682 + { + public TestClassA682() + { + } + } + [Export] + public class TestClassA683 + { + public TestClassA683() + { + } + } + [Export] + public class TestClassA684 + { + public TestClassA684() + { + } + } + [Export] + public class TestClassA685 + { + public TestClassA685() + { + } + } + [Export] + public class TestClassA686 + { + public TestClassA686() + { + } + } + [Export] + public class TestClassA687 + { + public TestClassA687() + { + } + } + [Export] + public class TestClassA688 + { + public TestClassA688() + { + } + } + [Export] + public class TestClassA689 + { + public TestClassA689() + { + } + } + [Export] + public class TestClassA690 + { + public TestClassA690() + { + } + } + [Export] + public class TestClassA691 + { + public TestClassA691() + { + } + } + [Export] + public class TestClassA692 + { + public TestClassA692() + { + } + } + [Export] + public class TestClassA693 + { + public TestClassA693() + { + } + } + [Export] + public class TestClassA694 + { + public TestClassA694() + { + } + } + [Export] + public class TestClassA695 + { + public TestClassA695() + { + } + } + [Export] + public class TestClassA696 + { + public TestClassA696() + { + } + } + [Export] + public class TestClassA697 + { + public TestClassA697() + { + } + } + [Export] + public class TestClassA698 + { + public TestClassA698() + { + } + } + [Export] + public class TestClassA699 + { + public TestClassA699() + { + } + } + [Export] + public class TestClassA700 + { + public TestClassA700() + { + } + } + [Export] + public class TestClassA701 + { + public TestClassA701() + { + } + } + [Export] + public class TestClassA702 + { + public TestClassA702() + { + } + } + [Export] + public class TestClassA703 + { + public TestClassA703() + { + } + } + [Export] + public class TestClassA704 + { + public TestClassA704() + { + } + } + [Export] + public class TestClassA705 + { + public TestClassA705() + { + } + } + [Export] + public class TestClassA706 + { + public TestClassA706() + { + } + } + [Export] + public class TestClassA707 + { + public TestClassA707() + { + } + } + [Export] + public class TestClassA708 + { + public TestClassA708() + { + } + } + [Export] + public class TestClassA709 + { + public TestClassA709() + { + } + } + [Export] + public class TestClassA710 + { + public TestClassA710() + { + } + } + [Export] + public class TestClassA711 + { + public TestClassA711() + { + } + } + [Export] + public class TestClassA712 + { + public TestClassA712() + { + } + } + [Export] + public class TestClassA713 + { + public TestClassA713() + { + } + } + [Export] + public class TestClassA714 + { + public TestClassA714() + { + } + } + [Export] + public class TestClassA715 + { + public TestClassA715() + { + } + } + [Export] + public class TestClassA716 + { + public TestClassA716() + { + } + } + [Export] + public class TestClassA717 + { + public TestClassA717() + { + } + } + [Export] + public class TestClassA718 + { + public TestClassA718() + { + } + } + [Export] + public class TestClassA719 + { + public TestClassA719() + { + } + } + [Export] + public class TestClassA720 + { + public TestClassA720() + { + } + } + [Export] + public class TestClassA721 + { + public TestClassA721() + { + } + } + [Export] + public class TestClassA722 + { + public TestClassA722() + { + } + } + [Export] + public class TestClassA723 + { + public TestClassA723() + { + } + } + [Export] + public class TestClassA724 + { + public TestClassA724() + { + } + } + [Export] + public class TestClassA725 + { + public TestClassA725() + { + } + } + [Export] + public class TestClassA726 + { + public TestClassA726() + { + } + } + [Export] + public class TestClassA727 + { + public TestClassA727() + { + } + } + [Export] + public class TestClassA728 + { + public TestClassA728() + { + } + } + [Export] + public class TestClassA729 + { + public TestClassA729() + { + } + } + [Export] + public class TestClassA730 + { + public TestClassA730() + { + } + } + [Export] + public class TestClassA731 + { + public TestClassA731() + { + } + } + [Export] + public class TestClassA732 + { + public TestClassA732() + { + } + } + [Export] + public class TestClassA733 + { + public TestClassA733() + { + } + } + [Export] + public class TestClassA734 + { + public TestClassA734() + { + } + } + [Export] + public class TestClassA735 + { + public TestClassA735() + { + } + } + [Export] + public class TestClassA736 + { + public TestClassA736() + { + } + } + [Export] + public class TestClassA737 + { + public TestClassA737() + { + } + } + [Export] + public class TestClassA738 + { + public TestClassA738() + { + } + } + [Export] + public class TestClassA739 + { + public TestClassA739() + { + } + } + [Export] + public class TestClassA740 + { + public TestClassA740() + { + } + } + [Export] + public class TestClassA741 + { + public TestClassA741() + { + } + } + [Export] + public class TestClassA742 + { + public TestClassA742() + { + } + } + [Export] + public class TestClassA743 + { + public TestClassA743() + { + } + } + [Export] + public class TestClassA744 + { + public TestClassA744() + { + } + } + [Export] + public class TestClassA745 + { + public TestClassA745() + { + } + } + [Export] + public class TestClassA746 + { + public TestClassA746() + { + } + } + [Export] + public class TestClassA747 + { + public TestClassA747() + { + } + } + [Export] + public class TestClassA748 + { + public TestClassA748() + { + } + } + [Export] + public class TestClassA749 + { + public TestClassA749() + { + } + } + [Export] + public class TestClassA750 + { + public TestClassA750() + { + } + } + [Export] + public class TestClassA751 + { + public TestClassA751() + { + } + } + [Export] + public class TestClassA752 + { + public TestClassA752() + { + } + } + [Export] + public class TestClassA753 + { + public TestClassA753() + { + } + } + [Export] + public class TestClassA754 + { + public TestClassA754() + { + } + } + [Export] + public class TestClassA755 + { + public TestClassA755() + { + } + } + [Export] + public class TestClassA756 + { + public TestClassA756() + { + } + } + [Export] + public class TestClassA757 + { + public TestClassA757() + { + } + } + [Export] + public class TestClassA758 + { + public TestClassA758() + { + } + } + [Export] + public class TestClassA759 + { + public TestClassA759() + { + } + } + [Export] + public class TestClassA760 + { + public TestClassA760() + { + } + } + [Export] + public class TestClassA761 + { + public TestClassA761() + { + } + } + [Export] + public class TestClassA762 + { + public TestClassA762() + { + } + } + [Export] + public class TestClassA763 + { + public TestClassA763() + { + } + } + [Export] + public class TestClassA764 + { + public TestClassA764() + { + } + } + [Export] + public class TestClassA765 + { + public TestClassA765() + { + } + } + [Export] + public class TestClassA766 + { + public TestClassA766() + { + } + } + [Export] + public class TestClassA767 + { + public TestClassA767() + { + } + } + [Export] + public class TestClassA768 + { + public TestClassA768() + { + } + } + [Export] + public class TestClassA769 + { + public TestClassA769() + { + } + } + [Export] + public class TestClassA770 + { + public TestClassA770() + { + } + } + [Export] + public class TestClassA771 + { + public TestClassA771() + { + } + } + [Export] + public class TestClassA772 + { + public TestClassA772() + { + } + } + [Export] + public class TestClassA773 + { + public TestClassA773() + { + } + } + [Export] + public class TestClassA774 + { + public TestClassA774() + { + } + } + [Export] + public class TestClassA775 + { + public TestClassA775() + { + } + } + [Export] + public class TestClassA776 + { + public TestClassA776() + { + } + } + [Export] + public class TestClassA777 + { + public TestClassA777() + { + } + } + [Export] + public class TestClassA778 + { + public TestClassA778() + { + } + } + [Export] + public class TestClassA779 + { + public TestClassA779() + { + } + } + [Export] + public class TestClassA780 + { + public TestClassA780() + { + } + } + [Export] + public class TestClassA781 + { + public TestClassA781() + { + } + } + [Export] + public class TestClassA782 + { + public TestClassA782() + { + } + } + [Export] + public class TestClassA783 + { + public TestClassA783() + { + } + } + [Export] + public class TestClassA784 + { + public TestClassA784() + { + } + } + [Export] + public class TestClassA785 + { + public TestClassA785() + { + } + } + [Export] + public class TestClassA786 + { + public TestClassA786() + { + } + } + [Export] + public class TestClassA787 + { + public TestClassA787() + { + } + } + [Export] + public class TestClassA788 + { + public TestClassA788() + { + } + } + [Export] + public class TestClassA789 + { + public TestClassA789() + { + } + } + [Export] + public class TestClassA790 + { + public TestClassA790() + { + } + } + [Export] + public class TestClassA791 + { + public TestClassA791() + { + } + } + [Export] + public class TestClassA792 + { + public TestClassA792() + { + } + } + [Export] + public class TestClassA793 + { + public TestClassA793() + { + } + } + [Export] + public class TestClassA794 + { + public TestClassA794() + { + } + } + [Export] + public class TestClassA795 + { + public TestClassA795() + { + } + } + [Export] + public class TestClassA796 + { + public TestClassA796() + { + } + } + [Export] + public class TestClassA797 + { + public TestClassA797() + { + } + } + [Export] + public class TestClassA798 + { + public TestClassA798() + { + } + } + [Export] + public class TestClassA799 + { + public TestClassA799() + { + } + } + [Export] + public class TestClassA800 + { + public TestClassA800() + { + } + } + [Export] + public class TestClassA801 + { + public TestClassA801() + { + } + } + [Export] + public class TestClassA802 + { + public TestClassA802() + { + } + } + [Export] + public class TestClassA803 + { + public TestClassA803() + { + } + } + [Export] + public class TestClassA804 + { + public TestClassA804() + { + } + } + [Export] + public class TestClassA805 + { + public TestClassA805() + { + } + } + [Export] + public class TestClassA806 + { + public TestClassA806() + { + } + } + [Export] + public class TestClassA807 + { + public TestClassA807() + { + } + } + [Export] + public class TestClassA808 + { + public TestClassA808() + { + } + } + [Export] + public class TestClassA809 + { + public TestClassA809() + { + } + } + [Export] + public class TestClassA810 + { + public TestClassA810() + { + } + } + [Export] + public class TestClassA811 + { + public TestClassA811() + { + } + } + [Export] + public class TestClassA812 + { + public TestClassA812() + { + } + } + [Export] + public class TestClassA813 + { + public TestClassA813() + { + } + } + [Export] + public class TestClassA814 + { + public TestClassA814() + { + } + } + [Export] + public class TestClassA815 + { + public TestClassA815() + { + } + } + [Export] + public class TestClassA816 + { + public TestClassA816() + { + } + } + [Export] + public class TestClassA817 + { + public TestClassA817() + { + } + } + [Export] + public class TestClassA818 + { + public TestClassA818() + { + } + } + [Export] + public class TestClassA819 + { + public TestClassA819() + { + } + } + [Export] + public class TestClassA820 + { + public TestClassA820() + { + } + } + [Export] + public class TestClassA821 + { + public TestClassA821() + { + } + } + [Export] + public class TestClassA822 + { + public TestClassA822() + { + } + } + [Export] + public class TestClassA823 + { + public TestClassA823() + { + } + } + [Export] + public class TestClassA824 + { + public TestClassA824() + { + } + } + [Export] + public class TestClassA825 + { + public TestClassA825() + { + } + } + [Export] + public class TestClassA826 + { + public TestClassA826() + { + } + } + [Export] + public class TestClassA827 + { + public TestClassA827() + { + } + } + [Export] + public class TestClassA828 + { + public TestClassA828() + { + } + } + [Export] + public class TestClassA829 + { + public TestClassA829() + { + } + } + [Export] + public class TestClassA830 + { + public TestClassA830() + { + } + } + [Export] + public class TestClassA831 + { + public TestClassA831() + { + } + } + [Export] + public class TestClassA832 + { + public TestClassA832() + { + } + } + [Export] + public class TestClassA833 + { + public TestClassA833() + { + } + } + [Export] + public class TestClassA834 + { + public TestClassA834() + { + } + } + [Export] + public class TestClassA835 + { + public TestClassA835() + { + } + } + [Export] + public class TestClassA836 + { + public TestClassA836() + { + } + } + [Export] + public class TestClassA837 + { + public TestClassA837() + { + } + } + [Export] + public class TestClassA838 + { + public TestClassA838() + { + } + } + [Export] + public class TestClassA839 + { + public TestClassA839() + { + } + } + [Export] + public class TestClassA840 + { + public TestClassA840() + { + } + } + [Export] + public class TestClassA841 + { + public TestClassA841() + { + } + } + [Export] + public class TestClassA842 + { + public TestClassA842() + { + } + } + [Export] + public class TestClassA843 + { + public TestClassA843() + { + } + } + [Export] + public class TestClassA844 + { + public TestClassA844() + { + } + } + [Export] + public class TestClassA845 + { + public TestClassA845() + { + } + } + [Export] + public class TestClassA846 + { + public TestClassA846() + { + } + } + [Export] + public class TestClassA847 + { + public TestClassA847() + { + } + } + [Export] + public class TestClassA848 + { + public TestClassA848() + { + } + } + [Export] + public class TestClassA849 + { + public TestClassA849() + { + } + } + [Export] + public class TestClassA850 + { + public TestClassA850() + { + } + } + [Export] + public class TestClassA851 + { + public TestClassA851() + { + } + } + [Export] + public class TestClassA852 + { + public TestClassA852() + { + } + } + [Export] + public class TestClassA853 + { + public TestClassA853() + { + } + } + [Export] + public class TestClassA854 + { + public TestClassA854() + { + } + } + [Export] + public class TestClassA855 + { + public TestClassA855() + { + } + } + [Export] + public class TestClassA856 + { + public TestClassA856() + { + } + } + [Export] + public class TestClassA857 + { + public TestClassA857() + { + } + } + [Export] + public class TestClassA858 + { + public TestClassA858() + { + } + } + [Export] + public class TestClassA859 + { + public TestClassA859() + { + } + } + [Export] + public class TestClassA860 + { + public TestClassA860() + { + } + } + [Export] + public class TestClassA861 + { + public TestClassA861() + { + } + } + [Export] + public class TestClassA862 + { + public TestClassA862() + { + } + } + [Export] + public class TestClassA863 + { + public TestClassA863() + { + } + } + [Export] + public class TestClassA864 + { + public TestClassA864() + { + } + } + [Export] + public class TestClassA865 + { + public TestClassA865() + { + } + } + [Export] + public class TestClassA866 + { + public TestClassA866() + { + } + } + [Export] + public class TestClassA867 + { + public TestClassA867() + { + } + } + [Export] + public class TestClassA868 + { + public TestClassA868() + { + } + } + [Export] + public class TestClassA869 + { + public TestClassA869() + { + } + } + [Export] + public class TestClassA870 + { + public TestClassA870() + { + } + } + [Export] + public class TestClassA871 + { + public TestClassA871() + { + } + } + [Export] + public class TestClassA872 + { + public TestClassA872() + { + } + } + [Export] + public class TestClassA873 + { + public TestClassA873() + { + } + } + [Export] + public class TestClassA874 + { + public TestClassA874() + { + } + } + [Export] + public class TestClassA875 + { + public TestClassA875() + { + } + } + [Export] + public class TestClassA876 + { + public TestClassA876() + { + } + } + [Export] + public class TestClassA877 + { + public TestClassA877() + { + } + } + [Export] + public class TestClassA878 + { + public TestClassA878() + { + } + } + [Export] + public class TestClassA879 + { + public TestClassA879() + { + } + } + [Export] + public class TestClassA880 + { + public TestClassA880() + { + } + } + [Export] + public class TestClassA881 + { + public TestClassA881() + { + } + } + [Export] + public class TestClassA882 + { + public TestClassA882() + { + } + } + [Export] + public class TestClassA883 + { + public TestClassA883() + { + } + } + [Export] + public class TestClassA884 + { + public TestClassA884() + { + } + } + [Export] + public class TestClassA885 + { + public TestClassA885() + { + } + } + [Export] + public class TestClassA886 + { + public TestClassA886() + { + } + } + [Export] + public class TestClassA887 + { + public TestClassA887() + { + } + } + [Export] + public class TestClassA888 + { + public TestClassA888() + { + } + } + [Export] + public class TestClassA889 + { + public TestClassA889() + { + } + } + [Export] + public class TestClassA890 + { + public TestClassA890() + { + } + } + [Export] + public class TestClassA891 + { + public TestClassA891() + { + } + } + [Export] + public class TestClassA892 + { + public TestClassA892() + { + } + } + [Export] + public class TestClassA893 + { + public TestClassA893() + { + } + } + [Export] + public class TestClassA894 + { + public TestClassA894() + { + } + } + [Export] + public class TestClassA895 + { + public TestClassA895() + { + } + } + [Export] + public class TestClassA896 + { + public TestClassA896() + { + } + } + [Export] + public class TestClassA897 + { + public TestClassA897() + { + } + } + [Export] + public class TestClassA898 + { + public TestClassA898() + { + } + } + [Export] + public class TestClassA899 + { + public TestClassA899() + { + } + } + [Export] + public class TestClassA900 + { + public TestClassA900() + { + } + } + [Export] + public class TestClassA901 + { + public TestClassA901() + { + } + } + [Export] + public class TestClassA902 + { + public TestClassA902() + { + } + } + [Export] + public class TestClassA903 + { + public TestClassA903() + { + } + } + [Export] + public class TestClassA904 + { + public TestClassA904() + { + } + } + [Export] + public class TestClassA905 + { + public TestClassA905() + { + } + } + [Export] + public class TestClassA906 + { + public TestClassA906() + { + } + } + [Export] + public class TestClassA907 + { + public TestClassA907() + { + } + } + [Export] + public class TestClassA908 + { + public TestClassA908() + { + } + } + [Export] + public class TestClassA909 + { + public TestClassA909() + { + } + } + [Export] + public class TestClassA910 + { + public TestClassA910() + { + } + } + [Export] + public class TestClassA911 + { + public TestClassA911() + { + } + } + [Export] + public class TestClassA912 + { + public TestClassA912() + { + } + } + [Export] + public class TestClassA913 + { + public TestClassA913() + { + } + } + [Export] + public class TestClassA914 + { + public TestClassA914() + { + } + } + [Export] + public class TestClassA915 + { + public TestClassA915() + { + } + } + [Export] + public class TestClassA916 + { + public TestClassA916() + { + } + } + [Export] + public class TestClassA917 + { + public TestClassA917() + { + } + } + [Export] + public class TestClassA918 + { + public TestClassA918() + { + } + } + [Export] + public class TestClassA919 + { + public TestClassA919() + { + } + } + [Export] + public class TestClassA920 + { + public TestClassA920() + { + } + } + [Export] + public class TestClassA921 + { + public TestClassA921() + { + } + } + [Export] + public class TestClassA922 + { + public TestClassA922() + { + } + } + [Export] + public class TestClassA923 + { + public TestClassA923() + { + } + } + [Export] + public class TestClassA924 + { + public TestClassA924() + { + } + } + [Export] + public class TestClassA925 + { + public TestClassA925() + { + } + } + [Export] + public class TestClassA926 + { + public TestClassA926() + { + } + } + [Export] + public class TestClassA927 + { + public TestClassA927() + { + } + } + [Export] + public class TestClassA928 + { + public TestClassA928() + { + } + } + [Export] + public class TestClassA929 + { + public TestClassA929() + { + } + } + [Export] + public class TestClassA930 + { + public TestClassA930() + { + } + } + [Export] + public class TestClassA931 + { + public TestClassA931() + { + } + } + [Export] + public class TestClassA932 + { + public TestClassA932() + { + } + } + [Export] + public class TestClassA933 + { + public TestClassA933() + { + } + } + [Export] + public class TestClassA934 + { + public TestClassA934() + { + } + } + [Export] + public class TestClassA935 + { + public TestClassA935() + { + } + } + [Export] + public class TestClassA936 + { + public TestClassA936() + { + } + } + [Export] + public class TestClassA937 + { + public TestClassA937() + { + } + } + [Export] + public class TestClassA938 + { + public TestClassA938() + { + } + } + [Export] + public class TestClassA939 + { + public TestClassA939() + { + } + } + [Export] + public class TestClassA940 + { + public TestClassA940() + { + } + } + [Export] + public class TestClassA941 + { + public TestClassA941() + { + } + } + [Export] + public class TestClassA942 + { + public TestClassA942() + { + } + } + [Export] + public class TestClassA943 + { + public TestClassA943() + { + } + } + [Export] + public class TestClassA944 + { + public TestClassA944() + { + } + } + [Export] + public class TestClassA945 + { + public TestClassA945() + { + } + } + [Export] + public class TestClassA946 + { + public TestClassA946() + { + } + } + [Export] + public class TestClassA947 + { + public TestClassA947() + { + } + } + [Export] + public class TestClassA948 + { + public TestClassA948() + { + } + } + [Export] + public class TestClassA949 + { + public TestClassA949() + { + } + } + [Export] + public class TestClassA950 + { + public TestClassA950() + { + } + } + [Export] + public class TestClassA951 + { + public TestClassA951() + { + } + } + [Export] + public class TestClassA952 + { + public TestClassA952() + { + } + } + [Export] + public class TestClassA953 + { + public TestClassA953() + { + } + } + [Export] + public class TestClassA954 + { + public TestClassA954() + { + } + } + [Export] + public class TestClassA955 + { + public TestClassA955() + { + } + } + [Export] + public class TestClassA956 + { + public TestClassA956() + { + } + } + [Export] + public class TestClassA957 + { + public TestClassA957() + { + } + } + [Export] + public class TestClassA958 + { + public TestClassA958() + { + } + } + [Export] + public class TestClassA959 + { + public TestClassA959() + { + } + } + [Export] + public class TestClassA960 + { + public TestClassA960() + { + } + } + [Export] + public class TestClassA961 + { + public TestClassA961() + { + } + } + [Export] + public class TestClassA962 + { + public TestClassA962() + { + } + } + [Export] + public class TestClassA963 + { + public TestClassA963() + { + } + } + [Export] + public class TestClassA964 + { + public TestClassA964() + { + } + } + [Export] + public class TestClassA965 + { + public TestClassA965() + { + } + } + [Export] + public class TestClassA966 + { + public TestClassA966() + { + } + } + [Export] + public class TestClassA967 + { + public TestClassA967() + { + } + } + [Export] + public class TestClassA968 + { + public TestClassA968() + { + } + } + [Export] + public class TestClassA969 + { + public TestClassA969() + { + } + } + [Export] + public class TestClassA970 + { + public TestClassA970() + { + } + } + [Export] + public class TestClassA971 + { + public TestClassA971() + { + } + } + [Export] + public class TestClassA972 + { + public TestClassA972() + { + } + } + [Export] + public class TestClassA973 + { + public TestClassA973() + { + } + } + [Export] + public class TestClassA974 + { + public TestClassA974() + { + } + } + [Export] + public class TestClassA975 + { + public TestClassA975() + { + } + } + [Export] + public class TestClassA976 + { + public TestClassA976() + { + } + } + [Export] + public class TestClassA977 + { + public TestClassA977() + { + } + } + [Export] + public class TestClassA978 + { + public TestClassA978() + { + } + } + [Export] + public class TestClassA979 + { + public TestClassA979() + { + } + } + [Export] + public class TestClassA980 + { + public TestClassA980() + { + } + } + [Export] + public class TestClassA981 + { + public TestClassA981() + { + } + } + [Export] + public class TestClassA982 + { + public TestClassA982() + { + } + } + [Export] + public class TestClassA983 + { + public TestClassA983() + { + } + } + [Export] + public class TestClassA984 + { + public TestClassA984() + { + } + } + [Export] + public class TestClassA985 + { + public TestClassA985() + { + } + } + [Export] + public class TestClassA986 + { + public TestClassA986() + { + } + } + [Export] + public class TestClassA987 + { + public TestClassA987() + { + } + } + [Export] + public class TestClassA988 + { + public TestClassA988() + { + } + } + [Export] + public class TestClassA989 + { + public TestClassA989() + { + } + } + [Export] + public class TestClassA990 + { + public TestClassA990() + { + } + } + [Export] + public class TestClassA991 + { + public TestClassA991() + { + } + } + [Export] + public class TestClassA992 + { + public TestClassA992() + { + } + } + [Export] + public class TestClassA993 + { + public TestClassA993() + { + } + } + [Export] + public class TestClassA994 + { + public TestClassA994() + { + } + } + [Export] + public class TestClassA995 + { + public TestClassA995() + { + } + } + [Export] + public class TestClassA996 + { + public TestClassA996() + { + } + } + [Export] + public class TestClassA997 + { + public TestClassA997() + { + } + } + [Export] + public class TestClassA998 + { + public TestClassA998() + { + } + } + [Export] + public class TestClassA999 + { + public TestClassA999() + { + } + } + [Export] + public class TestClassA1000 + { + public TestClassA1000() + { + } + } + [Export] + public class TestClassA1001 + { + public TestClassA1001() + { + } + } + [Export] + public class TestClassA1002 + { + public TestClassA1002() + { + } + } + [Export] + public class TestClassA1003 + { + public TestClassA1003() + { + } + } + [Export] + public class TestClassA1004 + { + public TestClassA1004() + { + } + } + [Export] + public class TestClassA1005 + { + public TestClassA1005() + { + } + } + [Export] + public class TestClassA1006 + { + public TestClassA1006() + { + } + } + [Export] + public class TestClassA1007 + { + public TestClassA1007() + { + } + } + [Export] + public class TestClassA1008 + { + public TestClassA1008() + { + } + } + [Export] + public class TestClassA1009 + { + public TestClassA1009() + { + } + } + [Export] + public class TestClassA1010 + { + public TestClassA1010() + { + } + } + [Export] + public class TestClassA1011 + { + public TestClassA1011() + { + } + } + [Export] + public class TestClassA1012 + { + public TestClassA1012() + { + } + } + [Export] + public class TestClassA1013 + { + public TestClassA1013() + { + } + } + [Export] + public class TestClassA1014 + { + public TestClassA1014() + { + } + } + [Export] + public class TestClassA1015 + { + public TestClassA1015() + { + } + } + [Export] + public class TestClassA1016 + { + public TestClassA1016() + { + } + } + [Export] + public class TestClassA1017 + { + public TestClassA1017() + { + } + } + [Export] + public class TestClassA1018 + { + public TestClassA1018() + { + } + } + [Export] + public class TestClassA1019 + { + public TestClassA1019() + { + } + } + [Export] + public class TestClassA1020 + { + public TestClassA1020() + { + } + } + [Export] + public class TestClassA1021 + { + public TestClassA1021() + { + } + } + [Export] + public class TestClassA1022 + { + public TestClassA1022() + { + } + } + [Export] + public class TestClassA1023 + { + public TestClassA1023() + { + } + } + [Export] + public class TestClassA1024 + { + public TestClassA1024() + { + } + } + [Export] + public class TestClassA1025 + { + public TestClassA1025() + { + } + } + [Export] + public class TestClassA1026 + { + public TestClassA1026() + { + } + } + [Export] + public class TestClassA1027 + { + public TestClassA1027() + { + } + } + [Export] + public class TestClassA1028 + { + public TestClassA1028() + { + } + } + [Export] + public class TestClassA1029 + { + public TestClassA1029() + { + } + } + [Export] + public class TestClassA1030 + { + public TestClassA1030() + { + } + } + [Export] + public class TestClassA1031 + { + public TestClassA1031() + { + } + } + [Export] + public class TestClassA1032 + { + public TestClassA1032() + { + } + } + [Export] + public class TestClassA1033 + { + public TestClassA1033() + { + } + } + [Export] + public class TestClassA1034 + { + public TestClassA1034() + { + } + } + [Export] + public class TestClassA1035 + { + public TestClassA1035() + { + } + } + [Export] + public class TestClassA1036 + { + public TestClassA1036() + { + } + } + [Export] + public class TestClassA1037 + { + public TestClassA1037() + { + } + } + [Export] + public class TestClassA1038 + { + public TestClassA1038() + { + } + } + [Export] + public class TestClassA1039 + { + public TestClassA1039() + { + } + } + [Export] + public class TestClassA1040 + { + public TestClassA1040() + { + } + } + [Export] + public class TestClassA1041 + { + public TestClassA1041() + { + } + } + [Export] + public class TestClassA1042 + { + public TestClassA1042() + { + } + } + [Export] + public class TestClassA1043 + { + public TestClassA1043() + { + } + } + [Export] + public class TestClassA1044 + { + public TestClassA1044() + { + } + } + [Export] + public class TestClassA1045 + { + public TestClassA1045() + { + } + } + [Export] + public class TestClassA1046 + { + public TestClassA1046() + { + } + } + [Export] + public class TestClassA1047 + { + public TestClassA1047() + { + } + } + [Export] + public class TestClassA1048 + { + public TestClassA1048() + { + } + } + [Export] + public class TestClassA1049 + { + public TestClassA1049() + { + } + } + [Export] + public class TestClassA1050 + { + public TestClassA1050() + { + } + } + [Export] + public class TestClassA1051 + { + public TestClassA1051() + { + } + } + [Export] + public class TestClassA1052 + { + public TestClassA1052() + { + } + } + [Export] + public class TestClassA1053 + { + public TestClassA1053() + { + } + } + [Export] + public class TestClassA1054 + { + public TestClassA1054() + { + } + } + [Export] + public class TestClassA1055 + { + public TestClassA1055() + { + } + } + [Export] + public class TestClassA1056 + { + public TestClassA1056() + { + } + } + [Export] + public class TestClassA1057 + { + public TestClassA1057() + { + } + } + [Export] + public class TestClassA1058 + { + public TestClassA1058() + { + } + } + [Export] + public class TestClassA1059 + { + public TestClassA1059() + { + } + } + [Export] + public class TestClassA1060 + { + public TestClassA1060() + { + } + } + [Export] + public class TestClassA1061 + { + public TestClassA1061() + { + } + } + [Export] + public class TestClassA1062 + { + public TestClassA1062() + { + } + } + [Export] + public class TestClassA1063 + { + public TestClassA1063() + { + } + } + [Export] + public class TestClassA1064 + { + public TestClassA1064() + { + } + } + [Export] + public class TestClassA1065 + { + public TestClassA1065() + { + } + } + [Export] + public class TestClassA1066 + { + public TestClassA1066() + { + } + } + [Export] + public class TestClassA1067 + { + public TestClassA1067() + { + } + } + [Export] + public class TestClassA1068 + { + public TestClassA1068() + { + } + } + [Export] + public class TestClassA1069 + { + public TestClassA1069() + { + } + } + [Export] + public class TestClassA1070 + { + public TestClassA1070() + { + } + } + [Export] + public class TestClassA1071 + { + public TestClassA1071() + { + } + } + [Export] + public class TestClassA1072 + { + public TestClassA1072() + { + } + } + [Export] + public class TestClassA1073 + { + public TestClassA1073() + { + } + } + [Export] + public class TestClassA1074 + { + public TestClassA1074() + { + } + } + [Export] + public class TestClassA1075 + { + public TestClassA1075() + { + } + } + [Export] + public class TestClassA1076 + { + public TestClassA1076() + { + } + } + [Export] + public class TestClassA1077 + { + public TestClassA1077() + { + } + } + [Export] + public class TestClassA1078 + { + public TestClassA1078() + { + } + } + [Export] + public class TestClassA1079 + { + public TestClassA1079() + { + } + } + [Export] + public class TestClassA1080 + { + public TestClassA1080() + { + } + } + [Export] + public class TestClassA1081 + { + public TestClassA1081() + { + } + } + [Export] + public class TestClassA1082 + { + public TestClassA1082() + { + } + } + [Export] + public class TestClassA1083 + { + public TestClassA1083() + { + } + } + [Export] + public class TestClassA1084 + { + public TestClassA1084() + { + } + } + [Export] + public class TestClassA1085 + { + public TestClassA1085() + { + } + } + [Export] + public class TestClassA1086 + { + public TestClassA1086() + { + } + } + [Export] + public class TestClassA1087 + { + public TestClassA1087() + { + } + } + [Export] + public class TestClassA1088 + { + public TestClassA1088() + { + } + } + [Export] + public class TestClassA1089 + { + public TestClassA1089() + { + } + } + [Export] + public class TestClassA1090 + { + public TestClassA1090() + { + } + } + [Export] + public class TestClassA1091 + { + public TestClassA1091() + { + } + } + [Export] + public class TestClassA1092 + { + public TestClassA1092() + { + } + } + [Export] + public class TestClassA1093 + { + public TestClassA1093() + { + } + } + [Export] + public class TestClassA1094 + { + public TestClassA1094() + { + } + } + [Export] + public class TestClassA1095 + { + public TestClassA1095() + { + } + } + [Export] + public class TestClassA1096 + { + public TestClassA1096() + { + } + } + [Export] + public class TestClassA1097 + { + public TestClassA1097() + { + } + } + [Export] + public class TestClassA1098 + { + public TestClassA1098() + { + } + } + [Export] + public class TestClassA1099 + { + public TestClassA1099() + { + } + } + [Export] + public class TestClassA1100 + { + public TestClassA1100() + { + } + } + [Export] + public class TestClassA1101 + { + public TestClassA1101() + { + } + } + [Export] + public class TestClassA1102 + { + public TestClassA1102() + { + } + } + [Export] + public class TestClassA1103 + { + public TestClassA1103() + { + } + } + [Export] + public class TestClassA1104 + { + public TestClassA1104() + { + } + } + [Export] + public class TestClassA1105 + { + public TestClassA1105() + { + } + } + [Export] + public class TestClassA1106 + { + public TestClassA1106() + { + } + } + [Export] + public class TestClassA1107 + { + public TestClassA1107() + { + } + } + [Export] + public class TestClassA1108 + { + public TestClassA1108() + { + } + } + [Export] + public class TestClassA1109 + { + public TestClassA1109() + { + } + } + [Export] + public class TestClassA1110 + { + public TestClassA1110() + { + } + } + [Export] + public class TestClassA1111 + { + public TestClassA1111() + { + } + } + [Export] + public class TestClassA1112 + { + public TestClassA1112() + { + } + } + [Export] + public class TestClassA1113 + { + public TestClassA1113() + { + } + } + [Export] + public class TestClassA1114 + { + public TestClassA1114() + { + } + } + [Export] + public class TestClassA1115 + { + public TestClassA1115() + { + } + } + [Export] + public class TestClassA1116 + { + public TestClassA1116() + { + } + } + [Export] + public class TestClassA1117 + { + public TestClassA1117() + { + } + } + [Export] + public class TestClassA1118 + { + public TestClassA1118() + { + } + } + [Export] + public class TestClassA1119 + { + public TestClassA1119() + { + } + } + [Export] + public class TestClassA1120 + { + public TestClassA1120() + { + } + } + [Export] + public class TestClassA1121 + { + public TestClassA1121() + { + } + } + [Export] + public class TestClassA1122 + { + public TestClassA1122() + { + } + } + [Export] + public class TestClassA1123 + { + public TestClassA1123() + { + } + } + [Export] + public class TestClassA1124 + { + public TestClassA1124() + { + } + } + [Export] + public class TestClassA1125 + { + public TestClassA1125() + { + } + } + [Export] + public class TestClassA1126 + { + public TestClassA1126() + { + } + } + [Export] + public class TestClassA1127 + { + public TestClassA1127() + { + } + } + [Export] + public class TestClassA1128 + { + public TestClassA1128() + { + } + } + [Export] + public class TestClassA1129 + { + public TestClassA1129() + { + } + } + [Export] + public class TestClassA1130 + { + public TestClassA1130() + { + } + } + [Export] + public class TestClassA1131 + { + public TestClassA1131() + { + } + } + [Export] + public class TestClassA1132 + { + public TestClassA1132() + { + } + } + [Export] + public class TestClassA1133 + { + public TestClassA1133() + { + } + } + [Export] + public class TestClassA1134 + { + public TestClassA1134() + { + } + } + [Export] + public class TestClassA1135 + { + public TestClassA1135() + { + } + } + [Export] + public class TestClassA1136 + { + public TestClassA1136() + { + } + } + [Export] + public class TestClassA1137 + { + public TestClassA1137() + { + } + } + [Export] + public class TestClassA1138 + { + public TestClassA1138() + { + } + } + [Export] + public class TestClassA1139 + { + public TestClassA1139() + { + } + } + [Export] + public class TestClassA1140 + { + public TestClassA1140() + { + } + } + [Export] + public class TestClassA1141 + { + public TestClassA1141() + { + } + } + [Export] + public class TestClassA1142 + { + public TestClassA1142() + { + } + } + [Export] + public class TestClassA1143 + { + public TestClassA1143() + { + } + } + [Export] + public class TestClassA1144 + { + public TestClassA1144() + { + } + } + [Export] + public class TestClassA1145 + { + public TestClassA1145() + { + } + } + [Export] + public class TestClassA1146 + { + public TestClassA1146() + { + } + } + [Export] + public class TestClassA1147 + { + public TestClassA1147() + { + } + } + [Export] + public class TestClassA1148 + { + public TestClassA1148() + { + } + } + [Export] + public class TestClassA1149 + { + public TestClassA1149() + { + } + } + [Export] + public class TestClassA1150 + { + public TestClassA1150() + { + } + } + [Export] + public class TestClassA1151 + { + public TestClassA1151() + { + } + } + [Export] + public class TestClassA1152 + { + public TestClassA1152() + { + } + } + [Export] + public class TestClassA1153 + { + public TestClassA1153() + { + } + } + [Export] + public class TestClassA1154 + { + public TestClassA1154() + { + } + } + [Export] + public class TestClassA1155 + { + public TestClassA1155() + { + } + } + [Export] + public class TestClassA1156 + { + public TestClassA1156() + { + } + } + [Export] + public class TestClassA1157 + { + public TestClassA1157() + { + } + } + [Export] + public class TestClassA1158 + { + public TestClassA1158() + { + } + } + [Export] + public class TestClassA1159 + { + public TestClassA1159() + { + } + } + [Export] + public class TestClassA1160 + { + public TestClassA1160() + { + } + } + [Export] + public class TestClassA1161 + { + public TestClassA1161() + { + } + } + [Export] + public class TestClassA1162 + { + public TestClassA1162() + { + } + } + [Export] + public class TestClassA1163 + { + public TestClassA1163() + { + } + } + [Export] + public class TestClassA1164 + { + public TestClassA1164() + { + } + } + [Export] + public class TestClassA1165 + { + public TestClassA1165() + { + } + } + [Export] + public class TestClassA1166 + { + public TestClassA1166() + { + } + } + [Export] + public class TestClassA1167 + { + public TestClassA1167() + { + } + } + [Export] + public class TestClassA1168 + { + public TestClassA1168() + { + } + } + [Export] + public class TestClassA1169 + { + public TestClassA1169() + { + } + } + [Export] + public class TestClassA1170 + { + public TestClassA1170() + { + } + } + [Export] + public class TestClassA1171 + { + public TestClassA1171() + { + } + } + [Export] + public class TestClassA1172 + { + public TestClassA1172() + { + } + } + [Export] + public class TestClassA1173 + { + public TestClassA1173() + { + } + } + [Export] + public class TestClassA1174 + { + public TestClassA1174() + { + } + } + [Export] + public class TestClassA1175 + { + public TestClassA1175() + { + } + } + [Export] + public class TestClassA1176 + { + public TestClassA1176() + { + } + } + [Export] + public class TestClassA1177 + { + public TestClassA1177() + { + } + } + [Export] + public class TestClassA1178 + { + public TestClassA1178() + { + } + } + [Export] + public class TestClassA1179 + { + public TestClassA1179() + { + } + } + [Export] + public class TestClassA1180 + { + public TestClassA1180() + { + } + } + [Export] + public class TestClassA1181 + { + public TestClassA1181() + { + } + } + [Export] + public class TestClassA1182 + { + public TestClassA1182() + { + } + } + [Export] + public class TestClassA1183 + { + public TestClassA1183() + { + } + } + [Export] + public class TestClassA1184 + { + public TestClassA1184() + { + } + } + [Export] + public class TestClassA1185 + { + public TestClassA1185() + { + } + } + [Export] + public class TestClassA1186 + { + public TestClassA1186() + { + } + } + [Export] + public class TestClassA1187 + { + public TestClassA1187() + { + } + } + [Export] + public class TestClassA1188 + { + public TestClassA1188() + { + } + } + [Export] + public class TestClassA1189 + { + public TestClassA1189() + { + } + } + [Export] + public class TestClassA1190 + { + public TestClassA1190() + { + } + } + [Export] + public class TestClassA1191 + { + public TestClassA1191() + { + } + } + [Export] + public class TestClassA1192 + { + public TestClassA1192() + { + } + } + [Export] + public class TestClassA1193 + { + public TestClassA1193() + { + } + } + [Export] + public class TestClassA1194 + { + public TestClassA1194() + { + } + } + [Export] + public class TestClassA1195 + { + public TestClassA1195() + { + } + } + [Export] + public class TestClassA1196 + { + public TestClassA1196() + { + } + } + [Export] + public class TestClassA1197 + { + public TestClassA1197() + { + } + } + [Export] + public class TestClassA1198 + { + public TestClassA1198() + { + } + } + [Export] + public class TestClassA1199 + { + public TestClassA1199() + { + } + } + [Export] + public class TestClassA1200 + { + public TestClassA1200() + { + } + } + [Export] + public class TestClassA1201 + { + public TestClassA1201() + { + } + } + [Export] + public class TestClassA1202 + { + public TestClassA1202() + { + } + } + [Export] + public class TestClassA1203 + { + public TestClassA1203() + { + } + } + [Export] + public class TestClassA1204 + { + public TestClassA1204() + { + } + } + [Export] + public class TestClassA1205 + { + public TestClassA1205() + { + } + } + [Export] + public class TestClassA1206 + { + public TestClassA1206() + { + } + } + [Export] + public class TestClassA1207 + { + public TestClassA1207() + { + } + } + [Export] + public class TestClassA1208 + { + public TestClassA1208() + { + } + } + [Export] + public class TestClassA1209 + { + public TestClassA1209() + { + } + } + [Export] + public class TestClassA1210 + { + public TestClassA1210() + { + } + } + [Export] + public class TestClassA1211 + { + public TestClassA1211() + { + } + } + [Export] + public class TestClassA1212 + { + public TestClassA1212() + { + } + } + [Export] + public class TestClassA1213 + { + public TestClassA1213() + { + } + } + [Export] + public class TestClassA1214 + { + public TestClassA1214() + { + } + } + [Export] + public class TestClassA1215 + { + public TestClassA1215() + { + } + } + [Export] + public class TestClassA1216 + { + public TestClassA1216() + { + } + } + [Export] + public class TestClassA1217 + { + public TestClassA1217() + { + } + } + [Export] + public class TestClassA1218 + { + public TestClassA1218() + { + } + } + [Export] + public class TestClassA1219 + { + public TestClassA1219() + { + } + } + [Export] + public class TestClassA1220 + { + public TestClassA1220() + { + } + } + [Export] + public class TestClassA1221 + { + public TestClassA1221() + { + } + } + [Export] + public class TestClassA1222 + { + public TestClassA1222() + { + } + } + [Export] + public class TestClassA1223 + { + public TestClassA1223() + { + } + } + [Export] + public class TestClassA1224 + { + public TestClassA1224() + { + } + } + [Export] + public class TestClassA1225 + { + public TestClassA1225() + { + } + } + [Export] + public class TestClassA1226 + { + public TestClassA1226() + { + } + } + [Export] + public class TestClassA1227 + { + public TestClassA1227() + { + } + } + [Export] + public class TestClassA1228 + { + public TestClassA1228() + { + } + } + [Export] + public class TestClassA1229 + { + public TestClassA1229() + { + } + } + [Export] + public class TestClassA1230 + { + public TestClassA1230() + { + } + } + [Export] + public class TestClassA1231 + { + public TestClassA1231() + { + } + } + [Export] + public class TestClassA1232 + { + public TestClassA1232() + { + } + } + [Export] + public class TestClassA1233 + { + public TestClassA1233() + { + } + } + [Export] + public class TestClassA1234 + { + public TestClassA1234() + { + } + } + [Export] + public class TestClassA1235 + { + public TestClassA1235() + { + } + } + [Export] + public class TestClassA1236 + { + public TestClassA1236() + { + } + } + [Export] + public class TestClassA1237 + { + public TestClassA1237() + { + } + } + [Export] + public class TestClassA1238 + { + public TestClassA1238() + { + } + } + [Export] + public class TestClassA1239 + { + public TestClassA1239() + { + } + } + [Export] + public class TestClassA1240 + { + public TestClassA1240() + { + } + } + [Export] + public class TestClassA1241 + { + public TestClassA1241() + { + } + } + [Export] + public class TestClassA1242 + { + public TestClassA1242() + { + } + } + [Export] + public class TestClassA1243 + { + public TestClassA1243() + { + } + } + [Export] + public class TestClassA1244 + { + public TestClassA1244() + { + } + } + [Export] + public class TestClassA1245 + { + public TestClassA1245() + { + } + } + [Export] + public class TestClassA1246 + { + public TestClassA1246() + { + } + } + [Export] + public class TestClassA1247 + { + public TestClassA1247() + { + } + } + [Export] + public class TestClassA1248 + { + public TestClassA1248() + { + } + } + [Export] + public class TestClassA1249 + { + public TestClassA1249() + { + } + } + [Export] + public class TestClassA1250 + { + public TestClassA1250() + { + } + } + [Export] + public class TestClassA1251 + { + public TestClassA1251() + { + } + } + [Export] + public class TestClassA1252 + { + public TestClassA1252() + { + } + } + [Export] + public class TestClassA1253 + { + public TestClassA1253() + { + } + } + [Export] + public class TestClassA1254 + { + public TestClassA1254() + { + } + } + [Export] + public class TestClassA1255 + { + public TestClassA1255() + { + } + } + [Export] + public class TestClassA1256 + { + public TestClassA1256() + { + } + } + [Export] + public class TestClassA1257 + { + public TestClassA1257() + { + } + } + [Export] + public class TestClassA1258 + { + public TestClassA1258() + { + } + } + [Export] + public class TestClassA1259 + { + public TestClassA1259() + { + } + } + [Export] + public class TestClassA1260 + { + public TestClassA1260() + { + } + } + [Export] + public class TestClassA1261 + { + public TestClassA1261() + { + } + } + [Export] + public class TestClassA1262 + { + public TestClassA1262() + { + } + } + [Export] + public class TestClassA1263 + { + public TestClassA1263() + { + } + } + [Export] + public class TestClassA1264 + { + public TestClassA1264() + { + } + } + [Export] + public class TestClassA1265 + { + public TestClassA1265() + { + } + } + [Export] + public class TestClassA1266 + { + public TestClassA1266() + { + } + } + [Export] + public class TestClassA1267 + { + public TestClassA1267() + { + } + } + [Export] + public class TestClassA1268 + { + public TestClassA1268() + { + } + } + [Export] + public class TestClassA1269 + { + public TestClassA1269() + { + } + } + [Export] + public class TestClassA1270 + { + public TestClassA1270() + { + } + } + [Export] + public class TestClassA1271 + { + public TestClassA1271() + { + } + } + [Export] + public class TestClassA1272 + { + public TestClassA1272() + { + } + } + [Export] + public class TestClassA1273 + { + public TestClassA1273() + { + } + } + [Export] + public class TestClassA1274 + { + public TestClassA1274() + { + } + } + [Export] + public class TestClassA1275 + { + public TestClassA1275() + { + } + } + [Export] + public class TestClassA1276 + { + public TestClassA1276() + { + } + } + [Export] + public class TestClassA1277 + { + public TestClassA1277() + { + } + } + [Export] + public class TestClassA1278 + { + public TestClassA1278() + { + } + } + [Export] + public class TestClassA1279 + { + public TestClassA1279() + { + } + } + [Export] + public class TestClassA1280 + { + public TestClassA1280() + { + } + } + [Export] + public class TestClassA1281 + { + public TestClassA1281() + { + } + } + [Export] + public class TestClassA1282 + { + public TestClassA1282() + { + } + } + [Export] + public class TestClassA1283 + { + public TestClassA1283() + { + } + } + [Export] + public class TestClassA1284 + { + public TestClassA1284() + { + } + } + [Export] + public class TestClassA1285 + { + public TestClassA1285() + { + } + } + [Export] + public class TestClassA1286 + { + public TestClassA1286() + { + } + } + [Export] + public class TestClassA1287 + { + public TestClassA1287() + { + } + } + [Export] + public class TestClassA1288 + { + public TestClassA1288() + { + } + } + [Export] + public class TestClassA1289 + { + public TestClassA1289() + { + } + } + [Export] + public class TestClassA1290 + { + public TestClassA1290() + { + } + } + [Export] + public class TestClassA1291 + { + public TestClassA1291() + { + } + } + [Export] + public class TestClassA1292 + { + public TestClassA1292() + { + } + } + [Export] + public class TestClassA1293 + { + public TestClassA1293() + { + } + } + [Export] + public class TestClassA1294 + { + public TestClassA1294() + { + } + } + [Export] + public class TestClassA1295 + { + public TestClassA1295() + { + } + } + [Export] + public class TestClassA1296 + { + public TestClassA1296() + { + } + } + [Export] + public class TestClassA1297 + { + public TestClassA1297() + { + } + } + [Export] + public class TestClassA1298 + { + public TestClassA1298() + { + } + } + [Export] + public class TestClassA1299 + { + public TestClassA1299() + { + } + } + [Export] + public class TestClassA1300 + { + public TestClassA1300() + { + } + } + [Export] + public class TestClassA1301 + { + public TestClassA1301() + { + } + } + [Export] + public class TestClassA1302 + { + public TestClassA1302() + { + } + } + [Export] + public class TestClassA1303 + { + public TestClassA1303() + { + } + } + [Export] + public class TestClassA1304 + { + public TestClassA1304() + { + } + } + [Export] + public class TestClassA1305 + { + public TestClassA1305() + { + } + } + [Export] + public class TestClassA1306 + { + public TestClassA1306() + { + } + } + [Export] + public class TestClassA1307 + { + public TestClassA1307() + { + } + } + [Export] + public class TestClassA1308 + { + public TestClassA1308() + { + } + } + [Export] + public class TestClassA1309 + { + public TestClassA1309() + { + } + } + [Export] + public class TestClassA1310 + { + public TestClassA1310() + { + } + } + [Export] + public class TestClassA1311 + { + public TestClassA1311() + { + } + } + [Export] + public class TestClassA1312 + { + public TestClassA1312() + { + } + } + [Export] + public class TestClassA1313 + { + public TestClassA1313() + { + } + } + [Export] + public class TestClassA1314 + { + public TestClassA1314() + { + } + } + [Export] + public class TestClassA1315 + { + public TestClassA1315() + { + } + } + [Export] + public class TestClassA1316 + { + public TestClassA1316() + { + } + } + [Export] + public class TestClassA1317 + { + public TestClassA1317() + { + } + } + [Export] + public class TestClassA1318 + { + public TestClassA1318() + { + } + } + [Export] + public class TestClassA1319 + { + public TestClassA1319() + { + } + } + [Export] + public class TestClassA1320 + { + public TestClassA1320() + { + } + } + [Export] + public class TestClassA1321 + { + public TestClassA1321() + { + } + } + [Export] + public class TestClassA1322 + { + public TestClassA1322() + { + } + } + [Export] + public class TestClassA1323 + { + public TestClassA1323() + { + } + } + [Export] + public class TestClassA1324 + { + public TestClassA1324() + { + } + } + [Export] + public class TestClassA1325 + { + public TestClassA1325() + { + } + } + [Export] + public class TestClassA1326 + { + public TestClassA1326() + { + } + } + [Export] + public class TestClassA1327 + { + public TestClassA1327() + { + } + } + [Export] + public class TestClassA1328 + { + public TestClassA1328() + { + } + } + [Export] + public class TestClassA1329 + { + public TestClassA1329() + { + } + } + [Export] + public class TestClassA1330 + { + public TestClassA1330() + { + } + } + [Export] + public class TestClassA1331 + { + public TestClassA1331() + { + } + } + [Export] + public class TestClassA1332 + { + public TestClassA1332() + { + } + } + [Export] + public class TestClassA1333 + { + public TestClassA1333() + { + } + } + [Export] + public class TestClassA1334 + { + public TestClassA1334() + { + } + } + [Export] + public class TestClassA1335 + { + public TestClassA1335() + { + } + } + [Export] + public class TestClassA1336 + { + public TestClassA1336() + { + } + } + [Export] + public class TestClassA1337 + { + public TestClassA1337() + { + } + } + [Export] + public class TestClassA1338 + { + public TestClassA1338() + { + } + } + [Export] + public class TestClassA1339 + { + public TestClassA1339() + { + } + } + [Export] + public class TestClassA1340 + { + public TestClassA1340() + { + } + } + [Export] + public class TestClassA1341 + { + public TestClassA1341() + { + } + } + [Export] + public class TestClassA1342 + { + public TestClassA1342() + { + } + } + [Export] + public class TestClassA1343 + { + public TestClassA1343() + { + } + } + [Export] + public class TestClassA1344 + { + public TestClassA1344() + { + } + } + [Export] + public class TestClassA1345 + { + public TestClassA1345() + { + } + } + [Export] + public class TestClassA1346 + { + public TestClassA1346() + { + } + } + [Export] + public class TestClassA1347 + { + public TestClassA1347() + { + } + } + [Export] + public class TestClassA1348 + { + public TestClassA1348() + { + } + } + [Export] + public class TestClassA1349 + { + public TestClassA1349() + { + } + } + [Export] + public class TestClassA1350 + { + public TestClassA1350() + { + } + } + [Export] + public class TestClassA1351 + { + public TestClassA1351() + { + } + } + [Export] + public class TestClassA1352 + { + public TestClassA1352() + { + } + } + [Export] + public class TestClassA1353 + { + public TestClassA1353() + { + } + } + [Export] + public class TestClassA1354 + { + public TestClassA1354() + { + } + } + [Export] + public class TestClassA1355 + { + public TestClassA1355() + { + } + } + [Export] + public class TestClassA1356 + { + public TestClassA1356() + { + } + } + [Export] + public class TestClassA1357 + { + public TestClassA1357() + { + } + } + [Export] + public class TestClassA1358 + { + public TestClassA1358() + { + } + } + [Export] + public class TestClassA1359 + { + public TestClassA1359() + { + } + } + [Export] + public class TestClassA1360 + { + public TestClassA1360() + { + } + } + [Export] + public class TestClassA1361 + { + public TestClassA1361() + { + } + } + [Export] + public class TestClassB1 + { + [ImportingConstructor] + public TestClassB1(TestClassB2 testclassb2) + { + } + } + [Export] + public class TestClassB2 + { + [ImportingConstructor] + public TestClassB2(TestClassB3 testclassb3) + { + } + } + [Export] + public class TestClassB3 + { + [ImportingConstructor] + public TestClassB3(TestClassB4 testclassb4) + { + } + } + [Export] + public class TestClassB4 + { + [ImportingConstructor] + public TestClassB4(TestClassB5 testclassb5) + { + } + } + [Export] + public class TestClassB5 + { + [ImportingConstructor] + public TestClassB5(TestClassB6 testclassb6) + { + } + } + [Export] + public class TestClassB6 + { + [ImportingConstructor] + public TestClassB6(TestClassB7 testclassb7) + { + } + } + [Export] + public class TestClassB7 + { + [ImportingConstructor] + public TestClassB7(TestClassB8 testclassb8) + { + } + } + [Export] + public class TestClassB8 + { + [ImportingConstructor] + public TestClassB8(TestClassB9 testclassb9) + { + } + } + [Export] + public class TestClassB9 + { + [ImportingConstructor] + public TestClassB9(TestClassB10 testclassb10) + { + } + } + [Export] + public class TestClassB10 + { + public TestClassB10() + { + } + } + [Export] + public class TestClassC1 + { + [ImportingConstructor] + public TestClassC1(TestClassC2 testclassc2, TestClassC3 testclassc3) + { + } + } + [Export] + public class TestClassC2 + { + [ImportingConstructor] + public TestClassC2(TestClassC4 testclassc4, TestClassC5 testclassc5) + { + } + } + [Export] + public class TestClassC3 + { + [ImportingConstructor] + public TestClassC3(TestClassC6 testclassc6, TestClassC7 testclassc7) + { + } + } + [Export] + public class TestClassC4 + { + [ImportingConstructor] + public TestClassC4(TestClassC8 testclassc8, TestClassC9 testclassc9) + { + } + } + [Export] + public class TestClassC5 + { + [ImportingConstructor] + public TestClassC5(TestClassC10 testclassc10, TestClassC11 testclassc11) + { + } + } + [Export] + public class TestClassC6 + { + [ImportingConstructor] + public TestClassC6(TestClassC12 testclassc12, TestClassC13 testclassc13) + { + } + } + [Export] + public class TestClassC7 + { + [ImportingConstructor] + public TestClassC7(TestClassC14 testclassc14, TestClassC15 testclassc15) + { + } + } + [Export] + public class TestClassC8 + { + [ImportingConstructor] + public TestClassC8(TestClassC16 testclassc16, TestClassC17 testclassc17) + { + } + } + [Export] + public class TestClassC9 + { + [ImportingConstructor] + public TestClassC9(TestClassC18 testclassc18, TestClassC19 testclassc19) + { + } + } + [Export] + public class TestClassC10 + { + [ImportingConstructor] + public TestClassC10(TestClassC20 testclassc20, TestClassC21 testclassc21) + { + } + } + [Export] + public class TestClassC11 + { + [ImportingConstructor] + public TestClassC11(TestClassC22 testclassc22, TestClassC23 testclassc23) + { + } + } + [Export] + public class TestClassC12 + { + [ImportingConstructor] + public TestClassC12(TestClassC24 testclassc24, TestClassC25 testclassc25) + { + } + } + [Export] + public class TestClassC13 + { + [ImportingConstructor] + public TestClassC13(TestClassC26 testclassc26, TestClassC27 testclassc27) + { + } + } + [Export] + public class TestClassC14 + { + [ImportingConstructor] + public TestClassC14(TestClassC28 testclassc28, TestClassC29 testclassc29) + { + } + } + [Export] + public class TestClassC15 + { + [ImportingConstructor] + public TestClassC15(TestClassC30 testclassc30, TestClassC31 testclassc31) + { + } + } + [Export] + public class TestClassC16 + { + [ImportingConstructor] + public TestClassC16(TestClassC32 testclassc32, TestClassC33 testclassc33) + { + } + } + [Export] + public class TestClassC17 + { + [ImportingConstructor] + public TestClassC17(TestClassC34 testclassc34, TestClassC35 testclassc35) + { + } + } + [Export] + public class TestClassC18 + { + [ImportingConstructor] + public TestClassC18(TestClassC36 testclassc36, TestClassC37 testclassc37) + { + } + } + [Export] + public class TestClassC19 + { + [ImportingConstructor] + public TestClassC19(TestClassC38 testclassc38, TestClassC39 testclassc39) + { + } + } + [Export] + public class TestClassC20 + { + [ImportingConstructor] + public TestClassC20(TestClassC40 testclassc40, TestClassC41 testclassc41) + { + } + } + [Export] + public class TestClassC21 + { + [ImportingConstructor] + public TestClassC21(TestClassC42 testclassc42, TestClassC43 testclassc43) + { + } + } + [Export] + public class TestClassC22 + { + [ImportingConstructor] + public TestClassC22(TestClassC44 testclassc44, TestClassC45 testclassc45) + { + } + } + [Export] + public class TestClassC23 + { + [ImportingConstructor] + public TestClassC23(TestClassC46 testclassc46, TestClassC47 testclassc47) + { + } + } + [Export] + public class TestClassC24 + { + [ImportingConstructor] + public TestClassC24(TestClassC48 testclassc48, TestClassC49 testclassc49) + { + } + } + [Export] + public class TestClassC25 + { + [ImportingConstructor] + public TestClassC25(TestClassC50 testclassc50, TestClassC51 testclassc51) + { + } + } + [Export] + public class TestClassC26 + { + [ImportingConstructor] + public TestClassC26(TestClassC52 testclassc52, TestClassC53 testclassc53) + { + } + } + [Export] + public class TestClassC27 + { + [ImportingConstructor] + public TestClassC27(TestClassC54 testclassc54, TestClassC55 testclassc55) + { + } + } + [Export] + public class TestClassC28 + { + [ImportingConstructor] + public TestClassC28(TestClassC56 testclassc56, TestClassC57 testclassc57) + { + } + } + [Export] + public class TestClassC29 + { + [ImportingConstructor] + public TestClassC29(TestClassC58 testclassc58, TestClassC59 testclassc59) + { + } + } + [Export] + public class TestClassC30 + { + [ImportingConstructor] + public TestClassC30(TestClassC60 testclassc60, TestClassC61 testclassc61) + { + } + } + [Export] + public class TestClassC31 + { + [ImportingConstructor] + public TestClassC31(TestClassC62 testclassc62, TestClassC63 testclassc63) + { + } + } + [Export] + public class TestClassC32 + { + [ImportingConstructor] + public TestClassC32(TestClassC64 testclassc64, TestClassC65 testclassc65) + { + } + } + [Export] + public class TestClassC33 + { + [ImportingConstructor] + public TestClassC33(TestClassC66 testclassc66, TestClassC67 testclassc67) + { + } + } + [Export] + public class TestClassC34 + { + [ImportingConstructor] + public TestClassC34(TestClassC68 testclassc68, TestClassC69 testclassc69) + { + } + } + [Export] + public class TestClassC35 + { + [ImportingConstructor] + public TestClassC35(TestClassC70 testclassc70, TestClassC71 testclassc71) + { + } + } + [Export] + public class TestClassC36 + { + [ImportingConstructor] + public TestClassC36(TestClassC72 testclassc72, TestClassC73 testclassc73) + { + } + } + [Export] + public class TestClassC37 + { + [ImportingConstructor] + public TestClassC37(TestClassC74 testclassc74, TestClassC75 testclassc75) + { + } + } + [Export] + public class TestClassC38 + { + [ImportingConstructor] + public TestClassC38(TestClassC76 testclassc76, TestClassC77 testclassc77) + { + } + } + [Export] + public class TestClassC39 + { + [ImportingConstructor] + public TestClassC39(TestClassC78 testclassc78, TestClassC79 testclassc79) + { + } + } + [Export] + public class TestClassC40 + { + [ImportingConstructor] + public TestClassC40(TestClassC80 testclassc80, TestClassC81 testclassc81) + { + } + } + [Export] + public class TestClassC41 + { + [ImportingConstructor] + public TestClassC41(TestClassC82 testclassc82, TestClassC83 testclassc83) + { + } + } + [Export] + public class TestClassC42 + { + [ImportingConstructor] + public TestClassC42(TestClassC84 testclassc84, TestClassC85 testclassc85) + { + } + } + [Export] + public class TestClassC43 + { + [ImportingConstructor] + public TestClassC43(TestClassC86 testclassc86, TestClassC87 testclassc87) + { + } + } + [Export] + public class TestClassC44 + { + [ImportingConstructor] + public TestClassC44(TestClassC88 testclassc88, TestClassC89 testclassc89) + { + } + } + [Export] + public class TestClassC45 + { + [ImportingConstructor] + public TestClassC45(TestClassC90 testclassc90, TestClassC91 testclassc91) + { + } + } + [Export] + public class TestClassC46 + { + [ImportingConstructor] + public TestClassC46(TestClassC92 testclassc92, TestClassC93 testclassc93) + { + } + } + [Export] + public class TestClassC47 + { + [ImportingConstructor] + public TestClassC47(TestClassC94 testclassc94, TestClassC95 testclassc95) + { + } + } + [Export] + public class TestClassC48 + { + [ImportingConstructor] + public TestClassC48(TestClassC96 testclassc96, TestClassC97 testclassc97) + { + } + } + [Export] + public class TestClassC49 + { + [ImportingConstructor] + public TestClassC49(TestClassC98 testclassc98, TestClassC99 testclassc99) + { + } + } + [Export] + public class TestClassC50 + { + [ImportingConstructor] + public TestClassC50(TestClassC100 testclassc100, TestClassC101 testclassc101) + { + } + } + [Export] + public class TestClassC51 + { + [ImportingConstructor] + public TestClassC51(TestClassC102 testclassc102, TestClassC103 testclassc103) + { + } + } + [Export] + public class TestClassC52 + { + [ImportingConstructor] + public TestClassC52(TestClassC104 testclassc104, TestClassC105 testclassc105) + { + } + } + [Export] + public class TestClassC53 + { + [ImportingConstructor] + public TestClassC53(TestClassC106 testclassc106, TestClassC107 testclassc107) + { + } + } + [Export] + public class TestClassC54 + { + [ImportingConstructor] + public TestClassC54(TestClassC108 testclassc108, TestClassC109 testclassc109) + { + } + } + [Export] + public class TestClassC55 + { + [ImportingConstructor] + public TestClassC55(TestClassC110 testclassc110, TestClassC111 testclassc111) + { + } + } + [Export] + public class TestClassC56 + { + [ImportingConstructor] + public TestClassC56(TestClassC112 testclassc112, TestClassC113 testclassc113) + { + } + } + [Export] + public class TestClassC57 + { + [ImportingConstructor] + public TestClassC57(TestClassC114 testclassc114, TestClassC115 testclassc115) + { + } + } + [Export] + public class TestClassC58 + { + [ImportingConstructor] + public TestClassC58(TestClassC116 testclassc116, TestClassC117 testclassc117) + { + } + } + [Export] + public class TestClassC59 + { + [ImportingConstructor] + public TestClassC59(TestClassC118 testclassc118, TestClassC119 testclassc119) + { + } + } + [Export] + public class TestClassC60 + { + [ImportingConstructor] + public TestClassC60(TestClassC120 testclassc120, TestClassC121 testclassc121) + { + } + } + [Export] + public class TestClassC61 + { + [ImportingConstructor] + public TestClassC61(TestClassC122 testclassc122, TestClassC123 testclassc123) + { + } + } + [Export] + public class TestClassC62 + { + [ImportingConstructor] + public TestClassC62(TestClassC124 testclassc124, TestClassC125 testclassc125) + { + } + } + [Export] + public class TestClassC63 + { + [ImportingConstructor] + public TestClassC63(TestClassC126 testclassc126, TestClassC127 testclassc127) + { + } + } + [Export] + public class TestClassC64 + { + [ImportingConstructor] + public TestClassC64(TestClassC128 testclassc128, TestClassC129 testclassc129) + { + } + } + [Export] + public class TestClassC65 + { + [ImportingConstructor] + public TestClassC65(TestClassC130 testclassc130, TestClassC131 testclassc131) + { + } + } + [Export] + public class TestClassC66 + { + [ImportingConstructor] + public TestClassC66(TestClassC132 testclassc132, TestClassC133 testclassc133) + { + } + } + [Export] + public class TestClassC67 + { + [ImportingConstructor] + public TestClassC67(TestClassC134 testclassc134, TestClassC135 testclassc135) + { + } + } + [Export] + public class TestClassC68 + { + [ImportingConstructor] + public TestClassC68(TestClassC136 testclassc136, TestClassC137 testclassc137) + { + } + } + [Export] + public class TestClassC69 + { + [ImportingConstructor] + public TestClassC69(TestClassC138 testclassc138, TestClassC139 testclassc139) + { + } + } + [Export] + public class TestClassC70 + { + [ImportingConstructor] + public TestClassC70(TestClassC140 testclassc140, TestClassC141 testclassc141) + { + } + } + [Export] + public class TestClassC71 + { + [ImportingConstructor] + public TestClassC71(TestClassC142 testclassc142, TestClassC143 testclassc143) + { + } + } + [Export] + public class TestClassC72 + { + [ImportingConstructor] + public TestClassC72(TestClassC144 testclassc144, TestClassC145 testclassc145) + { + } + } + [Export] + public class TestClassC73 + { + [ImportingConstructor] + public TestClassC73(TestClassC146 testclassc146, TestClassC147 testclassc147) + { + } + } + [Export] + public class TestClassC74 + { + [ImportingConstructor] + public TestClassC74(TestClassC148 testclassc148, TestClassC149 testclassc149) + { + } + } + [Export] + public class TestClassC75 + { + [ImportingConstructor] + public TestClassC75(TestClassC150 testclassc150, TestClassC151 testclassc151) + { + } + } + [Export] + public class TestClassC76 + { + [ImportingConstructor] + public TestClassC76(TestClassC152 testclassc152, TestClassC153 testclassc153) + { + } + } + [Export] + public class TestClassC77 + { + [ImportingConstructor] + public TestClassC77(TestClassC154 testclassc154, TestClassC155 testclassc155) + { + } + } + [Export] + public class TestClassC78 + { + [ImportingConstructor] + public TestClassC78(TestClassC156 testclassc156, TestClassC157 testclassc157) + { + } + } + [Export] + public class TestClassC79 + { + [ImportingConstructor] + public TestClassC79(TestClassC158 testclassc158, TestClassC159 testclassc159) + { + } + } + [Export] + public class TestClassC80 + { + [ImportingConstructor] + public TestClassC80(TestClassC160 testclassc160, TestClassC161 testclassc161) + { + } + } + [Export] + public class TestClassC81 + { + [ImportingConstructor] + public TestClassC81(TestClassC162 testclassc162, TestClassC163 testclassc163) + { + } + } + [Export] + public class TestClassC82 + { + [ImportingConstructor] + public TestClassC82(TestClassC164 testclassc164, TestClassC165 testclassc165) + { + } + } + [Export] + public class TestClassC83 + { + [ImportingConstructor] + public TestClassC83(TestClassC166 testclassc166, TestClassC167 testclassc167) + { + } + } + [Export] + public class TestClassC84 + { + [ImportingConstructor] + public TestClassC84(TestClassC168 testclassc168, TestClassC169 testclassc169) + { + } + } + [Export] + public class TestClassC85 + { + [ImportingConstructor] + public TestClassC85(TestClassC170 testclassc170, TestClassC171 testclassc171) + { + } + } + [Export] + public class TestClassC86 + { + [ImportingConstructor] + public TestClassC86(TestClassC172 testclassc172, TestClassC173 testclassc173) + { + } + } + [Export] + public class TestClassC87 + { + [ImportingConstructor] + public TestClassC87(TestClassC174 testclassc174, TestClassC175 testclassc175) + { + } + } + [Export] + public class TestClassC88 + { + [ImportingConstructor] + public TestClassC88(TestClassC176 testclassc176, TestClassC177 testclassc177) + { + } + } + [Export] + public class TestClassC89 + { + [ImportingConstructor] + public TestClassC89(TestClassC178 testclassc178, TestClassC179 testclassc179) + { + } + } + [Export] + public class TestClassC90 + { + [ImportingConstructor] + public TestClassC90(TestClassC180 testclassc180, TestClassC181 testclassc181) + { + } + } + [Export] + public class TestClassC91 + { + [ImportingConstructor] + public TestClassC91(TestClassC182 testclassc182, TestClassC183 testclassc183) + { + } + } + [Export] + public class TestClassC92 + { + [ImportingConstructor] + public TestClassC92(TestClassC184 testclassc184, TestClassC185 testclassc185) + { + } + } + [Export] + public class TestClassC93 + { + [ImportingConstructor] + public TestClassC93(TestClassC186 testclassc186, TestClassC187 testclassc187) + { + } + } + [Export] + public class TestClassC94 + { + [ImportingConstructor] + public TestClassC94(TestClassC188 testclassc188, TestClassC189 testclassc189) + { + } + } + [Export] + public class TestClassC95 + { + [ImportingConstructor] + public TestClassC95(TestClassC190 testclassc190, TestClassC191 testclassc191) + { + } + } + [Export] + public class TestClassC96 + { + [ImportingConstructor] + public TestClassC96(TestClassC192 testclassc192, TestClassC193 testclassc193) + { + } + } + [Export] + public class TestClassC97 + { + [ImportingConstructor] + public TestClassC97(TestClassC194 testclassc194, TestClassC195 testclassc195) + { + } + } + [Export] + public class TestClassC98 + { + [ImportingConstructor] + public TestClassC98(TestClassC196 testclassc196, TestClassC197 testclassc197) + { + } + } + [Export] + public class TestClassC99 + { + [ImportingConstructor] + public TestClassC99(TestClassC198 testclassc198, TestClassC199 testclassc199) + { + } + } + [Export] + public class TestClassC100 + { + [ImportingConstructor] + public TestClassC100(TestClassC200 testclassc200, TestClassC201 testclassc201) + { + } + } + [Export] + public class TestClassC101 + { + [ImportingConstructor] + public TestClassC101(TestClassC202 testclassc202, TestClassC203 testclassc203) + { + } + } + [Export] + public class TestClassC102 + { + [ImportingConstructor] + public TestClassC102(TestClassC204 testclassc204, TestClassC205 testclassc205) + { + } + } + [Export] + public class TestClassC103 + { + [ImportingConstructor] + public TestClassC103(TestClassC206 testclassc206, TestClassC207 testclassc207) + { + } + } + [Export] + public class TestClassC104 + { + [ImportingConstructor] + public TestClassC104(TestClassC208 testclassc208, TestClassC209 testclassc209) + { + } + } + [Export] + public class TestClassC105 + { + [ImportingConstructor] + public TestClassC105(TestClassC210 testclassc210, TestClassC211 testclassc211) + { + } + } + [Export] + public class TestClassC106 + { + [ImportingConstructor] + public TestClassC106(TestClassC212 testclassc212, TestClassC213 testclassc213) + { + } + } + [Export] + public class TestClassC107 + { + [ImportingConstructor] + public TestClassC107(TestClassC214 testclassc214, TestClassC215 testclassc215) + { + } + } + [Export] + public class TestClassC108 + { + [ImportingConstructor] + public TestClassC108(TestClassC216 testclassc216, TestClassC217 testclassc217) + { + } + } + [Export] + public class TestClassC109 + { + [ImportingConstructor] + public TestClassC109(TestClassC218 testclassc218, TestClassC219 testclassc219) + { + } + } + [Export] + public class TestClassC110 + { + [ImportingConstructor] + public TestClassC110(TestClassC220 testclassc220, TestClassC221 testclassc221) + { + } + } + [Export] + public class TestClassC111 + { + [ImportingConstructor] + public TestClassC111(TestClassC222 testclassc222, TestClassC223 testclassc223) + { + } + } + [Export] + public class TestClassC112 + { + [ImportingConstructor] + public TestClassC112(TestClassC224 testclassc224, TestClassC225 testclassc225) + { + } + } + [Export] + public class TestClassC113 + { + [ImportingConstructor] + public TestClassC113(TestClassC226 testclassc226, TestClassC227 testclassc227) + { + } + } + [Export] + public class TestClassC114 + { + [ImportingConstructor] + public TestClassC114(TestClassC228 testclassc228, TestClassC229 testclassc229) + { + } + } + [Export] + public class TestClassC115 + { + [ImportingConstructor] + public TestClassC115(TestClassC230 testclassc230, TestClassC231 testclassc231) + { + } + } + [Export] + public class TestClassC116 + { + [ImportingConstructor] + public TestClassC116(TestClassC232 testclassc232, TestClassC233 testclassc233) + { + } + } + [Export] + public class TestClassC117 + { + [ImportingConstructor] + public TestClassC117(TestClassC234 testclassc234, TestClassC235 testclassc235) + { + } + } + [Export] + public class TestClassC118 + { + [ImportingConstructor] + public TestClassC118(TestClassC236 testclassc236, TestClassC237 testclassc237) + { + } + } + [Export] + public class TestClassC119 + { + [ImportingConstructor] + public TestClassC119(TestClassC238 testclassc238, TestClassC239 testclassc239) + { + } + } + [Export] + public class TestClassC120 + { + [ImportingConstructor] + public TestClassC120(TestClassC240 testclassc240, TestClassC241 testclassc241) + { + } + } + [Export] + public class TestClassC121 + { + [ImportingConstructor] + public TestClassC121(TestClassC242 testclassc242, TestClassC243 testclassc243) + { + } + } + [Export] + public class TestClassC122 + { + [ImportingConstructor] + public TestClassC122(TestClassC244 testclassc244, TestClassC245 testclassc245) + { + } + } + [Export] + public class TestClassC123 + { + [ImportingConstructor] + public TestClassC123(TestClassC246 testclassc246, TestClassC247 testclassc247) + { + } + } + [Export] + public class TestClassC124 + { + [ImportingConstructor] + public TestClassC124(TestClassC248 testclassc248, TestClassC249 testclassc249) + { + } + } + [Export] + public class TestClassC125 + { + [ImportingConstructor] + public TestClassC125(TestClassC250 testclassc250, TestClassC251 testclassc251) + { + } + } + [Export] + public class TestClassC126 + { + [ImportingConstructor] + public TestClassC126(TestClassC252 testclassc252, TestClassC253 testclassc253) + { + } + } + [Export] + public class TestClassC127 + { + [ImportingConstructor] + public TestClassC127(TestClassC254 testclassc254, TestClassC255 testclassc255) + { + } + } + [Export] + public class TestClassC128 + { + [ImportingConstructor] + public TestClassC128(TestClassC256 testclassc256, TestClassC257 testclassc257) + { + } + } + [Export] + public class TestClassC129 + { + [ImportingConstructor] + public TestClassC129(TestClassC258 testclassc258, TestClassC259 testclassc259) + { + } + } + [Export] + public class TestClassC130 + { + [ImportingConstructor] + public TestClassC130(TestClassC260 testclassc260, TestClassC261 testclassc261) + { + } + } + [Export] + public class TestClassC131 + { + [ImportingConstructor] + public TestClassC131(TestClassC262 testclassc262, TestClassC263 testclassc263) + { + } + } + [Export] + public class TestClassC132 + { + [ImportingConstructor] + public TestClassC132(TestClassC264 testclassc264, TestClassC265 testclassc265) + { + } + } + [Export] + public class TestClassC133 + { + [ImportingConstructor] + public TestClassC133(TestClassC266 testclassc266, TestClassC267 testclassc267) + { + } + } + [Export] + public class TestClassC134 + { + [ImportingConstructor] + public TestClassC134(TestClassC268 testclassc268, TestClassC269 testclassc269) + { + } + } + [Export] + public class TestClassC135 + { + [ImportingConstructor] + public TestClassC135(TestClassC270 testclassc270, TestClassC271 testclassc271) + { + } + } + [Export] + public class TestClassC136 + { + [ImportingConstructor] + public TestClassC136(TestClassC272 testclassc272, TestClassC273 testclassc273) + { + } + } + [Export] + public class TestClassC137 + { + [ImportingConstructor] + public TestClassC137(TestClassC274 testclassc274, TestClassC275 testclassc275) + { + } + } + [Export] + public class TestClassC138 + { + [ImportingConstructor] + public TestClassC138(TestClassC276 testclassc276, TestClassC277 testclassc277) + { + } + } + [Export] + public class TestClassC139 + { + [ImportingConstructor] + public TestClassC139(TestClassC278 testclassc278, TestClassC279 testclassc279) + { + } + } + [Export] + public class TestClassC140 + { + [ImportingConstructor] + public TestClassC140(TestClassC280 testclassc280, TestClassC281 testclassc281) + { + } + } + [Export] + public class TestClassC141 + { + [ImportingConstructor] + public TestClassC141(TestClassC282 testclassc282, TestClassC283 testclassc283) + { + } + } + [Export] + public class TestClassC142 + { + [ImportingConstructor] + public TestClassC142(TestClassC284 testclassc284, TestClassC285 testclassc285) + { + } + } + [Export] + public class TestClassC143 + { + [ImportingConstructor] + public TestClassC143(TestClassC286 testclassc286, TestClassC287 testclassc287) + { + } + } + [Export] + public class TestClassC144 + { + [ImportingConstructor] + public TestClassC144(TestClassC288 testclassc288, TestClassC289 testclassc289) + { + } + } + [Export] + public class TestClassC145 + { + [ImportingConstructor] + public TestClassC145(TestClassC290 testclassc290, TestClassC291 testclassc291) + { + } + } + [Export] + public class TestClassC146 + { + [ImportingConstructor] + public TestClassC146(TestClassC292 testclassc292, TestClassC293 testclassc293) + { + } + } + [Export] + public class TestClassC147 + { + [ImportingConstructor] + public TestClassC147(TestClassC294 testclassc294, TestClassC295 testclassc295) + { + } + } + [Export] + public class TestClassC148 + { + [ImportingConstructor] + public TestClassC148(TestClassC296 testclassc296, TestClassC297 testclassc297) + { + } + } + [Export] + public class TestClassC149 + { + [ImportingConstructor] + public TestClassC149(TestClassC298 testclassc298, TestClassC299 testclassc299) + { + } + } + [Export] + public class TestClassC150 + { + [ImportingConstructor] + public TestClassC150(TestClassC300 testclassc300, TestClassC301 testclassc301) + { + } + } + [Export] + public class TestClassC151 + { + [ImportingConstructor] + public TestClassC151(TestClassC302 testclassc302, TestClassC303 testclassc303) + { + } + } + [Export] + public class TestClassC152 + { + [ImportingConstructor] + public TestClassC152(TestClassC304 testclassc304, TestClassC305 testclassc305) + { + } + } + [Export] + public class TestClassC153 + { + [ImportingConstructor] + public TestClassC153(TestClassC306 testclassc306, TestClassC307 testclassc307) + { + } + } + [Export] + public class TestClassC154 + { + [ImportingConstructor] + public TestClassC154(TestClassC308 testclassc308, TestClassC309 testclassc309) + { + } + } + [Export] + public class TestClassC155 + { + [ImportingConstructor] + public TestClassC155(TestClassC310 testclassc310, TestClassC311 testclassc311) + { + } + } + [Export] + public class TestClassC156 + { + [ImportingConstructor] + public TestClassC156(TestClassC312 testclassc312, TestClassC313 testclassc313) + { + } + } + [Export] + public class TestClassC157 + { + [ImportingConstructor] + public TestClassC157(TestClassC314 testclassc314, TestClassC315 testclassc315) + { + } + } + [Export] + public class TestClassC158 + { + [ImportingConstructor] + public TestClassC158(TestClassC316 testclassc316, TestClassC317 testclassc317) + { + } + } + [Export] + public class TestClassC159 + { + [ImportingConstructor] + public TestClassC159(TestClassC318 testclassc318, TestClassC319 testclassc319) + { + } + } + [Export] + public class TestClassC160 + { + [ImportingConstructor] + public TestClassC160(TestClassC320 testclassc320, TestClassC321 testclassc321) + { + } + } + [Export] + public class TestClassC161 + { + [ImportingConstructor] + public TestClassC161(TestClassC322 testclassc322, TestClassC323 testclassc323) + { + } + } + [Export] + public class TestClassC162 + { + [ImportingConstructor] + public TestClassC162(TestClassC324 testclassc324, TestClassC325 testclassc325) + { + } + } + [Export] + public class TestClassC163 + { + [ImportingConstructor] + public TestClassC163(TestClassC326 testclassc326, TestClassC327 testclassc327) + { + } + } + [Export] + public class TestClassC164 + { + [ImportingConstructor] + public TestClassC164(TestClassC328 testclassc328, TestClassC329 testclassc329) + { + } + } + [Export] + public class TestClassC165 + { + [ImportingConstructor] + public TestClassC165(TestClassC330 testclassc330, TestClassC331 testclassc331) + { + } + } + [Export] + public class TestClassC166 + { + [ImportingConstructor] + public TestClassC166(TestClassC332 testclassc332, TestClassC333 testclassc333) + { + } + } + [Export] + public class TestClassC167 + { + [ImportingConstructor] + public TestClassC167(TestClassC334 testclassc334, TestClassC335 testclassc335) + { + } + } + [Export] + public class TestClassC168 + { + [ImportingConstructor] + public TestClassC168(TestClassC336 testclassc336, TestClassC337 testclassc337) + { + } + } + [Export] + public class TestClassC169 + { + [ImportingConstructor] + public TestClassC169(TestClassC338 testclassc338, TestClassC339 testclassc339) + { + } + } + [Export] + public class TestClassC170 + { + [ImportingConstructor] + public TestClassC170(TestClassC340 testclassc340, TestClassC341 testclassc341) + { + } + } + [Export] + public class TestClassC171 + { + [ImportingConstructor] + public TestClassC171(TestClassC342 testclassc342, TestClassC343 testclassc343) + { + } + } + [Export] + public class TestClassC172 + { + [ImportingConstructor] + public TestClassC172(TestClassC344 testclassc344, TestClassC345 testclassc345) + { + } + } + [Export] + public class TestClassC173 + { + [ImportingConstructor] + public TestClassC173(TestClassC346 testclassc346, TestClassC347 testclassc347) + { + } + } + [Export] + public class TestClassC174 + { + [ImportingConstructor] + public TestClassC174(TestClassC348 testclassc348, TestClassC349 testclassc349) + { + } + } + [Export] + public class TestClassC175 + { + [ImportingConstructor] + public TestClassC175(TestClassC350 testclassc350, TestClassC351 testclassc351) + { + } + } + [Export] + public class TestClassC176 + { + [ImportingConstructor] + public TestClassC176(TestClassC352 testclassc352, TestClassC353 testclassc353) + { + } + } + [Export] + public class TestClassC177 + { + [ImportingConstructor] + public TestClassC177(TestClassC354 testclassc354, TestClassC355 testclassc355) + { + } + } + [Export] + public class TestClassC178 + { + [ImportingConstructor] + public TestClassC178(TestClassC356 testclassc356, TestClassC357 testclassc357) + { + } + } + [Export] + public class TestClassC179 + { + [ImportingConstructor] + public TestClassC179(TestClassC358 testclassc358, TestClassC359 testclassc359) + { + } + } + [Export] + public class TestClassC180 + { + [ImportingConstructor] + public TestClassC180(TestClassC360 testclassc360, TestClassC361 testclassc361) + { + } + } + [Export] + public class TestClassC181 + { + [ImportingConstructor] + public TestClassC181(TestClassC362 testclassc362, TestClassC363 testclassc363) + { + } + } + [Export] + public class TestClassC182 + { + [ImportingConstructor] + public TestClassC182(TestClassC364 testclassc364, TestClassC365 testclassc365) + { + } + } + [Export] + public class TestClassC183 + { + [ImportingConstructor] + public TestClassC183(TestClassC366 testclassc366, TestClassC367 testclassc367) + { + } + } + [Export] + public class TestClassC184 + { + [ImportingConstructor] + public TestClassC184(TestClassC368 testclassc368, TestClassC369 testclassc369) + { + } + } + [Export] + public class TestClassC185 + { + [ImportingConstructor] + public TestClassC185(TestClassC370 testclassc370, TestClassC371 testclassc371) + { + } + } + [Export] + public class TestClassC186 + { + [ImportingConstructor] + public TestClassC186(TestClassC372 testclassc372, TestClassC373 testclassc373) + { + } + } + [Export] + public class TestClassC187 + { + [ImportingConstructor] + public TestClassC187(TestClassC374 testclassc374, TestClassC375 testclassc375) + { + } + } + [Export] + public class TestClassC188 + { + [ImportingConstructor] + public TestClassC188(TestClassC376 testclassc376, TestClassC377 testclassc377) + { + } + } + [Export] + public class TestClassC189 + { + [ImportingConstructor] + public TestClassC189(TestClassC378 testclassc378, TestClassC379 testclassc379) + { + } + } + [Export] + public class TestClassC190 + { + [ImportingConstructor] + public TestClassC190(TestClassC380 testclassc380, TestClassC381 testclassc381) + { + } + } + [Export] + public class TestClassC191 + { + [ImportingConstructor] + public TestClassC191(TestClassC382 testclassc382, TestClassC383 testclassc383) + { + } + } + [Export] + public class TestClassC192 + { + [ImportingConstructor] + public TestClassC192(TestClassC384 testclassc384, TestClassC385 testclassc385) + { + } + } + [Export] + public class TestClassC193 + { + [ImportingConstructor] + public TestClassC193(TestClassC386 testclassc386, TestClassC387 testclassc387) + { + } + } + [Export] + public class TestClassC194 + { + [ImportingConstructor] + public TestClassC194(TestClassC388 testclassc388, TestClassC389 testclassc389) + { + } + } + [Export] + public class TestClassC195 + { + [ImportingConstructor] + public TestClassC195(TestClassC390 testclassc390, TestClassC391 testclassc391) + { + } + } + [Export] + public class TestClassC196 + { + [ImportingConstructor] + public TestClassC196(TestClassC392 testclassc392, TestClassC393 testclassc393) + { + } + } + [Export] + public class TestClassC197 + { + [ImportingConstructor] + public TestClassC197(TestClassC394 testclassc394, TestClassC395 testclassc395) + { + } + } + [Export] + public class TestClassC198 + { + [ImportingConstructor] + public TestClassC198(TestClassC396 testclassc396, TestClassC397 testclassc397) + { + } + } + [Export] + public class TestClassC199 + { + [ImportingConstructor] + public TestClassC199(TestClassC398 testclassc398, TestClassC399 testclassc399) + { + } + } + [Export] + public class TestClassC200 + { + [ImportingConstructor] + public TestClassC200(TestClassC400 testclassc400, TestClassC401 testclassc401) + { + } + } + [Export] + public class TestClassC201 + { + [ImportingConstructor] + public TestClassC201(TestClassC402 testclassc402, TestClassC403 testclassc403) + { + } + } + [Export] + public class TestClassC202 + { + [ImportingConstructor] + public TestClassC202(TestClassC404 testclassc404, TestClassC405 testclassc405) + { + } + } + [Export] + public class TestClassC203 + { + [ImportingConstructor] + public TestClassC203(TestClassC406 testclassc406, TestClassC407 testclassc407) + { + } + } + [Export] + public class TestClassC204 + { + [ImportingConstructor] + public TestClassC204(TestClassC408 testclassc408, TestClassC409 testclassc409) + { + } + } + [Export] + public class TestClassC205 + { + [ImportingConstructor] + public TestClassC205(TestClassC410 testclassc410, TestClassC411 testclassc411) + { + } + } + [Export] + public class TestClassC206 + { + [ImportingConstructor] + public TestClassC206(TestClassC412 testclassc412, TestClassC413 testclassc413) + { + } + } + [Export] + public class TestClassC207 + { + [ImportingConstructor] + public TestClassC207(TestClassC414 testclassc414, TestClassC415 testclassc415) + { + } + } + [Export] + public class TestClassC208 + { + [ImportingConstructor] + public TestClassC208(TestClassC416 testclassc416, TestClassC417 testclassc417) + { + } + } + [Export] + public class TestClassC209 + { + [ImportingConstructor] + public TestClassC209(TestClassC418 testclassc418, TestClassC419 testclassc419) + { + } + } + [Export] + public class TestClassC210 + { + [ImportingConstructor] + public TestClassC210(TestClassC420 testclassc420, TestClassC421 testclassc421) + { + } + } + [Export] + public class TestClassC211 + { + [ImportingConstructor] + public TestClassC211(TestClassC422 testclassc422, TestClassC423 testclassc423) + { + } + } + [Export] + public class TestClassC212 + { + [ImportingConstructor] + public TestClassC212(TestClassC424 testclassc424, TestClassC425 testclassc425) + { + } + } + [Export] + public class TestClassC213 + { + [ImportingConstructor] + public TestClassC213(TestClassC426 testclassc426, TestClassC427 testclassc427) + { + } + } + [Export] + public class TestClassC214 + { + [ImportingConstructor] + public TestClassC214(TestClassC428 testclassc428, TestClassC429 testclassc429) + { + } + } + [Export] + public class TestClassC215 + { + [ImportingConstructor] + public TestClassC215(TestClassC430 testclassc430, TestClassC431 testclassc431) + { + } + } + [Export] + public class TestClassC216 + { + [ImportingConstructor] + public TestClassC216(TestClassC432 testclassc432, TestClassC433 testclassc433) + { + } + } + [Export] + public class TestClassC217 + { + [ImportingConstructor] + public TestClassC217(TestClassC434 testclassc434, TestClassC435 testclassc435) + { + } + } + [Export] + public class TestClassC218 + { + [ImportingConstructor] + public TestClassC218(TestClassC436 testclassc436, TestClassC437 testclassc437) + { + } + } + [Export] + public class TestClassC219 + { + [ImportingConstructor] + public TestClassC219(TestClassC438 testclassc438, TestClassC439 testclassc439) + { + } + } + [Export] + public class TestClassC220 + { + [ImportingConstructor] + public TestClassC220(TestClassC440 testclassc440, TestClassC441 testclassc441) + { + } + } + [Export] + public class TestClassC221 + { + [ImportingConstructor] + public TestClassC221(TestClassC442 testclassc442, TestClassC443 testclassc443) + { + } + } + [Export] + public class TestClassC222 + { + [ImportingConstructor] + public TestClassC222(TestClassC444 testclassc444, TestClassC445 testclassc445) + { + } + } + [Export] + public class TestClassC223 + { + [ImportingConstructor] + public TestClassC223(TestClassC446 testclassc446, TestClassC447 testclassc447) + { + } + } + [Export] + public class TestClassC224 + { + [ImportingConstructor] + public TestClassC224(TestClassC448 testclassc448, TestClassC449 testclassc449) + { + } + } + [Export] + public class TestClassC225 + { + [ImportingConstructor] + public TestClassC225(TestClassC450 testclassc450, TestClassC451 testclassc451) + { + } + } + [Export] + public class TestClassC226 + { + [ImportingConstructor] + public TestClassC226(TestClassC452 testclassc452, TestClassC453 testclassc453) + { + } + } + [Export] + public class TestClassC227 + { + [ImportingConstructor] + public TestClassC227(TestClassC454 testclassc454, TestClassC455 testclassc455) + { + } + } + [Export] + public class TestClassC228 + { + [ImportingConstructor] + public TestClassC228(TestClassC456 testclassc456, TestClassC457 testclassc457) + { + } + } + [Export] + public class TestClassC229 + { + [ImportingConstructor] + public TestClassC229(TestClassC458 testclassc458, TestClassC459 testclassc459) + { + } + } + [Export] + public class TestClassC230 + { + [ImportingConstructor] + public TestClassC230(TestClassC460 testclassc460, TestClassC461 testclassc461) + { + } + } + [Export] + public class TestClassC231 + { + [ImportingConstructor] + public TestClassC231(TestClassC462 testclassc462, TestClassC463 testclassc463) + { + } + } + [Export] + public class TestClassC232 + { + [ImportingConstructor] + public TestClassC232(TestClassC464 testclassc464, TestClassC465 testclassc465) + { + } + } + [Export] + public class TestClassC233 + { + [ImportingConstructor] + public TestClassC233(TestClassC466 testclassc466, TestClassC467 testclassc467) + { + } + } + [Export] + public class TestClassC234 + { + [ImportingConstructor] + public TestClassC234(TestClassC468 testclassc468, TestClassC469 testclassc469) + { + } + } + [Export] + public class TestClassC235 + { + [ImportingConstructor] + public TestClassC235(TestClassC470 testclassc470, TestClassC471 testclassc471) + { + } + } + [Export] + public class TestClassC236 + { + [ImportingConstructor] + public TestClassC236(TestClassC472 testclassc472, TestClassC473 testclassc473) + { + } + } + [Export] + public class TestClassC237 + { + [ImportingConstructor] + public TestClassC237(TestClassC474 testclassc474, TestClassC475 testclassc475) + { + } + } + [Export] + public class TestClassC238 + { + [ImportingConstructor] + public TestClassC238(TestClassC476 testclassc476, TestClassC477 testclassc477) + { + } + } + [Export] + public class TestClassC239 + { + [ImportingConstructor] + public TestClassC239(TestClassC478 testclassc478, TestClassC479 testclassc479) + { + } + } + [Export] + public class TestClassC240 + { + [ImportingConstructor] + public TestClassC240(TestClassC480 testclassc480, TestClassC481 testclassc481) + { + } + } + [Export] + public class TestClassC241 + { + [ImportingConstructor] + public TestClassC241(TestClassC482 testclassc482, TestClassC483 testclassc483) + { + } + } + [Export] + public class TestClassC242 + { + [ImportingConstructor] + public TestClassC242(TestClassC484 testclassc484, TestClassC485 testclassc485) + { + } + } + [Export] + public class TestClassC243 + { + [ImportingConstructor] + public TestClassC243(TestClassC486 testclassc486, TestClassC487 testclassc487) + { + } + } + [Export] + public class TestClassC244 + { + [ImportingConstructor] + public TestClassC244(TestClassC488 testclassc488, TestClassC489 testclassc489) + { + } + } + [Export] + public class TestClassC245 + { + [ImportingConstructor] + public TestClassC245(TestClassC490 testclassc490, TestClassC491 testclassc491) + { + } + } + [Export] + public class TestClassC246 + { + [ImportingConstructor] + public TestClassC246(TestClassC492 testclassc492, TestClassC493 testclassc493) + { + } + } + [Export] + public class TestClassC247 + { + [ImportingConstructor] + public TestClassC247(TestClassC494 testclassc494, TestClassC495 testclassc495) + { + } + } + [Export] + public class TestClassC248 + { + [ImportingConstructor] + public TestClassC248(TestClassC496 testclassc496, TestClassC497 testclassc497) + { + } + } + [Export] + public class TestClassC249 + { + [ImportingConstructor] + public TestClassC249(TestClassC498 testclassc498, TestClassC499 testclassc499) + { + } + } + [Export] + public class TestClassC250 + { + [ImportingConstructor] + public TestClassC250(TestClassC500 testclassc500, TestClassC501 testclassc501) + { + } + } + [Export] + public class TestClassC251 + { + [ImportingConstructor] + public TestClassC251(TestClassC502 testclassc502, TestClassC503 testclassc503) + { + } + } + [Export] + public class TestClassC252 + { + [ImportingConstructor] + public TestClassC252(TestClassC504 testclassc504, TestClassC505 testclassc505) + { + } + } + [Export] + public class TestClassC253 + { + [ImportingConstructor] + public TestClassC253(TestClassC506 testclassc506, TestClassC507 testclassc507) + { + } + } + [Export] + public class TestClassC254 + { + [ImportingConstructor] + public TestClassC254(TestClassC508 testclassc508, TestClassC509 testclassc509) + { + } + } + [Export] + public class TestClassC255 + { + [ImportingConstructor] + public TestClassC255(TestClassC510 testclassc510, TestClassC511 testclassc511) + { + } + } + [Export] + public class TestClassC256 + { + [ImportingConstructor] + public TestClassC256(TestClassC512 testclassc512, TestClassC513 testclassc513) + { + } + } + [Export] + public class TestClassC257 + { + [ImportingConstructor] + public TestClassC257(TestClassC514 testclassc514, TestClassC515 testclassc515) + { + } + } + [Export] + public class TestClassC258 + { + [ImportingConstructor] + public TestClassC258(TestClassC516 testclassc516, TestClassC517 testclassc517) + { + } + } + [Export] + public class TestClassC259 + { + [ImportingConstructor] + public TestClassC259(TestClassC518 testclassc518, TestClassC519 testclassc519) + { + } + } + [Export] + public class TestClassC260 + { + [ImportingConstructor] + public TestClassC260(TestClassC520 testclassc520, TestClassC521 testclassc521) + { + } + } + [Export] + public class TestClassC261 + { + [ImportingConstructor] + public TestClassC261(TestClassC522 testclassc522, TestClassC523 testclassc523) + { + } + } + [Export] + public class TestClassC262 + { + [ImportingConstructor] + public TestClassC262(TestClassC524 testclassc524, TestClassC525 testclassc525) + { + } + } + [Export] + public class TestClassC263 + { + [ImportingConstructor] + public TestClassC263(TestClassC526 testclassc526, TestClassC527 testclassc527) + { + } + } + [Export] + public class TestClassC264 + { + [ImportingConstructor] + public TestClassC264(TestClassC528 testclassc528, TestClassC529 testclassc529) + { + } + } + [Export] + public class TestClassC265 + { + [ImportingConstructor] + public TestClassC265(TestClassC530 testclassc530, TestClassC531 testclassc531) + { + } + } + [Export] + public class TestClassC266 + { + [ImportingConstructor] + public TestClassC266(TestClassC532 testclassc532, TestClassC533 testclassc533) + { + } + } + [Export] + public class TestClassC267 + { + [ImportingConstructor] + public TestClassC267(TestClassC534 testclassc534, TestClassC535 testclassc535) + { + } + } + [Export] + public class TestClassC268 + { + [ImportingConstructor] + public TestClassC268(TestClassC536 testclassc536, TestClassC537 testclassc537) + { + } + } + [Export] + public class TestClassC269 + { + [ImportingConstructor] + public TestClassC269(TestClassC538 testclassc538, TestClassC539 testclassc539) + { + } + } + [Export] + public class TestClassC270 + { + [ImportingConstructor] + public TestClassC270(TestClassC540 testclassc540, TestClassC541 testclassc541) + { + } + } + [Export] + public class TestClassC271 + { + [ImportingConstructor] + public TestClassC271(TestClassC542 testclassc542, TestClassC543 testclassc543) + { + } + } + [Export] + public class TestClassC272 + { + [ImportingConstructor] + public TestClassC272(TestClassC544 testclassc544, TestClassC545 testclassc545) + { + } + } + [Export] + public class TestClassC273 + { + [ImportingConstructor] + public TestClassC273(TestClassC546 testclassc546, TestClassC547 testclassc547) + { + } + } + [Export] + public class TestClassC274 + { + [ImportingConstructor] + public TestClassC274(TestClassC548 testclassc548, TestClassC549 testclassc549) + { + } + } + [Export] + public class TestClassC275 + { + [ImportingConstructor] + public TestClassC275(TestClassC550 testclassc550, TestClassC551 testclassc551) + { + } + } + [Export] + public class TestClassC276 + { + [ImportingConstructor] + public TestClassC276(TestClassC552 testclassc552, TestClassC553 testclassc553) + { + } + } + [Export] + public class TestClassC277 + { + [ImportingConstructor] + public TestClassC277(TestClassC554 testclassc554, TestClassC555 testclassc555) + { + } + } + [Export] + public class TestClassC278 + { + [ImportingConstructor] + public TestClassC278(TestClassC556 testclassc556, TestClassC557 testclassc557) + { + } + } + [Export] + public class TestClassC279 + { + [ImportingConstructor] + public TestClassC279(TestClassC558 testclassc558, TestClassC559 testclassc559) + { + } + } + [Export] + public class TestClassC280 + { + [ImportingConstructor] + public TestClassC280(TestClassC560 testclassc560, TestClassC561 testclassc561) + { + } + } + [Export] + public class TestClassC281 + { + [ImportingConstructor] + public TestClassC281(TestClassC562 testclassc562, TestClassC563 testclassc563) + { + } + } + [Export] + public class TestClassC282 + { + [ImportingConstructor] + public TestClassC282(TestClassC564 testclassc564, TestClassC565 testclassc565) + { + } + } + [Export] + public class TestClassC283 + { + [ImportingConstructor] + public TestClassC283(TestClassC566 testclassc566, TestClassC567 testclassc567) + { + } + } + [Export] + public class TestClassC284 + { + [ImportingConstructor] + public TestClassC284(TestClassC568 testclassc568, TestClassC569 testclassc569) + { + } + } + [Export] + public class TestClassC285 + { + [ImportingConstructor] + public TestClassC285(TestClassC570 testclassc570, TestClassC571 testclassc571) + { + } + } + [Export] + public class TestClassC286 + { + [ImportingConstructor] + public TestClassC286(TestClassC572 testclassc572, TestClassC573 testclassc573) + { + } + } + [Export] + public class TestClassC287 + { + [ImportingConstructor] + public TestClassC287(TestClassC574 testclassc574, TestClassC575 testclassc575) + { + } + } + [Export] + public class TestClassC288 + { + [ImportingConstructor] + public TestClassC288(TestClassC576 testclassc576, TestClassC577 testclassc577) + { + } + } + [Export] + public class TestClassC289 + { + [ImportingConstructor] + public TestClassC289(TestClassC578 testclassc578, TestClassC579 testclassc579) + { + } + } + [Export] + public class TestClassC290 + { + [ImportingConstructor] + public TestClassC290(TestClassC580 testclassc580, TestClassC581 testclassc581) + { + } + } + [Export] + public class TestClassC291 + { + [ImportingConstructor] + public TestClassC291(TestClassC582 testclassc582, TestClassC583 testclassc583) + { + } + } + [Export] + public class TestClassC292 + { + [ImportingConstructor] + public TestClassC292(TestClassC584 testclassc584, TestClassC585 testclassc585) + { + } + } + [Export] + public class TestClassC293 + { + [ImportingConstructor] + public TestClassC293(TestClassC586 testclassc586, TestClassC587 testclassc587) + { + } + } + [Export] + public class TestClassC294 + { + [ImportingConstructor] + public TestClassC294(TestClassC588 testclassc588, TestClassC589 testclassc589) + { + } + } + [Export] + public class TestClassC295 + { + [ImportingConstructor] + public TestClassC295(TestClassC590 testclassc590, TestClassC591 testclassc591) + { + } + } + [Export] + public class TestClassC296 + { + [ImportingConstructor] + public TestClassC296(TestClassC592 testclassc592, TestClassC593 testclassc593) + { + } + } + [Export] + public class TestClassC297 + { + [ImportingConstructor] + public TestClassC297(TestClassC594 testclassc594, TestClassC595 testclassc595) + { + } + } + [Export] + public class TestClassC298 + { + [ImportingConstructor] + public TestClassC298(TestClassC596 testclassc596, TestClassC597 testclassc597) + { + } + } + [Export] + public class TestClassC299 + { + [ImportingConstructor] + public TestClassC299(TestClassC598 testclassc598, TestClassC599 testclassc599) + { + } + } + [Export] + public class TestClassC300 + { + [ImportingConstructor] + public TestClassC300(TestClassC600 testclassc600, TestClassC601 testclassc601) + { + } + } + [Export] + public class TestClassC301 + { + [ImportingConstructor] + public TestClassC301(TestClassC602 testclassc602, TestClassC603 testclassc603) + { + } + } + [Export] + public class TestClassC302 + { + [ImportingConstructor] + public TestClassC302(TestClassC604 testclassc604, TestClassC605 testclassc605) + { + } + } + [Export] + public class TestClassC303 + { + [ImportingConstructor] + public TestClassC303(TestClassC606 testclassc606, TestClassC607 testclassc607) + { + } + } + [Export] + public class TestClassC304 + { + [ImportingConstructor] + public TestClassC304(TestClassC608 testclassc608, TestClassC609 testclassc609) + { + } + } + [Export] + public class TestClassC305 + { + [ImportingConstructor] + public TestClassC305(TestClassC610 testclassc610, TestClassC611 testclassc611) + { + } + } + [Export] + public class TestClassC306 + { + [ImportingConstructor] + public TestClassC306(TestClassC612 testclassc612, TestClassC613 testclassc613) + { + } + } + [Export] + public class TestClassC307 + { + [ImportingConstructor] + public TestClassC307(TestClassC614 testclassc614, TestClassC615 testclassc615) + { + } + } + [Export] + public class TestClassC308 + { + [ImportingConstructor] + public TestClassC308(TestClassC616 testclassc616, TestClassC617 testclassc617) + { + } + } + [Export] + public class TestClassC309 + { + [ImportingConstructor] + public TestClassC309(TestClassC618 testclassc618, TestClassC619 testclassc619) + { + } + } + [Export] + public class TestClassC310 + { + [ImportingConstructor] + public TestClassC310(TestClassC620 testclassc620, TestClassC621 testclassc621) + { + } + } + [Export] + public class TestClassC311 + { + [ImportingConstructor] + public TestClassC311(TestClassC622 testclassc622, TestClassC623 testclassc623) + { + } + } + [Export] + public class TestClassC312 + { + [ImportingConstructor] + public TestClassC312(TestClassC624 testclassc624, TestClassC625 testclassc625) + { + } + } + [Export] + public class TestClassC313 + { + [ImportingConstructor] + public TestClassC313(TestClassC626 testclassc626, TestClassC627 testclassc627) + { + } + } + [Export] + public class TestClassC314 + { + [ImportingConstructor] + public TestClassC314(TestClassC628 testclassc628, TestClassC629 testclassc629) + { + } + } + [Export] + public class TestClassC315 + { + [ImportingConstructor] + public TestClassC315(TestClassC630 testclassc630, TestClassC631 testclassc631) + { + } + } + [Export] + public class TestClassC316 + { + [ImportingConstructor] + public TestClassC316(TestClassC632 testclassc632, TestClassC633 testclassc633) + { + } + } + [Export] + public class TestClassC317 + { + [ImportingConstructor] + public TestClassC317(TestClassC634 testclassc634, TestClassC635 testclassc635) + { + } + } + [Export] + public class TestClassC318 + { + [ImportingConstructor] + public TestClassC318(TestClassC636 testclassc636, TestClassC637 testclassc637) + { + } + } + [Export] + public class TestClassC319 + { + [ImportingConstructor] + public TestClassC319(TestClassC638 testclassc638, TestClassC639 testclassc639) + { + } + } + [Export] + public class TestClassC320 + { + [ImportingConstructor] + public TestClassC320(TestClassC640 testclassc640, TestClassC641 testclassc641) + { + } + } + [Export] + public class TestClassC321 + { + [ImportingConstructor] + public TestClassC321(TestClassC642 testclassc642, TestClassC643 testclassc643) + { + } + } + [Export] + public class TestClassC322 + { + [ImportingConstructor] + public TestClassC322(TestClassC644 testclassc644, TestClassC645 testclassc645) + { + } + } + [Export] + public class TestClassC323 + { + [ImportingConstructor] + public TestClassC323(TestClassC646 testclassc646, TestClassC647 testclassc647) + { + } + } + [Export] + public class TestClassC324 + { + [ImportingConstructor] + public TestClassC324(TestClassC648 testclassc648, TestClassC649 testclassc649) + { + } + } + [Export] + public class TestClassC325 + { + [ImportingConstructor] + public TestClassC325(TestClassC650 testclassc650, TestClassC651 testclassc651) + { + } + } + [Export] + public class TestClassC326 + { + [ImportingConstructor] + public TestClassC326(TestClassC652 testclassc652, TestClassC653 testclassc653) + { + } + } + [Export] + public class TestClassC327 + { + [ImportingConstructor] + public TestClassC327(TestClassC654 testclassc654, TestClassC655 testclassc655) + { + } + } + [Export] + public class TestClassC328 + { + [ImportingConstructor] + public TestClassC328(TestClassC656 testclassc656, TestClassC657 testclassc657) + { + } + } + [Export] + public class TestClassC329 + { + [ImportingConstructor] + public TestClassC329(TestClassC658 testclassc658, TestClassC659 testclassc659) + { + } + } + [Export] + public class TestClassC330 + { + [ImportingConstructor] + public TestClassC330(TestClassC660 testclassc660, TestClassC661 testclassc661) + { + } + } + [Export] + public class TestClassC331 + { + [ImportingConstructor] + public TestClassC331(TestClassC662 testclassc662, TestClassC663 testclassc663) + { + } + } + [Export] + public class TestClassC332 + { + [ImportingConstructor] + public TestClassC332(TestClassC664 testclassc664, TestClassC665 testclassc665) + { + } + } + [Export] + public class TestClassC333 + { + [ImportingConstructor] + public TestClassC333(TestClassC666 testclassc666, TestClassC667 testclassc667) + { + } + } + [Export] + public class TestClassC334 + { + [ImportingConstructor] + public TestClassC334(TestClassC668 testclassc668, TestClassC669 testclassc669) + { + } + } + [Export] + public class TestClassC335 + { + [ImportingConstructor] + public TestClassC335(TestClassC670 testclassc670, TestClassC671 testclassc671) + { + } + } + [Export] + public class TestClassC336 + { + [ImportingConstructor] + public TestClassC336(TestClassC672 testclassc672, TestClassC673 testclassc673) + { + } + } + [Export] + public class TestClassC337 + { + [ImportingConstructor] + public TestClassC337(TestClassC674 testclassc674, TestClassC675 testclassc675) + { + } + } + [Export] + public class TestClassC338 + { + [ImportingConstructor] + public TestClassC338(TestClassC676 testclassc676, TestClassC677 testclassc677) + { + } + } + [Export] + public class TestClassC339 + { + [ImportingConstructor] + public TestClassC339(TestClassC678 testclassc678, TestClassC679 testclassc679) + { + } + } + [Export] + public class TestClassC340 + { + [ImportingConstructor] + public TestClassC340(TestClassC680 testclassc680, TestClassC681 testclassc681) + { + } + } + [Export] + public class TestClassC341 + { + [ImportingConstructor] + public TestClassC341(TestClassC682 testclassc682, TestClassC683 testclassc683) + { + } + } + [Export] + public class TestClassC342 + { + [ImportingConstructor] + public TestClassC342(TestClassC684 testclassc684, TestClassC685 testclassc685) + { + } + } + [Export] + public class TestClassC343 + { + [ImportingConstructor] + public TestClassC343(TestClassC686 testclassc686, TestClassC687 testclassc687) + { + } + } + [Export] + public class TestClassC344 + { + [ImportingConstructor] + public TestClassC344(TestClassC688 testclassc688, TestClassC689 testclassc689) + { + } + } + [Export] + public class TestClassC345 + { + [ImportingConstructor] + public TestClassC345(TestClassC690 testclassc690, TestClassC691 testclassc691) + { + } + } + [Export] + public class TestClassC346 + { + [ImportingConstructor] + public TestClassC346(TestClassC692 testclassc692, TestClassC693 testclassc693) + { + } + } + [Export] + public class TestClassC347 + { + [ImportingConstructor] + public TestClassC347(TestClassC694 testclassc694, TestClassC695 testclassc695) + { + } + } + [Export] + public class TestClassC348 + { + [ImportingConstructor] + public TestClassC348(TestClassC696 testclassc696, TestClassC697 testclassc697) + { + } + } + [Export] + public class TestClassC349 + { + [ImportingConstructor] + public TestClassC349(TestClassC698 testclassc698, TestClassC699 testclassc699) + { + } + } + [Export] + public class TestClassC350 + { + [ImportingConstructor] + public TestClassC350(TestClassC700 testclassc700, TestClassC701 testclassc701) + { + } + } + [Export] + public class TestClassC351 + { + [ImportingConstructor] + public TestClassC351(TestClassC702 testclassc702, TestClassC703 testclassc703) + { + } + } + [Export] + public class TestClassC352 + { + [ImportingConstructor] + public TestClassC352(TestClassC704 testclassc704, TestClassC705 testclassc705) + { + } + } + [Export] + public class TestClassC353 + { + [ImportingConstructor] + public TestClassC353(TestClassC706 testclassc706, TestClassC707 testclassc707) + { + } + } + [Export] + public class TestClassC354 + { + [ImportingConstructor] + public TestClassC354(TestClassC708 testclassc708, TestClassC709 testclassc709) + { + } + } + [Export] + public class TestClassC355 + { + [ImportingConstructor] + public TestClassC355(TestClassC710 testclassc710, TestClassC711 testclassc711) + { + } + } + [Export] + public class TestClassC356 + { + [ImportingConstructor] + public TestClassC356(TestClassC712 testclassc712, TestClassC713 testclassc713) + { + } + } + [Export] + public class TestClassC357 + { + [ImportingConstructor] + public TestClassC357(TestClassC714 testclassc714, TestClassC715 testclassc715) + { + } + } + [Export] + public class TestClassC358 + { + [ImportingConstructor] + public TestClassC358(TestClassC716 testclassc716, TestClassC717 testclassc717) + { + } + } + [Export] + public class TestClassC359 + { + [ImportingConstructor] + public TestClassC359(TestClassC718 testclassc718, TestClassC719 testclassc719) + { + } + } + [Export] + public class TestClassC360 + { + [ImportingConstructor] + public TestClassC360(TestClassC720 testclassc720, TestClassC721 testclassc721) + { + } + } + [Export] + public class TestClassC361 + { + [ImportingConstructor] + public TestClassC361(TestClassC722 testclassc722, TestClassC723 testclassc723) + { + } + } + [Export] + public class TestClassC362 + { + [ImportingConstructor] + public TestClassC362(TestClassC724 testclassc724, TestClassC725 testclassc725) + { + } + } + [Export] + public class TestClassC363 + { + [ImportingConstructor] + public TestClassC363(TestClassC726 testclassc726, TestClassC727 testclassc727) + { + } + } + [Export] + public class TestClassC364 + { + [ImportingConstructor] + public TestClassC364(TestClassC728 testclassc728, TestClassC729 testclassc729) + { + } + } + [Export] + public class TestClassC365 + { + [ImportingConstructor] + public TestClassC365(TestClassC730 testclassc730, TestClassC731 testclassc731) + { + } + } + [Export] + public class TestClassC366 + { + [ImportingConstructor] + public TestClassC366(TestClassC732 testclassc732, TestClassC733 testclassc733) + { + } + } + [Export] + public class TestClassC367 + { + [ImportingConstructor] + public TestClassC367(TestClassC734 testclassc734, TestClassC735 testclassc735) + { + } + } + [Export] + public class TestClassC368 + { + [ImportingConstructor] + public TestClassC368(TestClassC736 testclassc736, TestClassC737 testclassc737) + { + } + } + [Export] + public class TestClassC369 + { + [ImportingConstructor] + public TestClassC369(TestClassC738 testclassc738, TestClassC739 testclassc739) + { + } + } + [Export] + public class TestClassC370 + { + [ImportingConstructor] + public TestClassC370(TestClassC740 testclassc740, TestClassC741 testclassc741) + { + } + } + [Export] + public class TestClassC371 + { + [ImportingConstructor] + public TestClassC371(TestClassC742 testclassc742, TestClassC743 testclassc743) + { + } + } + [Export] + public class TestClassC372 + { + [ImportingConstructor] + public TestClassC372(TestClassC744 testclassc744, TestClassC745 testclassc745) + { + } + } + [Export] + public class TestClassC373 + { + [ImportingConstructor] + public TestClassC373(TestClassC746 testclassc746, TestClassC747 testclassc747) + { + } + } + [Export] + public class TestClassC374 + { + [ImportingConstructor] + public TestClassC374(TestClassC748 testclassc748, TestClassC749 testclassc749) + { + } + } + [Export] + public class TestClassC375 + { + [ImportingConstructor] + public TestClassC375(TestClassC750 testclassc750, TestClassC751 testclassc751) + { + } + } + [Export] + public class TestClassC376 + { + [ImportingConstructor] + public TestClassC376(TestClassC752 testclassc752, TestClassC753 testclassc753) + { + } + } + [Export] + public class TestClassC377 + { + [ImportingConstructor] + public TestClassC377(TestClassC754 testclassc754, TestClassC755 testclassc755) + { + } + } + [Export] + public class TestClassC378 + { + [ImportingConstructor] + public TestClassC378(TestClassC756 testclassc756, TestClassC757 testclassc757) + { + } + } + [Export] + public class TestClassC379 + { + [ImportingConstructor] + public TestClassC379(TestClassC758 testclassc758, TestClassC759 testclassc759) + { + } + } + [Export] + public class TestClassC380 + { + [ImportingConstructor] + public TestClassC380(TestClassC760 testclassc760, TestClassC761 testclassc761) + { + } + } + [Export] + public class TestClassC381 + { + [ImportingConstructor] + public TestClassC381(TestClassC762 testclassc762, TestClassC763 testclassc763) + { + } + } + [Export] + public class TestClassC382 + { + [ImportingConstructor] + public TestClassC382(TestClassC764 testclassc764, TestClassC765 testclassc765) + { + } + } + [Export] + public class TestClassC383 + { + [ImportingConstructor] + public TestClassC383(TestClassC766 testclassc766, TestClassC767 testclassc767) + { + } + } + [Export] + public class TestClassC384 + { + [ImportingConstructor] + public TestClassC384(TestClassC768 testclassc768, TestClassC769 testclassc769) + { + } + } + [Export] + public class TestClassC385 + { + [ImportingConstructor] + public TestClassC385(TestClassC770 testclassc770, TestClassC771 testclassc771) + { + } + } + [Export] + public class TestClassC386 + { + [ImportingConstructor] + public TestClassC386(TestClassC772 testclassc772, TestClassC773 testclassc773) + { + } + } + [Export] + public class TestClassC387 + { + [ImportingConstructor] + public TestClassC387(TestClassC774 testclassc774, TestClassC775 testclassc775) + { + } + } + [Export] + public class TestClassC388 + { + [ImportingConstructor] + public TestClassC388(TestClassC776 testclassc776, TestClassC777 testclassc777) + { + } + } + [Export] + public class TestClassC389 + { + [ImportingConstructor] + public TestClassC389(TestClassC778 testclassc778, TestClassC779 testclassc779) + { + } + } + [Export] + public class TestClassC390 + { + [ImportingConstructor] + public TestClassC390(TestClassC780 testclassc780, TestClassC781 testclassc781) + { + } + } + [Export] + public class TestClassC391 + { + [ImportingConstructor] + public TestClassC391(TestClassC782 testclassc782, TestClassC783 testclassc783) + { + } + } + [Export] + public class TestClassC392 + { + [ImportingConstructor] + public TestClassC392(TestClassC784 testclassc784, TestClassC785 testclassc785) + { + } + } + [Export] + public class TestClassC393 + { + [ImportingConstructor] + public TestClassC393(TestClassC786 testclassc786, TestClassC787 testclassc787) + { + } + } + [Export] + public class TestClassC394 + { + [ImportingConstructor] + public TestClassC394(TestClassC788 testclassc788, TestClassC789 testclassc789) + { + } + } + [Export] + public class TestClassC395 + { + [ImportingConstructor] + public TestClassC395(TestClassC790 testclassc790, TestClassC791 testclassc791) + { + } + } + [Export] + public class TestClassC396 + { + [ImportingConstructor] + public TestClassC396(TestClassC792 testclassc792, TestClassC793 testclassc793) + { + } + } + [Export] + public class TestClassC397 + { + [ImportingConstructor] + public TestClassC397(TestClassC794 testclassc794, TestClassC795 testclassc795) + { + } + } + [Export] + public class TestClassC398 + { + [ImportingConstructor] + public TestClassC398(TestClassC796 testclassc796, TestClassC797 testclassc797) + { + } + } + [Export] + public class TestClassC399 + { + [ImportingConstructor] + public TestClassC399(TestClassC798 testclassc798, TestClassC799 testclassc799) + { + } + } + [Export] + public class TestClassC400 + { + [ImportingConstructor] + public TestClassC400(TestClassC800 testclassc800, TestClassC801 testclassc801) + { + } + } + [Export] + public class TestClassC401 + { + [ImportingConstructor] + public TestClassC401(TestClassC802 testclassc802, TestClassC803 testclassc803) + { + } + } + [Export] + public class TestClassC402 + { + [ImportingConstructor] + public TestClassC402(TestClassC804 testclassc804, TestClassC805 testclassc805) + { + } + } + [Export] + public class TestClassC403 + { + [ImportingConstructor] + public TestClassC403(TestClassC806 testclassc806, TestClassC807 testclassc807) + { + } + } + [Export] + public class TestClassC404 + { + [ImportingConstructor] + public TestClassC404(TestClassC808 testclassc808, TestClassC809 testclassc809) + { + } + } + [Export] + public class TestClassC405 + { + [ImportingConstructor] + public TestClassC405(TestClassC810 testclassc810, TestClassC811 testclassc811) + { + } + } + [Export] + public class TestClassC406 + { + [ImportingConstructor] + public TestClassC406(TestClassC812 testclassc812, TestClassC813 testclassc813) + { + } + } + [Export] + public class TestClassC407 + { + [ImportingConstructor] + public TestClassC407(TestClassC814 testclassc814, TestClassC815 testclassc815) + { + } + } + [Export] + public class TestClassC408 + { + [ImportingConstructor] + public TestClassC408(TestClassC816 testclassc816, TestClassC817 testclassc817) + { + } + } + [Export] + public class TestClassC409 + { + [ImportingConstructor] + public TestClassC409(TestClassC818 testclassc818, TestClassC819 testclassc819) + { + } + } + [Export] + public class TestClassC410 + { + [ImportingConstructor] + public TestClassC410(TestClassC820 testclassc820, TestClassC821 testclassc821) + { + } + } + [Export] + public class TestClassC411 + { + [ImportingConstructor] + public TestClassC411(TestClassC822 testclassc822, TestClassC823 testclassc823) + { + } + } + [Export] + public class TestClassC412 + { + [ImportingConstructor] + public TestClassC412(TestClassC824 testclassc824, TestClassC825 testclassc825) + { + } + } + [Export] + public class TestClassC413 + { + [ImportingConstructor] + public TestClassC413(TestClassC826 testclassc826, TestClassC827 testclassc827) + { + } + } + [Export] + public class TestClassC414 + { + [ImportingConstructor] + public TestClassC414(TestClassC828 testclassc828, TestClassC829 testclassc829) + { + } + } + [Export] + public class TestClassC415 + { + [ImportingConstructor] + public TestClassC415(TestClassC830 testclassc830, TestClassC831 testclassc831) + { + } + } + [Export] + public class TestClassC416 + { + [ImportingConstructor] + public TestClassC416(TestClassC832 testclassc832, TestClassC833 testclassc833) + { + } + } + [Export] + public class TestClassC417 + { + [ImportingConstructor] + public TestClassC417(TestClassC834 testclassc834, TestClassC835 testclassc835) + { + } + } + [Export] + public class TestClassC418 + { + [ImportingConstructor] + public TestClassC418(TestClassC836 testclassc836, TestClassC837 testclassc837) + { + } + } + [Export] + public class TestClassC419 + { + [ImportingConstructor] + public TestClassC419(TestClassC838 testclassc838, TestClassC839 testclassc839) + { + } + } + [Export] + public class TestClassC420 + { + [ImportingConstructor] + public TestClassC420(TestClassC840 testclassc840, TestClassC841 testclassc841) + { + } + } + [Export] + public class TestClassC421 + { + [ImportingConstructor] + public TestClassC421(TestClassC842 testclassc842, TestClassC843 testclassc843) + { + } + } + [Export] + public class TestClassC422 + { + [ImportingConstructor] + public TestClassC422(TestClassC844 testclassc844, TestClassC845 testclassc845) + { + } + } + [Export] + public class TestClassC423 + { + [ImportingConstructor] + public TestClassC423(TestClassC846 testclassc846, TestClassC847 testclassc847) + { + } + } + [Export] + public class TestClassC424 + { + [ImportingConstructor] + public TestClassC424(TestClassC848 testclassc848, TestClassC849 testclassc849) + { + } + } + [Export] + public class TestClassC425 + { + [ImportingConstructor] + public TestClassC425(TestClassC850 testclassc850, TestClassC851 testclassc851) + { + } + } + [Export] + public class TestClassC426 + { + [ImportingConstructor] + public TestClassC426(TestClassC852 testclassc852, TestClassC853 testclassc853) + { + } + } + [Export] + public class TestClassC427 + { + [ImportingConstructor] + public TestClassC427(TestClassC854 testclassc854, TestClassC855 testclassc855) + { + } + } + [Export] + public class TestClassC428 + { + [ImportingConstructor] + public TestClassC428(TestClassC856 testclassc856, TestClassC857 testclassc857) + { + } + } + [Export] + public class TestClassC429 + { + [ImportingConstructor] + public TestClassC429(TestClassC858 testclassc858, TestClassC859 testclassc859) + { + } + } + [Export] + public class TestClassC430 + { + [ImportingConstructor] + public TestClassC430(TestClassC860 testclassc860, TestClassC861 testclassc861) + { + } + } + [Export] + public class TestClassC431 + { + [ImportingConstructor] + public TestClassC431(TestClassC862 testclassc862, TestClassC863 testclassc863) + { + } + } + [Export] + public class TestClassC432 + { + [ImportingConstructor] + public TestClassC432(TestClassC864 testclassc864, TestClassC865 testclassc865) + { + } + } + [Export] + public class TestClassC433 + { + [ImportingConstructor] + public TestClassC433(TestClassC866 testclassc866, TestClassC867 testclassc867) + { + } + } + [Export] + public class TestClassC434 + { + [ImportingConstructor] + public TestClassC434(TestClassC868 testclassc868, TestClassC869 testclassc869) + { + } + } + [Export] + public class TestClassC435 + { + [ImportingConstructor] + public TestClassC435(TestClassC870 testclassc870, TestClassC871 testclassc871) + { + } + } + [Export] + public class TestClassC436 + { + [ImportingConstructor] + public TestClassC436(TestClassC872 testclassc872, TestClassC873 testclassc873) + { + } + } + [Export] + public class TestClassC437 + { + [ImportingConstructor] + public TestClassC437(TestClassC874 testclassc874, TestClassC875 testclassc875) + { + } + } + [Export] + public class TestClassC438 + { + [ImportingConstructor] + public TestClassC438(TestClassC876 testclassc876, TestClassC877 testclassc877) + { + } + } + [Export] + public class TestClassC439 + { + [ImportingConstructor] + public TestClassC439(TestClassC878 testclassc878, TestClassC879 testclassc879) + { + } + } + [Export] + public class TestClassC440 + { + [ImportingConstructor] + public TestClassC440(TestClassC880 testclassc880, TestClassC881 testclassc881) + { + } + } + [Export] + public class TestClassC441 + { + [ImportingConstructor] + public TestClassC441(TestClassC882 testclassc882, TestClassC883 testclassc883) + { + } + } + [Export] + public class TestClassC442 + { + [ImportingConstructor] + public TestClassC442(TestClassC884 testclassc884, TestClassC885 testclassc885) + { + } + } + [Export] + public class TestClassC443 + { + [ImportingConstructor] + public TestClassC443(TestClassC886 testclassc886, TestClassC887 testclassc887) + { + } + } + [Export] + public class TestClassC444 + { + [ImportingConstructor] + public TestClassC444(TestClassC888 testclassc888, TestClassC889 testclassc889) + { + } + } + [Export] + public class TestClassC445 + { + [ImportingConstructor] + public TestClassC445(TestClassC890 testclassc890, TestClassC891 testclassc891) + { + } + } + [Export] + public class TestClassC446 + { + [ImportingConstructor] + public TestClassC446(TestClassC892 testclassc892, TestClassC893 testclassc893) + { + } + } + [Export] + public class TestClassC447 + { + [ImportingConstructor] + public TestClassC447(TestClassC894 testclassc894, TestClassC895 testclassc895) + { + } + } + [Export] + public class TestClassC448 + { + [ImportingConstructor] + public TestClassC448(TestClassC896 testclassc896, TestClassC897 testclassc897) + { + } + } + [Export] + public class TestClassC449 + { + [ImportingConstructor] + public TestClassC449(TestClassC898 testclassc898, TestClassC899 testclassc899) + { + } + } + [Export] + public class TestClassC450 + { + [ImportingConstructor] + public TestClassC450(TestClassC900 testclassc900, TestClassC901 testclassc901) + { + } + } + [Export] + public class TestClassC451 + { + [ImportingConstructor] + public TestClassC451(TestClassC902 testclassc902, TestClassC903 testclassc903) + { + } + } + [Export] + public class TestClassC452 + { + [ImportingConstructor] + public TestClassC452(TestClassC904 testclassc904, TestClassC905 testclassc905) + { + } + } + [Export] + public class TestClassC453 + { + [ImportingConstructor] + public TestClassC453(TestClassC906 testclassc906, TestClassC907 testclassc907) + { + } + } + [Export] + public class TestClassC454 + { + [ImportingConstructor] + public TestClassC454(TestClassC908 testclassc908, TestClassC909 testclassc909) + { + } + } + [Export] + public class TestClassC455 + { + [ImportingConstructor] + public TestClassC455(TestClassC910 testclassc910, TestClassC911 testclassc911) + { + } + } + [Export] + public class TestClassC456 + { + [ImportingConstructor] + public TestClassC456(TestClassC912 testclassc912, TestClassC913 testclassc913) + { + } + } + [Export] + public class TestClassC457 + { + [ImportingConstructor] + public TestClassC457(TestClassC914 testclassc914, TestClassC915 testclassc915) + { + } + } + [Export] + public class TestClassC458 + { + [ImportingConstructor] + public TestClassC458(TestClassC916 testclassc916, TestClassC917 testclassc917) + { + } + } + [Export] + public class TestClassC459 + { + [ImportingConstructor] + public TestClassC459(TestClassC918 testclassc918, TestClassC919 testclassc919) + { + } + } + [Export] + public class TestClassC460 + { + [ImportingConstructor] + public TestClassC460(TestClassC920 testclassc920, TestClassC921 testclassc921) + { + } + } + [Export] + public class TestClassC461 + { + [ImportingConstructor] + public TestClassC461(TestClassC922 testclassc922, TestClassC923 testclassc923) + { + } + } + [Export] + public class TestClassC462 + { + [ImportingConstructor] + public TestClassC462(TestClassC924 testclassc924, TestClassC925 testclassc925) + { + } + } + [Export] + public class TestClassC463 + { + [ImportingConstructor] + public TestClassC463(TestClassC926 testclassc926, TestClassC927 testclassc927) + { + } + } + [Export] + public class TestClassC464 + { + [ImportingConstructor] + public TestClassC464(TestClassC928 testclassc928, TestClassC929 testclassc929) + { + } + } + [Export] + public class TestClassC465 + { + [ImportingConstructor] + public TestClassC465(TestClassC930 testclassc930, TestClassC931 testclassc931) + { + } + } + [Export] + public class TestClassC466 + { + [ImportingConstructor] + public TestClassC466(TestClassC932 testclassc932, TestClassC933 testclassc933) + { + } + } + [Export] + public class TestClassC467 + { + [ImportingConstructor] + public TestClassC467(TestClassC934 testclassc934, TestClassC935 testclassc935) + { + } + } + [Export] + public class TestClassC468 + { + [ImportingConstructor] + public TestClassC468(TestClassC936 testclassc936, TestClassC937 testclassc937) + { + } + } + [Export] + public class TestClassC469 + { + [ImportingConstructor] + public TestClassC469(TestClassC938 testclassc938, TestClassC939 testclassc939) + { + } + } + [Export] + public class TestClassC470 + { + [ImportingConstructor] + public TestClassC470(TestClassC940 testclassc940, TestClassC941 testclassc941) + { + } + } + [Export] + public class TestClassC471 + { + [ImportingConstructor] + public TestClassC471(TestClassC942 testclassc942, TestClassC943 testclassc943) + { + } + } + [Export] + public class TestClassC472 + { + [ImportingConstructor] + public TestClassC472(TestClassC944 testclassc944, TestClassC945 testclassc945) + { + } + } + [Export] + public class TestClassC473 + { + [ImportingConstructor] + public TestClassC473(TestClassC946 testclassc946, TestClassC947 testclassc947) + { + } + } + [Export] + public class TestClassC474 + { + [ImportingConstructor] + public TestClassC474(TestClassC948 testclassc948, TestClassC949 testclassc949) + { + } + } + [Export] + public class TestClassC475 + { + [ImportingConstructor] + public TestClassC475(TestClassC950 testclassc950, TestClassC951 testclassc951) + { + } + } + [Export] + public class TestClassC476 + { + [ImportingConstructor] + public TestClassC476(TestClassC952 testclassc952, TestClassC953 testclassc953) + { + } + } + [Export] + public class TestClassC477 + { + [ImportingConstructor] + public TestClassC477(TestClassC954 testclassc954, TestClassC955 testclassc955) + { + } + } + [Export] + public class TestClassC478 + { + [ImportingConstructor] + public TestClassC478(TestClassC956 testclassc956, TestClassC957 testclassc957) + { + } + } + [Export] + public class TestClassC479 + { + [ImportingConstructor] + public TestClassC479(TestClassC958 testclassc958, TestClassC959 testclassc959) + { + } + } + [Export] + public class TestClassC480 + { + [ImportingConstructor] + public TestClassC480(TestClassC960 testclassc960, TestClassC961 testclassc961) + { + } + } + [Export] + public class TestClassC481 + { + [ImportingConstructor] + public TestClassC481(TestClassC962 testclassc962, TestClassC963 testclassc963) + { + } + } + [Export] + public class TestClassC482 + { + [ImportingConstructor] + public TestClassC482(TestClassC964 testclassc964, TestClassC965 testclassc965) + { + } + } + [Export] + public class TestClassC483 + { + [ImportingConstructor] + public TestClassC483(TestClassC966 testclassc966, TestClassC967 testclassc967) + { + } + } + [Export] + public class TestClassC484 + { + [ImportingConstructor] + public TestClassC484(TestClassC968 testclassc968, TestClassC969 testclassc969) + { + } + } + [Export] + public class TestClassC485 + { + [ImportingConstructor] + public TestClassC485(TestClassC970 testclassc970, TestClassC971 testclassc971) + { + } + } + [Export] + public class TestClassC486 + { + [ImportingConstructor] + public TestClassC486(TestClassC972 testclassc972, TestClassC973 testclassc973) + { + } + } + [Export] + public class TestClassC487 + { + [ImportingConstructor] + public TestClassC487(TestClassC974 testclassc974, TestClassC975 testclassc975) + { + } + } + [Export] + public class TestClassC488 + { + [ImportingConstructor] + public TestClassC488(TestClassC976 testclassc976, TestClassC977 testclassc977) + { + } + } + [Export] + public class TestClassC489 + { + [ImportingConstructor] + public TestClassC489(TestClassC978 testclassc978, TestClassC979 testclassc979) + { + } + } + [Export] + public class TestClassC490 + { + [ImportingConstructor] + public TestClassC490(TestClassC980 testclassc980, TestClassC981 testclassc981) + { + } + } + [Export] + public class TestClassC491 + { + [ImportingConstructor] + public TestClassC491(TestClassC982 testclassc982, TestClassC983 testclassc983) + { + } + } + [Export] + public class TestClassC492 + { + [ImportingConstructor] + public TestClassC492(TestClassC984 testclassc984, TestClassC985 testclassc985) + { + } + } + [Export] + public class TestClassC493 + { + [ImportingConstructor] + public TestClassC493(TestClassC986 testclassc986, TestClassC987 testclassc987) + { + } + } + [Export] + public class TestClassC494 + { + [ImportingConstructor] + public TestClassC494(TestClassC988 testclassc988, TestClassC989 testclassc989) + { + } + } + [Export] + public class TestClassC495 + { + [ImportingConstructor] + public TestClassC495(TestClassC990 testclassc990, TestClassC991 testclassc991) + { + } + } + [Export] + public class TestClassC496 + { + [ImportingConstructor] + public TestClassC496(TestClassC992 testclassc992, TestClassC993 testclassc993) + { + } + } + [Export] + public class TestClassC497 + { + [ImportingConstructor] + public TestClassC497(TestClassC994 testclassc994, TestClassC995 testclassc995) + { + } + } + [Export] + public class TestClassC498 + { + [ImportingConstructor] + public TestClassC498(TestClassC996 testclassc996, TestClassC997 testclassc997) + { + } + } + [Export] + public class TestClassC499 + { + [ImportingConstructor] + public TestClassC499(TestClassC998 testclassc998, TestClassC999 testclassc999) + { + } + } + [Export] + public class TestClassC500 + { + [ImportingConstructor] + public TestClassC500(TestClassC1000 testclassc1000, TestClassC1001 testclassc1001) + { + } + } + [Export] + public class TestClassC501 + { + [ImportingConstructor] + public TestClassC501(TestClassC1002 testclassc1002, TestClassC1003 testclassc1003) + { + } + } + [Export] + public class TestClassC502 + { + [ImportingConstructor] + public TestClassC502(TestClassC1004 testclassc1004, TestClassC1005 testclassc1005) + { + } + } + [Export] + public class TestClassC503 + { + [ImportingConstructor] + public TestClassC503(TestClassC1006 testclassc1006, TestClassC1007 testclassc1007) + { + } + } + [Export] + public class TestClassC504 + { + [ImportingConstructor] + public TestClassC504(TestClassC1008 testclassc1008, TestClassC1009 testclassc1009) + { + } + } + [Export] + public class TestClassC505 + { + [ImportingConstructor] + public TestClassC505(TestClassC1010 testclassc1010, TestClassC1011 testclassc1011) + { + } + } + [Export] + public class TestClassC506 + { + [ImportingConstructor] + public TestClassC506(TestClassC1012 testclassc1012, TestClassC1013 testclassc1013) + { + } + } + [Export] + public class TestClassC507 + { + [ImportingConstructor] + public TestClassC507(TestClassC1014 testclassc1014, TestClassC1015 testclassc1015) + { + } + } + [Export] + public class TestClassC508 + { + [ImportingConstructor] + public TestClassC508(TestClassC1016 testclassc1016, TestClassC1017 testclassc1017) + { + } + } + [Export] + public class TestClassC509 + { + [ImportingConstructor] + public TestClassC509(TestClassC1018 testclassc1018, TestClassC1019 testclassc1019) + { + } + } + [Export] + public class TestClassC510 + { + [ImportingConstructor] + public TestClassC510(TestClassC1020 testclassc1020, TestClassC1021 testclassc1021) + { + } + } + [Export] + public class TestClassC511 + { + [ImportingConstructor] + public TestClassC511(TestClassC1022 testclassc1022, TestClassC1023 testclassc1023) + { + } + } + [Export] + public class TestClassC512 + { + [ImportingConstructor] + public TestClassC512(TestClassC1024 testclassc1024, TestClassC1025 testclassc1025) + { + } + } + [Export] + public class TestClassC513 + { + [ImportingConstructor] + public TestClassC513(TestClassC1026 testclassc1026, TestClassC1027 testclassc1027) + { + } + } + [Export] + public class TestClassC514 + { + [ImportingConstructor] + public TestClassC514(TestClassC1028 testclassc1028, TestClassC1029 testclassc1029) + { + } + } + [Export] + public class TestClassC515 + { + [ImportingConstructor] + public TestClassC515(TestClassC1030 testclassc1030, TestClassC1031 testclassc1031) + { + } + } + [Export] + public class TestClassC516 + { + [ImportingConstructor] + public TestClassC516(TestClassC1032 testclassc1032, TestClassC1033 testclassc1033) + { + } + } + [Export] + public class TestClassC517 + { + [ImportingConstructor] + public TestClassC517(TestClassC1034 testclassc1034, TestClassC1035 testclassc1035) + { + } + } + [Export] + public class TestClassC518 + { + [ImportingConstructor] + public TestClassC518(TestClassC1036 testclassc1036, TestClassC1037 testclassc1037) + { + } + } + [Export] + public class TestClassC519 + { + [ImportingConstructor] + public TestClassC519(TestClassC1038 testclassc1038, TestClassC1039 testclassc1039) + { + } + } + [Export] + public class TestClassC520 + { + [ImportingConstructor] + public TestClassC520(TestClassC1040 testclassc1040, TestClassC1041 testclassc1041) + { + } + } + [Export] + public class TestClassC521 + { + [ImportingConstructor] + public TestClassC521(TestClassC1042 testclassc1042, TestClassC1043 testclassc1043) + { + } + } + [Export] + public class TestClassC522 + { + [ImportingConstructor] + public TestClassC522(TestClassC1044 testclassc1044, TestClassC1045 testclassc1045) + { + } + } + [Export] + public class TestClassC523 + { + [ImportingConstructor] + public TestClassC523(TestClassC1046 testclassc1046, TestClassC1047 testclassc1047) + { + } + } + [Export] + public class TestClassC524 + { + [ImportingConstructor] + public TestClassC524(TestClassC1048 testclassc1048, TestClassC1049 testclassc1049) + { + } + } + [Export] + public class TestClassC525 + { + [ImportingConstructor] + public TestClassC525(TestClassC1050 testclassc1050, TestClassC1051 testclassc1051) + { + } + } + [Export] + public class TestClassC526 + { + [ImportingConstructor] + public TestClassC526(TestClassC1052 testclassc1052, TestClassC1053 testclassc1053) + { + } + } + [Export] + public class TestClassC527 + { + [ImportingConstructor] + public TestClassC527(TestClassC1054 testclassc1054, TestClassC1055 testclassc1055) + { + } + } + [Export] + public class TestClassC528 + { + [ImportingConstructor] + public TestClassC528(TestClassC1056 testclassc1056, TestClassC1057 testclassc1057) + { + } + } + [Export] + public class TestClassC529 + { + [ImportingConstructor] + public TestClassC529(TestClassC1058 testclassc1058, TestClassC1059 testclassc1059) + { + } + } + [Export] + public class TestClassC530 + { + [ImportingConstructor] + public TestClassC530(TestClassC1060 testclassc1060, TestClassC1061 testclassc1061) + { + } + } + [Export] + public class TestClassC531 + { + [ImportingConstructor] + public TestClassC531(TestClassC1062 testclassc1062, TestClassC1063 testclassc1063) + { + } + } + [Export] + public class TestClassC532 + { + [ImportingConstructor] + public TestClassC532(TestClassC1064 testclassc1064, TestClassC1065 testclassc1065) + { + } + } + [Export] + public class TestClassC533 + { + [ImportingConstructor] + public TestClassC533(TestClassC1066 testclassc1066, TestClassC1067 testclassc1067) + { + } + } + [Export] + public class TestClassC534 + { + [ImportingConstructor] + public TestClassC534(TestClassC1068 testclassc1068, TestClassC1069 testclassc1069) + { + } + } + [Export] + public class TestClassC535 + { + [ImportingConstructor] + public TestClassC535(TestClassC1070 testclassc1070, TestClassC1071 testclassc1071) + { + } + } + [Export] + public class TestClassC536 + { + [ImportingConstructor] + public TestClassC536(TestClassC1072 testclassc1072, TestClassC1073 testclassc1073) + { + } + } + [Export] + public class TestClassC537 + { + [ImportingConstructor] + public TestClassC537(TestClassC1074 testclassc1074, TestClassC1075 testclassc1075) + { + } + } + [Export] + public class TestClassC538 + { + [ImportingConstructor] + public TestClassC538(TestClassC1076 testclassc1076, TestClassC1077 testclassc1077) + { + } + } + [Export] + public class TestClassC539 + { + [ImportingConstructor] + public TestClassC539(TestClassC1078 testclassc1078, TestClassC1079 testclassc1079) + { + } + } + [Export] + public class TestClassC540 + { + [ImportingConstructor] + public TestClassC540(TestClassC1080 testclassc1080, TestClassC1081 testclassc1081) + { + } + } + [Export] + public class TestClassC541 + { + [ImportingConstructor] + public TestClassC541(TestClassC1082 testclassc1082, TestClassC1083 testclassc1083) + { + } + } + [Export] + public class TestClassC542 + { + [ImportingConstructor] + public TestClassC542(TestClassC1084 testclassc1084, TestClassC1085 testclassc1085) + { + } + } + [Export] + public class TestClassC543 + { + [ImportingConstructor] + public TestClassC543(TestClassC1086 testclassc1086, TestClassC1087 testclassc1087) + { + } + } + [Export] + public class TestClassC544 + { + [ImportingConstructor] + public TestClassC544(TestClassC1088 testclassc1088, TestClassC1089 testclassc1089) + { + } + } + [Export] + public class TestClassC545 + { + [ImportingConstructor] + public TestClassC545(TestClassC1090 testclassc1090, TestClassC1091 testclassc1091) + { + } + } + [Export] + public class TestClassC546 + { + [ImportingConstructor] + public TestClassC546(TestClassC1092 testclassc1092, TestClassC1093 testclassc1093) + { + } + } + [Export] + public class TestClassC547 + { + [ImportingConstructor] + public TestClassC547(TestClassC1094 testclassc1094, TestClassC1095 testclassc1095) + { + } + } + [Export] + public class TestClassC548 + { + [ImportingConstructor] + public TestClassC548(TestClassC1096 testclassc1096, TestClassC1097 testclassc1097) + { + } + } + [Export] + public class TestClassC549 + { + [ImportingConstructor] + public TestClassC549(TestClassC1098 testclassc1098, TestClassC1099 testclassc1099) + { + } + } + [Export] + public class TestClassC550 + { + [ImportingConstructor] + public TestClassC550(TestClassC1100 testclassc1100, TestClassC1101 testclassc1101) + { + } + } + [Export] + public class TestClassC551 + { + [ImportingConstructor] + public TestClassC551(TestClassC1102 testclassc1102, TestClassC1103 testclassc1103) + { + } + } + [Export] + public class TestClassC552 + { + [ImportingConstructor] + public TestClassC552(TestClassC1104 testclassc1104, TestClassC1105 testclassc1105) + { + } + } + [Export] + public class TestClassC553 + { + [ImportingConstructor] + public TestClassC553(TestClassC1106 testclassc1106, TestClassC1107 testclassc1107) + { + } + } + [Export] + public class TestClassC554 + { + [ImportingConstructor] + public TestClassC554(TestClassC1108 testclassc1108, TestClassC1109 testclassc1109) + { + } + } + [Export] + public class TestClassC555 + { + [ImportingConstructor] + public TestClassC555(TestClassC1110 testclassc1110, TestClassC1111 testclassc1111) + { + } + } + [Export] + public class TestClassC556 + { + [ImportingConstructor] + public TestClassC556(TestClassC1112 testclassc1112, TestClassC1113 testclassc1113) + { + } + } + [Export] + public class TestClassC557 + { + [ImportingConstructor] + public TestClassC557(TestClassC1114 testclassc1114, TestClassC1115 testclassc1115) + { + } + } + [Export] + public class TestClassC558 + { + [ImportingConstructor] + public TestClassC558(TestClassC1116 testclassc1116, TestClassC1117 testclassc1117) + { + } + } + [Export] + public class TestClassC559 + { + [ImportingConstructor] + public TestClassC559(TestClassC1118 testclassc1118, TestClassC1119 testclassc1119) + { + } + } + [Export] + public class TestClassC560 + { + [ImportingConstructor] + public TestClassC560(TestClassC1120 testclassc1120, TestClassC1121 testclassc1121) + { + } + } + [Export] + public class TestClassC561 + { + [ImportingConstructor] + public TestClassC561(TestClassC1122 testclassc1122, TestClassC1123 testclassc1123) + { + } + } + [Export] + public class TestClassC562 + { + [ImportingConstructor] + public TestClassC562(TestClassC1124 testclassc1124, TestClassC1125 testclassc1125) + { + } + } + [Export] + public class TestClassC563 + { + [ImportingConstructor] + public TestClassC563(TestClassC1126 testclassc1126, TestClassC1127 testclassc1127) + { + } + } + [Export] + public class TestClassC564 + { + [ImportingConstructor] + public TestClassC564(TestClassC1128 testclassc1128, TestClassC1129 testclassc1129) + { + } + } + [Export] + public class TestClassC565 + { + [ImportingConstructor] + public TestClassC565(TestClassC1130 testclassc1130, TestClassC1131 testclassc1131) + { + } + } + [Export] + public class TestClassC566 + { + [ImportingConstructor] + public TestClassC566(TestClassC1132 testclassc1132, TestClassC1133 testclassc1133) + { + } + } + [Export] + public class TestClassC567 + { + [ImportingConstructor] + public TestClassC567(TestClassC1134 testclassc1134, TestClassC1135 testclassc1135) + { + } + } + [Export] + public class TestClassC568 + { + [ImportingConstructor] + public TestClassC568(TestClassC1136 testclassc1136, TestClassC1137 testclassc1137) + { + } + } + [Export] + public class TestClassC569 + { + [ImportingConstructor] + public TestClassC569(TestClassC1138 testclassc1138, TestClassC1139 testclassc1139) + { + } + } + [Export] + public class TestClassC570 + { + [ImportingConstructor] + public TestClassC570(TestClassC1140 testclassc1140, TestClassC1141 testclassc1141) + { + } + } + [Export] + public class TestClassC571 + { + [ImportingConstructor] + public TestClassC571(TestClassC1142 testclassc1142, TestClassC1143 testclassc1143) + { + } + } + [Export] + public class TestClassC572 + { + [ImportingConstructor] + public TestClassC572(TestClassC1144 testclassc1144, TestClassC1145 testclassc1145) + { + } + } + [Export] + public class TestClassC573 + { + [ImportingConstructor] + public TestClassC573(TestClassC1146 testclassc1146, TestClassC1147 testclassc1147) + { + } + } + [Export] + public class TestClassC574 + { + [ImportingConstructor] + public TestClassC574(TestClassC1148 testclassc1148, TestClassC1149 testclassc1149) + { + } + } + [Export] + public class TestClassC575 + { + [ImportingConstructor] + public TestClassC575(TestClassC1150 testclassc1150, TestClassC1151 testclassc1151) + { + } + } + [Export] + public class TestClassC576 + { + [ImportingConstructor] + public TestClassC576(TestClassC1152 testclassc1152, TestClassC1153 testclassc1153) + { + } + } + [Export] + public class TestClassC577 + { + [ImportingConstructor] + public TestClassC577(TestClassC1154 testclassc1154, TestClassC1155 testclassc1155) + { + } + } + [Export] + public class TestClassC578 + { + [ImportingConstructor] + public TestClassC578(TestClassC1156 testclassc1156, TestClassC1157 testclassc1157) + { + } + } + [Export] + public class TestClassC579 + { + [ImportingConstructor] + public TestClassC579(TestClassC1158 testclassc1158, TestClassC1159 testclassc1159) + { + } + } + [Export] + public class TestClassC580 + { + [ImportingConstructor] + public TestClassC580(TestClassC1160 testclassc1160, TestClassC1161 testclassc1161) + { + } + } + [Export] + public class TestClassC581 + { + [ImportingConstructor] + public TestClassC581(TestClassC1162 testclassc1162, TestClassC1163 testclassc1163) + { + } + } + [Export] + public class TestClassC582 + { + [ImportingConstructor] + public TestClassC582(TestClassC1164 testclassc1164, TestClassC1165 testclassc1165) + { + } + } + [Export] + public class TestClassC583 + { + [ImportingConstructor] + public TestClassC583(TestClassC1166 testclassc1166, TestClassC1167 testclassc1167) + { + } + } + [Export] + public class TestClassC584 + { + [ImportingConstructor] + public TestClassC584(TestClassC1168 testclassc1168, TestClassC1169 testclassc1169) + { + } + } + [Export] + public class TestClassC585 + { + [ImportingConstructor] + public TestClassC585(TestClassC1170 testclassc1170, TestClassC1171 testclassc1171) + { + } + } + [Export] + public class TestClassC586 + { + [ImportingConstructor] + public TestClassC586(TestClassC1172 testclassc1172, TestClassC1173 testclassc1173) + { + } + } + [Export] + public class TestClassC587 + { + [ImportingConstructor] + public TestClassC587(TestClassC1174 testclassc1174, TestClassC1175 testclassc1175) + { + } + } + [Export] + public class TestClassC588 + { + [ImportingConstructor] + public TestClassC588(TestClassC1176 testclassc1176, TestClassC1177 testclassc1177) + { + } + } + [Export] + public class TestClassC589 + { + [ImportingConstructor] + public TestClassC589(TestClassC1178 testclassc1178, TestClassC1179 testclassc1179) + { + } + } + [Export] + public class TestClassC590 + { + [ImportingConstructor] + public TestClassC590(TestClassC1180 testclassc1180, TestClassC1181 testclassc1181) + { + } + } + [Export] + public class TestClassC591 + { + [ImportingConstructor] + public TestClassC591(TestClassC1182 testclassc1182, TestClassC1183 testclassc1183) + { + } + } + [Export] + public class TestClassC592 + { + [ImportingConstructor] + public TestClassC592(TestClassC1184 testclassc1184, TestClassC1185 testclassc1185) + { + } + } + [Export] + public class TestClassC593 + { + [ImportingConstructor] + public TestClassC593(TestClassC1186 testclassc1186, TestClassC1187 testclassc1187) + { + } + } + [Export] + public class TestClassC594 + { + [ImportingConstructor] + public TestClassC594(TestClassC1188 testclassc1188, TestClassC1189 testclassc1189) + { + } + } + [Export] + public class TestClassC595 + { + [ImportingConstructor] + public TestClassC595(TestClassC1190 testclassc1190, TestClassC1191 testclassc1191) + { + } + } + [Export] + public class TestClassC596 + { + [ImportingConstructor] + public TestClassC596(TestClassC1192 testclassc1192, TestClassC1193 testclassc1193) + { + } + } + [Export] + public class TestClassC597 + { + [ImportingConstructor] + public TestClassC597(TestClassC1194 testclassc1194, TestClassC1195 testclassc1195) + { + } + } + [Export] + public class TestClassC598 + { + [ImportingConstructor] + public TestClassC598(TestClassC1196 testclassc1196, TestClassC1197 testclassc1197) + { + } + } + [Export] + public class TestClassC599 + { + [ImportingConstructor] + public TestClassC599(TestClassC1198 testclassc1198, TestClassC1199 testclassc1199) + { + } + } + [Export] + public class TestClassC600 + { + [ImportingConstructor] + public TestClassC600(TestClassC1200 testclassc1200, TestClassC1201 testclassc1201) + { + } + } + [Export] + public class TestClassC601 + { + [ImportingConstructor] + public TestClassC601(TestClassC1202 testclassc1202, TestClassC1203 testclassc1203) + { + } + } + [Export] + public class TestClassC602 + { + [ImportingConstructor] + public TestClassC602(TestClassC1204 testclassc1204, TestClassC1205 testclassc1205) + { + } + } + [Export] + public class TestClassC603 + { + [ImportingConstructor] + public TestClassC603(TestClassC1206 testclassc1206, TestClassC1207 testclassc1207) + { + } + } + [Export] + public class TestClassC604 + { + [ImportingConstructor] + public TestClassC604(TestClassC1208 testclassc1208, TestClassC1209 testclassc1209) + { + } + } + [Export] + public class TestClassC605 + { + [ImportingConstructor] + public TestClassC605(TestClassC1210 testclassc1210, TestClassC1211 testclassc1211) + { + } + } + [Export] + public class TestClassC606 + { + [ImportingConstructor] + public TestClassC606(TestClassC1212 testclassc1212, TestClassC1213 testclassc1213) + { + } + } + [Export] + public class TestClassC607 + { + [ImportingConstructor] + public TestClassC607(TestClassC1214 testclassc1214, TestClassC1215 testclassc1215) + { + } + } + [Export] + public class TestClassC608 + { + [ImportingConstructor] + public TestClassC608(TestClassC1216 testclassc1216, TestClassC1217 testclassc1217) + { + } + } + [Export] + public class TestClassC609 + { + [ImportingConstructor] + public TestClassC609(TestClassC1218 testclassc1218, TestClassC1219 testclassc1219) + { + } + } + [Export] + public class TestClassC610 + { + [ImportingConstructor] + public TestClassC610(TestClassC1220 testclassc1220, TestClassC1221 testclassc1221) + { + } + } + [Export] + public class TestClassC611 + { + [ImportingConstructor] + public TestClassC611(TestClassC1222 testclassc1222, TestClassC1223 testclassc1223) + { + } + } + [Export] + public class TestClassC612 + { + [ImportingConstructor] + public TestClassC612(TestClassC1224 testclassc1224, TestClassC1225 testclassc1225) + { + } + } + [Export] + public class TestClassC613 + { + [ImportingConstructor] + public TestClassC613(TestClassC1226 testclassc1226, TestClassC1227 testclassc1227) + { + } + } + [Export] + public class TestClassC614 + { + [ImportingConstructor] + public TestClassC614(TestClassC1228 testclassc1228, TestClassC1229 testclassc1229) + { + } + } + [Export] + public class TestClassC615 + { + [ImportingConstructor] + public TestClassC615(TestClassC1230 testclassc1230, TestClassC1231 testclassc1231) + { + } + } + [Export] + public class TestClassC616 + { + [ImportingConstructor] + public TestClassC616(TestClassC1232 testclassc1232, TestClassC1233 testclassc1233) + { + } + } + [Export] + public class TestClassC617 + { + [ImportingConstructor] + public TestClassC617(TestClassC1234 testclassc1234, TestClassC1235 testclassc1235) + { + } + } + [Export] + public class TestClassC618 + { + [ImportingConstructor] + public TestClassC618(TestClassC1236 testclassc1236, TestClassC1237 testclassc1237) + { + } + } + [Export] + public class TestClassC619 + { + [ImportingConstructor] + public TestClassC619(TestClassC1238 testclassc1238, TestClassC1239 testclassc1239) + { + } + } + [Export] + public class TestClassC620 + { + [ImportingConstructor] + public TestClassC620(TestClassC1240 testclassc1240, TestClassC1241 testclassc1241) + { + } + } + [Export] + public class TestClassC621 + { + [ImportingConstructor] + public TestClassC621(TestClassC1242 testclassc1242, TestClassC1243 testclassc1243) + { + } + } + [Export] + public class TestClassC622 + { + [ImportingConstructor] + public TestClassC622(TestClassC1244 testclassc1244, TestClassC1245 testclassc1245) + { + } + } + [Export] + public class TestClassC623 + { + [ImportingConstructor] + public TestClassC623(TestClassC1246 testclassc1246, TestClassC1247 testclassc1247) + { + } + } + [Export] + public class TestClassC624 + { + [ImportingConstructor] + public TestClassC624(TestClassC1248 testclassc1248, TestClassC1249 testclassc1249) + { + } + } + [Export] + public class TestClassC625 + { + [ImportingConstructor] + public TestClassC625(TestClassC1250 testclassc1250, TestClassC1251 testclassc1251) + { + } + } + [Export] + public class TestClassC626 + { + [ImportingConstructor] + public TestClassC626(TestClassC1252 testclassc1252, TestClassC1253 testclassc1253) + { + } + } + [Export] + public class TestClassC627 + { + [ImportingConstructor] + public TestClassC627(TestClassC1254 testclassc1254, TestClassC1255 testclassc1255) + { + } + } + [Export] + public class TestClassC628 + { + [ImportingConstructor] + public TestClassC628(TestClassC1256 testclassc1256, TestClassC1257 testclassc1257) + { + } + } + [Export] + public class TestClassC629 + { + [ImportingConstructor] + public TestClassC629(TestClassC1258 testclassc1258, TestClassC1259 testclassc1259) + { + } + } + [Export] + public class TestClassC630 + { + [ImportingConstructor] + public TestClassC630(TestClassC1260 testclassc1260, TestClassC1261 testclassc1261) + { + } + } + [Export] + public class TestClassC631 + { + [ImportingConstructor] + public TestClassC631(TestClassC1262 testclassc1262, TestClassC1263 testclassc1263) + { + } + } + [Export] + public class TestClassC632 + { + [ImportingConstructor] + public TestClassC632(TestClassC1264 testclassc1264, TestClassC1265 testclassc1265) + { + } + } + [Export] + public class TestClassC633 + { + [ImportingConstructor] + public TestClassC633(TestClassC1266 testclassc1266, TestClassC1267 testclassc1267) + { + } + } + [Export] + public class TestClassC634 + { + [ImportingConstructor] + public TestClassC634(TestClassC1268 testclassc1268, TestClassC1269 testclassc1269) + { + } + } + [Export] + public class TestClassC635 + { + [ImportingConstructor] + public TestClassC635(TestClassC1270 testclassc1270, TestClassC1271 testclassc1271) + { + } + } + [Export] + public class TestClassC636 + { + [ImportingConstructor] + public TestClassC636(TestClassC1272 testclassc1272, TestClassC1273 testclassc1273) + { + } + } + [Export] + public class TestClassC637 + { + [ImportingConstructor] + public TestClassC637(TestClassC1274 testclassc1274, TestClassC1275 testclassc1275) + { + } + } + [Export] + public class TestClassC638 + { + [ImportingConstructor] + public TestClassC638(TestClassC1276 testclassc1276, TestClassC1277 testclassc1277) + { + } + } + [Export] + public class TestClassC639 + { + [ImportingConstructor] + public TestClassC639(TestClassC1278 testclassc1278, TestClassC1279 testclassc1279) + { + } + } + [Export] + public class TestClassC640 + { + [ImportingConstructor] + public TestClassC640(TestClassC1280 testclassc1280, TestClassC1281 testclassc1281) + { + } + } + [Export] + public class TestClassC641 + { + [ImportingConstructor] + public TestClassC641(TestClassC1282 testclassc1282, TestClassC1283 testclassc1283) + { + } + } + [Export] + public class TestClassC642 + { + [ImportingConstructor] + public TestClassC642(TestClassC1284 testclassc1284, TestClassC1285 testclassc1285) + { + } + } + [Export] + public class TestClassC643 + { + [ImportingConstructor] + public TestClassC643(TestClassC1286 testclassc1286, TestClassC1287 testclassc1287) + { + } + } + [Export] + public class TestClassC644 + { + [ImportingConstructor] + public TestClassC644(TestClassC1288 testclassc1288, TestClassC1289 testclassc1289) + { + } + } + [Export] + public class TestClassC645 + { + [ImportingConstructor] + public TestClassC645(TestClassC1290 testclassc1290, TestClassC1291 testclassc1291) + { + } + } + [Export] + public class TestClassC646 + { + [ImportingConstructor] + public TestClassC646(TestClassC1292 testclassc1292, TestClassC1293 testclassc1293) + { + } + } + [Export] + public class TestClassC647 + { + [ImportingConstructor] + public TestClassC647(TestClassC1294 testclassc1294, TestClassC1295 testclassc1295) + { + } + } + [Export] + public class TestClassC648 + { + [ImportingConstructor] + public TestClassC648(TestClassC1296 testclassc1296, TestClassC1297 testclassc1297) + { + } + } + [Export] + public class TestClassC649 + { + [ImportingConstructor] + public TestClassC649(TestClassC1298 testclassc1298, TestClassC1299 testclassc1299) + { + } + } + [Export] + public class TestClassC650 + { + [ImportingConstructor] + public TestClassC650(TestClassC1300 testclassc1300, TestClassC1301 testclassc1301) + { + } + } + [Export] + public class TestClassC651 + { + [ImportingConstructor] + public TestClassC651(TestClassC1302 testclassc1302, TestClassC1303 testclassc1303) + { + } + } + [Export] + public class TestClassC652 + { + [ImportingConstructor] + public TestClassC652(TestClassC1304 testclassc1304, TestClassC1305 testclassc1305) + { + } + } + [Export] + public class TestClassC653 + { + [ImportingConstructor] + public TestClassC653(TestClassC1306 testclassc1306, TestClassC1307 testclassc1307) + { + } + } + [Export] + public class TestClassC654 + { + [ImportingConstructor] + public TestClassC654(TestClassC1308 testclassc1308, TestClassC1309 testclassc1309) + { + } + } + [Export] + public class TestClassC655 + { + [ImportingConstructor] + public TestClassC655(TestClassC1310 testclassc1310, TestClassC1311 testclassc1311) + { + } + } + [Export] + public class TestClassC656 + { + [ImportingConstructor] + public TestClassC656(TestClassC1312 testclassc1312, TestClassC1313 testclassc1313) + { + } + } + [Export] + public class TestClassC657 + { + [ImportingConstructor] + public TestClassC657(TestClassC1314 testclassc1314, TestClassC1315 testclassc1315) + { + } + } + [Export] + public class TestClassC658 + { + [ImportingConstructor] + public TestClassC658(TestClassC1316 testclassc1316, TestClassC1317 testclassc1317) + { + } + } + [Export] + public class TestClassC659 + { + [ImportingConstructor] + public TestClassC659(TestClassC1318 testclassc1318, TestClassC1319 testclassc1319) + { + } + } + [Export] + public class TestClassC660 + { + [ImportingConstructor] + public TestClassC660(TestClassC1320 testclassc1320, TestClassC1321 testclassc1321) + { + } + } + [Export] + public class TestClassC661 + { + [ImportingConstructor] + public TestClassC661(TestClassC1322 testclassc1322, TestClassC1323 testclassc1323) + { + } + } + [Export] + public class TestClassC662 + { + [ImportingConstructor] + public TestClassC662(TestClassC1324 testclassc1324, TestClassC1325 testclassc1325) + { + } + } + [Export] + public class TestClassC663 + { + [ImportingConstructor] + public TestClassC663(TestClassC1326 testclassc1326, TestClassC1327 testclassc1327) + { + } + } + [Export] + public class TestClassC664 + { + [ImportingConstructor] + public TestClassC664(TestClassC1328 testclassc1328, TestClassC1329 testclassc1329) + { + } + } + [Export] + public class TestClassC665 + { + [ImportingConstructor] + public TestClassC665(TestClassC1330 testclassc1330, TestClassC1331 testclassc1331) + { + } + } + [Export] + public class TestClassC666 + { + [ImportingConstructor] + public TestClassC666(TestClassC1332 testclassc1332, TestClassC1333 testclassc1333) + { + } + } + [Export] + public class TestClassC667 + { + [ImportingConstructor] + public TestClassC667(TestClassC1334 testclassc1334, TestClassC1335 testclassc1335) + { + } + } + [Export] + public class TestClassC668 + { + [ImportingConstructor] + public TestClassC668(TestClassC1336 testclassc1336, TestClassC1337 testclassc1337) + { + } + } + [Export] + public class TestClassC669 + { + [ImportingConstructor] + public TestClassC669(TestClassC1338 testclassc1338, TestClassC1339 testclassc1339) + { + } + } + [Export] + public class TestClassC670 + { + [ImportingConstructor] + public TestClassC670(TestClassC1340 testclassc1340, TestClassC1341 testclassc1341) + { + } + } + [Export] + public class TestClassC671 + { + [ImportingConstructor] + public TestClassC671(TestClassC1342 testclassc1342, TestClassC1343 testclassc1343) + { + } + } + [Export] + public class TestClassC672 + { + [ImportingConstructor] + public TestClassC672(TestClassC1344 testclassc1344, TestClassC1345 testclassc1345) + { + } + } + [Export] + public class TestClassC673 + { + [ImportingConstructor] + public TestClassC673(TestClassC1346 testclassc1346, TestClassC1347 testclassc1347) + { + } + } + [Export] + public class TestClassC674 + { + [ImportingConstructor] + public TestClassC674(TestClassC1348 testclassc1348, TestClassC1349 testclassc1349) + { + } + } + [Export] + public class TestClassC675 + { + [ImportingConstructor] + public TestClassC675(TestClassC1350 testclassc1350, TestClassC1351 testclassc1351) + { + } + } + [Export] + public class TestClassC676 + { + [ImportingConstructor] + public TestClassC676(TestClassC1352 testclassc1352, TestClassC1353 testclassc1353) + { + } + } + [Export] + public class TestClassC677 + { + [ImportingConstructor] + public TestClassC677(TestClassC1354 testclassc1354, TestClassC1355 testclassc1355) + { + } + } + [Export] + public class TestClassC678 + { + [ImportingConstructor] + public TestClassC678(TestClassC1356 testclassc1356, TestClassC1357 testclassc1357) + { + } + } + [Export] + public class TestClassC679 + { + [ImportingConstructor] + public TestClassC679(TestClassC1358 testclassc1358, TestClassC1359 testclassc1359) + { + } + } + [Export] + public class TestClassC680 + { + [ImportingConstructor] + public TestClassC680(TestClassC1360 testclassc1360, TestClassC1361 testclassc1361) + { + } + } + [Export] + public class TestClassC681 + { + [ImportingConstructor] + public TestClassC681(TestClassC1362 testclassc1362, TestClassC1363 testclassc1363) + { + } + } + [Export] + public class TestClassC682 + { + [ImportingConstructor] + public TestClassC682(TestClassC1364 testclassc1364, TestClassC1365 testclassc1365) + { + } + } + [Export] + public class TestClassC683 + { + [ImportingConstructor] + public TestClassC683(TestClassC1366 testclassc1366, TestClassC1367 testclassc1367) + { + } + } + [Export] + public class TestClassC684 + { + [ImportingConstructor] + public TestClassC684(TestClassC1368 testclassc1368, TestClassC1369 testclassc1369) + { + } + } + [Export] + public class TestClassC685 + { + [ImportingConstructor] + public TestClassC685(TestClassC1370 testclassc1370, TestClassC1371 testclassc1371) + { + } + } + [Export] + public class TestClassC686 + { + [ImportingConstructor] + public TestClassC686(TestClassC1372 testclassc1372, TestClassC1373 testclassc1373) + { + } + } + [Export] + public class TestClassC687 + { + [ImportingConstructor] + public TestClassC687(TestClassC1374 testclassc1374, TestClassC1375 testclassc1375) + { + } + } + [Export] + public class TestClassC688 + { + [ImportingConstructor] + public TestClassC688(TestClassC1376 testclassc1376, TestClassC1377 testclassc1377) + { + } + } + [Export] + public class TestClassC689 + { + [ImportingConstructor] + public TestClassC689(TestClassC1378 testclassc1378, TestClassC1379 testclassc1379) + { + } + } + [Export] + public class TestClassC690 + { + [ImportingConstructor] + public TestClassC690(TestClassC1380 testclassc1380, TestClassC1381 testclassc1381) + { + } + } + [Export] + public class TestClassC691 + { + [ImportingConstructor] + public TestClassC691(TestClassC1382 testclassc1382, TestClassC1383 testclassc1383) + { + } + } + [Export] + public class TestClassC692 + { + [ImportingConstructor] + public TestClassC692(TestClassC1384 testclassc1384, TestClassC1385 testclassc1385) + { + } + } + [Export] + public class TestClassC693 + { + [ImportingConstructor] + public TestClassC693(TestClassC1386 testclassc1386, TestClassC1387 testclassc1387) + { + } + } + [Export] + public class TestClassC694 + { + [ImportingConstructor] + public TestClassC694(TestClassC1388 testclassc1388, TestClassC1389 testclassc1389) + { + } + } + [Export] + public class TestClassC695 + { + [ImportingConstructor] + public TestClassC695(TestClassC1390 testclassc1390, TestClassC1391 testclassc1391) + { + } + } + [Export] + public class TestClassC696 + { + [ImportingConstructor] + public TestClassC696(TestClassC1392 testclassc1392, TestClassC1393 testclassc1393) + { + } + } + [Export] + public class TestClassC697 + { + [ImportingConstructor] + public TestClassC697(TestClassC1394 testclassc1394, TestClassC1395 testclassc1395) + { + } + } + [Export] + public class TestClassC698 + { + [ImportingConstructor] + public TestClassC698(TestClassC1396 testclassc1396, TestClassC1397 testclassc1397) + { + } + } + [Export] + public class TestClassC699 + { + [ImportingConstructor] + public TestClassC699(TestClassC1398 testclassc1398, TestClassC1399 testclassc1399) + { + } + } + [Export] + public class TestClassC700 + { + [ImportingConstructor] + public TestClassC700(TestClassC1400 testclassc1400, TestClassC1401 testclassc1401) + { + } + } + [Export] + public class TestClassC701 + { + [ImportingConstructor] + public TestClassC701(TestClassC1402 testclassc1402, TestClassC1403 testclassc1403) + { + } + } + [Export] + public class TestClassC702 + { + [ImportingConstructor] + public TestClassC702(TestClassC1404 testclassc1404, TestClassC1405 testclassc1405) + { + } + } + [Export] + public class TestClassC703 + { + [ImportingConstructor] + public TestClassC703(TestClassC1406 testclassc1406, TestClassC1407 testclassc1407) + { + } + } + [Export] + public class TestClassC704 + { + [ImportingConstructor] + public TestClassC704(TestClassC1408 testclassc1408, TestClassC1409 testclassc1409) + { + } + } + [Export] + public class TestClassC705 + { + [ImportingConstructor] + public TestClassC705(TestClassC1410 testclassc1410, TestClassC1411 testclassc1411) + { + } + } + [Export] + public class TestClassC706 + { + [ImportingConstructor] + public TestClassC706(TestClassC1412 testclassc1412, TestClassC1413 testclassc1413) + { + } + } + [Export] + public class TestClassC707 + { + [ImportingConstructor] + public TestClassC707(TestClassC1414 testclassc1414, TestClassC1415 testclassc1415) + { + } + } + [Export] + public class TestClassC708 + { + [ImportingConstructor] + public TestClassC708(TestClassC1416 testclassc1416, TestClassC1417 testclassc1417) + { + } + } + [Export] + public class TestClassC709 + { + [ImportingConstructor] + public TestClassC709(TestClassC1418 testclassc1418, TestClassC1419 testclassc1419) + { + } + } + [Export] + public class TestClassC710 + { + [ImportingConstructor] + public TestClassC710(TestClassC1420 testclassc1420, TestClassC1421 testclassc1421) + { + } + } + [Export] + public class TestClassC711 + { + [ImportingConstructor] + public TestClassC711(TestClassC1422 testclassc1422, TestClassC1423 testclassc1423) + { + } + } + [Export] + public class TestClassC712 + { + [ImportingConstructor] + public TestClassC712(TestClassC1424 testclassc1424, TestClassC1425 testclassc1425) + { + } + } + [Export] + public class TestClassC713 + { + [ImportingConstructor] + public TestClassC713(TestClassC1426 testclassc1426, TestClassC1427 testclassc1427) + { + } + } + [Export] + public class TestClassC714 + { + [ImportingConstructor] + public TestClassC714(TestClassC1428 testclassc1428, TestClassC1429 testclassc1429) + { + } + } + [Export] + public class TestClassC715 + { + [ImportingConstructor] + public TestClassC715(TestClassC1430 testclassc1430, TestClassC1431 testclassc1431) + { + } + } + [Export] + public class TestClassC716 + { + [ImportingConstructor] + public TestClassC716(TestClassC1432 testclassc1432, TestClassC1433 testclassc1433) + { + } + } + [Export] + public class TestClassC717 + { + [ImportingConstructor] + public TestClassC717(TestClassC1434 testclassc1434, TestClassC1435 testclassc1435) + { + } + } + [Export] + public class TestClassC718 + { + [ImportingConstructor] + public TestClassC718(TestClassC1436 testclassc1436, TestClassC1437 testclassc1437) + { + } + } + [Export] + public class TestClassC719 + { + [ImportingConstructor] + public TestClassC719(TestClassC1438 testclassc1438, TestClassC1439 testclassc1439) + { + } + } + [Export] + public class TestClassC720 + { + [ImportingConstructor] + public TestClassC720(TestClassC1440 testclassc1440, TestClassC1441 testclassc1441) + { + } + } + [Export] + public class TestClassC721 + { + [ImportingConstructor] + public TestClassC721(TestClassC1442 testclassc1442, TestClassC1443 testclassc1443) + { + } + } + [Export] + public class TestClassC722 + { + [ImportingConstructor] + public TestClassC722(TestClassC1444 testclassc1444, TestClassC1445 testclassc1445) + { + } + } + [Export] + public class TestClassC723 + { + [ImportingConstructor] + public TestClassC723(TestClassC1446 testclassc1446, TestClassC1447 testclassc1447) + { + } + } + [Export] + public class TestClassC724 + { + [ImportingConstructor] + public TestClassC724(TestClassC1448 testclassc1448, TestClassC1449 testclassc1449) + { + } + } + [Export] + public class TestClassC725 + { + [ImportingConstructor] + public TestClassC725(TestClassC1450 testclassc1450, TestClassC1451 testclassc1451) + { + } + } + [Export] + public class TestClassC726 + { + [ImportingConstructor] + public TestClassC726(TestClassC1452 testclassc1452, TestClassC1453 testclassc1453) + { + } + } + [Export] + public class TestClassC727 + { + [ImportingConstructor] + public TestClassC727(TestClassC1454 testclassc1454, TestClassC1455 testclassc1455) + { + } + } + [Export] + public class TestClassC728 + { + [ImportingConstructor] + public TestClassC728(TestClassC1456 testclassc1456, TestClassC1457 testclassc1457) + { + } + } + [Export] + public class TestClassC729 + { + [ImportingConstructor] + public TestClassC729(TestClassC1458 testclassc1458, TestClassC1459 testclassc1459) + { + } + } + [Export] + public class TestClassC730 + { + [ImportingConstructor] + public TestClassC730(TestClassC1460 testclassc1460, TestClassC1461 testclassc1461) + { + } + } + [Export] + public class TestClassC731 + { + [ImportingConstructor] + public TestClassC731(TestClassC1462 testclassc1462, TestClassC1463 testclassc1463) + { + } + } + [Export] + public class TestClassC732 + { + [ImportingConstructor] + public TestClassC732(TestClassC1464 testclassc1464, TestClassC1465 testclassc1465) + { + } + } + [Export] + public class TestClassC733 + { + [ImportingConstructor] + public TestClassC733(TestClassC1466 testclassc1466, TestClassC1467 testclassc1467) + { + } + } + [Export] + public class TestClassC734 + { + [ImportingConstructor] + public TestClassC734(TestClassC1468 testclassc1468, TestClassC1469 testclassc1469) + { + } + } + [Export] + public class TestClassC735 + { + [ImportingConstructor] + public TestClassC735(TestClassC1470 testclassc1470, TestClassC1471 testclassc1471) + { + } + } + [Export] + public class TestClassC736 + { + [ImportingConstructor] + public TestClassC736(TestClassC1472 testclassc1472, TestClassC1473 testclassc1473) + { + } + } + [Export] + public class TestClassC737 + { + [ImportingConstructor] + public TestClassC737(TestClassC1474 testclassc1474, TestClassC1475 testclassc1475) + { + } + } + [Export] + public class TestClassC738 + { + [ImportingConstructor] + public TestClassC738(TestClassC1476 testclassc1476, TestClassC1477 testclassc1477) + { + } + } + [Export] + public class TestClassC739 + { + [ImportingConstructor] + public TestClassC739(TestClassC1478 testclassc1478, TestClassC1479 testclassc1479) + { + } + } + [Export] + public class TestClassC740 + { + [ImportingConstructor] + public TestClassC740(TestClassC1480 testclassc1480, TestClassC1481 testclassc1481) + { + } + } + [Export] + public class TestClassC741 + { + [ImportingConstructor] + public TestClassC741(TestClassC1482 testclassc1482, TestClassC1483 testclassc1483) + { + } + } + [Export] + public class TestClassC742 + { + [ImportingConstructor] + public TestClassC742(TestClassC1484 testclassc1484, TestClassC1485 testclassc1485) + { + } + } + [Export] + public class TestClassC743 + { + [ImportingConstructor] + public TestClassC743(TestClassC1486 testclassc1486, TestClassC1487 testclassc1487) + { + } + } + [Export] + public class TestClassC744 + { + [ImportingConstructor] + public TestClassC744(TestClassC1488 testclassc1488, TestClassC1489 testclassc1489) + { + } + } + [Export] + public class TestClassC745 + { + [ImportingConstructor] + public TestClassC745(TestClassC1490 testclassc1490, TestClassC1491 testclassc1491) + { + } + } + [Export] + public class TestClassC746 + { + [ImportingConstructor] + public TestClassC746(TestClassC1492 testclassc1492, TestClassC1493 testclassc1493) + { + } + } + [Export] + public class TestClassC747 + { + [ImportingConstructor] + public TestClassC747(TestClassC1494 testclassc1494, TestClassC1495 testclassc1495) + { + } + } + [Export] + public class TestClassC748 + { + [ImportingConstructor] + public TestClassC748(TestClassC1496 testclassc1496, TestClassC1497 testclassc1497) + { + } + } + [Export] + public class TestClassC749 + { + [ImportingConstructor] + public TestClassC749(TestClassC1498 testclassc1498, TestClassC1499 testclassc1499) + { + } + } + [Export] + public class TestClassC750 + { + [ImportingConstructor] + public TestClassC750(TestClassC1500 testclassc1500, TestClassC1501 testclassc1501) + { + } + } + [Export] + public class TestClassC751 + { + [ImportingConstructor] + public TestClassC751(TestClassC1502 testclassc1502, TestClassC1503 testclassc1503) + { + } + } + [Export] + public class TestClassC752 + { + [ImportingConstructor] + public TestClassC752(TestClassC1504 testclassc1504, TestClassC1505 testclassc1505) + { + } + } + [Export] + public class TestClassC753 + { + [ImportingConstructor] + public TestClassC753(TestClassC1506 testclassc1506, TestClassC1507 testclassc1507) + { + } + } + [Export] + public class TestClassC754 + { + [ImportingConstructor] + public TestClassC754(TestClassC1508 testclassc1508, TestClassC1509 testclassc1509) + { + } + } + [Export] + public class TestClassC755 + { + [ImportingConstructor] + public TestClassC755(TestClassC1510 testclassc1510, TestClassC1511 testclassc1511) + { + } + } + [Export] + public class TestClassC756 + { + [ImportingConstructor] + public TestClassC756(TestClassC1512 testclassc1512, TestClassC1513 testclassc1513) + { + } + } + [Export] + public class TestClassC757 + { + [ImportingConstructor] + public TestClassC757(TestClassC1514 testclassc1514, TestClassC1515 testclassc1515) + { + } + } + [Export] + public class TestClassC758 + { + [ImportingConstructor] + public TestClassC758(TestClassC1516 testclassc1516, TestClassC1517 testclassc1517) + { + } + } + [Export] + public class TestClassC759 + { + [ImportingConstructor] + public TestClassC759(TestClassC1518 testclassc1518, TestClassC1519 testclassc1519) + { + } + } + [Export] + public class TestClassC760 + { + [ImportingConstructor] + public TestClassC760(TestClassC1520 testclassc1520, TestClassC1521 testclassc1521) + { + } + } + [Export] + public class TestClassC761 + { + [ImportingConstructor] + public TestClassC761(TestClassC1522 testclassc1522, TestClassC1523 testclassc1523) + { + } + } + [Export] + public class TestClassC762 + { + [ImportingConstructor] + public TestClassC762(TestClassC1524 testclassc1524, TestClassC1525 testclassc1525) + { + } + } + [Export] + public class TestClassC763 + { + [ImportingConstructor] + public TestClassC763(TestClassC1526 testclassc1526, TestClassC1527 testclassc1527) + { + } + } + [Export] + public class TestClassC764 + { + [ImportingConstructor] + public TestClassC764(TestClassC1528 testclassc1528, TestClassC1529 testclassc1529) + { + } + } + [Export] + public class TestClassC765 + { + [ImportingConstructor] + public TestClassC765(TestClassC1530 testclassc1530, TestClassC1531 testclassc1531) + { + } + } + [Export] + public class TestClassC766 + { + [ImportingConstructor] + public TestClassC766(TestClassC1532 testclassc1532, TestClassC1533 testclassc1533) + { + } + } + [Export] + public class TestClassC767 + { + [ImportingConstructor] + public TestClassC767(TestClassC1534 testclassc1534, TestClassC1535 testclassc1535) + { + } + } + [Export] + public class TestClassC768 + { + [ImportingConstructor] + public TestClassC768(TestClassC1536 testclassc1536, TestClassC1537 testclassc1537) + { + } + } + [Export] + public class TestClassC769 + { + [ImportingConstructor] + public TestClassC769(TestClassC1538 testclassc1538, TestClassC1539 testclassc1539) + { + } + } + [Export] + public class TestClassC770 + { + [ImportingConstructor] + public TestClassC770(TestClassC1540 testclassc1540, TestClassC1541 testclassc1541) + { + } + } + [Export] + public class TestClassC771 + { + [ImportingConstructor] + public TestClassC771(TestClassC1542 testclassc1542, TestClassC1543 testclassc1543) + { + } + } + [Export] + public class TestClassC772 + { + [ImportingConstructor] + public TestClassC772(TestClassC1544 testclassc1544, TestClassC1545 testclassc1545) + { + } + } + [Export] + public class TestClassC773 + { + [ImportingConstructor] + public TestClassC773(TestClassC1546 testclassc1546, TestClassC1547 testclassc1547) + { + } + } + [Export] + public class TestClassC774 + { + [ImportingConstructor] + public TestClassC774(TestClassC1548 testclassc1548, TestClassC1549 testclassc1549) + { + } + } + [Export] + public class TestClassC775 + { + [ImportingConstructor] + public TestClassC775(TestClassC1550 testclassc1550, TestClassC1551 testclassc1551) + { + } + } + [Export] + public class TestClassC776 + { + [ImportingConstructor] + public TestClassC776(TestClassC1552 testclassc1552, TestClassC1553 testclassc1553) + { + } + } + [Export] + public class TestClassC777 + { + [ImportingConstructor] + public TestClassC777(TestClassC1554 testclassc1554, TestClassC1555 testclassc1555) + { + } + } + [Export] + public class TestClassC778 + { + [ImportingConstructor] + public TestClassC778(TestClassC1556 testclassc1556, TestClassC1557 testclassc1557) + { + } + } + [Export] + public class TestClassC779 + { + [ImportingConstructor] + public TestClassC779(TestClassC1558 testclassc1558, TestClassC1559 testclassc1559) + { + } + } + [Export] + public class TestClassC780 + { + [ImportingConstructor] + public TestClassC780(TestClassC1560 testclassc1560, TestClassC1561 testclassc1561) + { + } + } + [Export] + public class TestClassC781 + { + [ImportingConstructor] + public TestClassC781(TestClassC1562 testclassc1562, TestClassC1563 testclassc1563) + { + } + } + [Export] + public class TestClassC782 + { + [ImportingConstructor] + public TestClassC782(TestClassC1564 testclassc1564, TestClassC1565 testclassc1565) + { + } + } + [Export] + public class TestClassC783 + { + [ImportingConstructor] + public TestClassC783(TestClassC1566 testclassc1566, TestClassC1567 testclassc1567) + { + } + } + [Export] + public class TestClassC784 + { + [ImportingConstructor] + public TestClassC784(TestClassC1568 testclassc1568, TestClassC1569 testclassc1569) + { + } + } + [Export] + public class TestClassC785 + { + [ImportingConstructor] + public TestClassC785(TestClassC1570 testclassc1570, TestClassC1571 testclassc1571) + { + } + } + [Export] + public class TestClassC786 + { + [ImportingConstructor] + public TestClassC786(TestClassC1572 testclassc1572, TestClassC1573 testclassc1573) + { + } + } + [Export] + public class TestClassC787 + { + [ImportingConstructor] + public TestClassC787(TestClassC1574 testclassc1574, TestClassC1575 testclassc1575) + { + } + } + [Export] + public class TestClassC788 + { + [ImportingConstructor] + public TestClassC788(TestClassC1576 testclassc1576, TestClassC1577 testclassc1577) + { + } + } + [Export] + public class TestClassC789 + { + [ImportingConstructor] + public TestClassC789(TestClassC1578 testclassc1578, TestClassC1579 testclassc1579) + { + } + } + [Export] + public class TestClassC790 + { + [ImportingConstructor] + public TestClassC790(TestClassC1580 testclassc1580, TestClassC1581 testclassc1581) + { + } + } + [Export] + public class TestClassC791 + { + [ImportingConstructor] + public TestClassC791(TestClassC1582 testclassc1582, TestClassC1583 testclassc1583) + { + } + } + [Export] + public class TestClassC792 + { + [ImportingConstructor] + public TestClassC792(TestClassC1584 testclassc1584, TestClassC1585 testclassc1585) + { + } + } + [Export] + public class TestClassC793 + { + [ImportingConstructor] + public TestClassC793(TestClassC1586 testclassc1586, TestClassC1587 testclassc1587) + { + } + } + [Export] + public class TestClassC794 + { + [ImportingConstructor] + public TestClassC794(TestClassC1588 testclassc1588, TestClassC1589 testclassc1589) + { + } + } + [Export] + public class TestClassC795 + { + [ImportingConstructor] + public TestClassC795(TestClassC1590 testclassc1590, TestClassC1591 testclassc1591) + { + } + } + [Export] + public class TestClassC796 + { + [ImportingConstructor] + public TestClassC796(TestClassC1592 testclassc1592, TestClassC1593 testclassc1593) + { + } + } + [Export] + public class TestClassC797 + { + [ImportingConstructor] + public TestClassC797(TestClassC1594 testclassc1594, TestClassC1595 testclassc1595) + { + } + } + [Export] + public class TestClassC798 + { + [ImportingConstructor] + public TestClassC798(TestClassC1596 testclassc1596, TestClassC1597 testclassc1597) + { + } + } + [Export] + public class TestClassC799 + { + [ImportingConstructor] + public TestClassC799(TestClassC1598 testclassc1598, TestClassC1599 testclassc1599) + { + } + } + [Export] + public class TestClassC800 + { + [ImportingConstructor] + public TestClassC800(TestClassC1600 testclassc1600, TestClassC1601 testclassc1601) + { + } + } + [Export] + public class TestClassC801 + { + [ImportingConstructor] + public TestClassC801(TestClassC1602 testclassc1602, TestClassC1603 testclassc1603) + { + } + } + [Export] + public class TestClassC802 + { + [ImportingConstructor] + public TestClassC802(TestClassC1604 testclassc1604, TestClassC1605 testclassc1605) + { + } + } + [Export] + public class TestClassC803 + { + [ImportingConstructor] + public TestClassC803(TestClassC1606 testclassc1606, TestClassC1607 testclassc1607) + { + } + } + [Export] + public class TestClassC804 + { + [ImportingConstructor] + public TestClassC804(TestClassC1608 testclassc1608, TestClassC1609 testclassc1609) + { + } + } + [Export] + public class TestClassC805 + { + [ImportingConstructor] + public TestClassC805(TestClassC1610 testclassc1610, TestClassC1611 testclassc1611) + { + } + } + [Export] + public class TestClassC806 + { + [ImportingConstructor] + public TestClassC806(TestClassC1612 testclassc1612, TestClassC1613 testclassc1613) + { + } + } + [Export] + public class TestClassC807 + { + [ImportingConstructor] + public TestClassC807(TestClassC1614 testclassc1614, TestClassC1615 testclassc1615) + { + } + } + [Export] + public class TestClassC808 + { + [ImportingConstructor] + public TestClassC808(TestClassC1616 testclassc1616, TestClassC1617 testclassc1617) + { + } + } + [Export] + public class TestClassC809 + { + [ImportingConstructor] + public TestClassC809(TestClassC1618 testclassc1618, TestClassC1619 testclassc1619) + { + } + } + [Export] + public class TestClassC810 + { + [ImportingConstructor] + public TestClassC810(TestClassC1620 testclassc1620, TestClassC1621 testclassc1621) + { + } + } + [Export] + public class TestClassC811 + { + [ImportingConstructor] + public TestClassC811(TestClassC1622 testclassc1622, TestClassC1623 testclassc1623) + { + } + } + [Export] + public class TestClassC812 + { + [ImportingConstructor] + public TestClassC812(TestClassC1624 testclassc1624, TestClassC1625 testclassc1625) + { + } + } + [Export] + public class TestClassC813 + { + [ImportingConstructor] + public TestClassC813(TestClassC1626 testclassc1626, TestClassC1627 testclassc1627) + { + } + } + [Export] + public class TestClassC814 + { + [ImportingConstructor] + public TestClassC814(TestClassC1628 testclassc1628, TestClassC1629 testclassc1629) + { + } + } + [Export] + public class TestClassC815 + { + [ImportingConstructor] + public TestClassC815(TestClassC1630 testclassc1630, TestClassC1631 testclassc1631) + { + } + } + [Export] + public class TestClassC816 + { + [ImportingConstructor] + public TestClassC816(TestClassC1632 testclassc1632, TestClassC1633 testclassc1633) + { + } + } + [Export] + public class TestClassC817 + { + [ImportingConstructor] + public TestClassC817(TestClassC1634 testclassc1634, TestClassC1635 testclassc1635) + { + } + } + [Export] + public class TestClassC818 + { + [ImportingConstructor] + public TestClassC818(TestClassC1636 testclassc1636, TestClassC1637 testclassc1637) + { + } + } + [Export] + public class TestClassC819 + { + [ImportingConstructor] + public TestClassC819(TestClassC1638 testclassc1638, TestClassC1639 testclassc1639) + { + } + } + [Export] + public class TestClassC820 + { + [ImportingConstructor] + public TestClassC820(TestClassC1640 testclassc1640, TestClassC1641 testclassc1641) + { + } + } + [Export] + public class TestClassC821 + { + [ImportingConstructor] + public TestClassC821(TestClassC1642 testclassc1642, TestClassC1643 testclassc1643) + { + } + } + [Export] + public class TestClassC822 + { + [ImportingConstructor] + public TestClassC822(TestClassC1644 testclassc1644, TestClassC1645 testclassc1645) + { + } + } + [Export] + public class TestClassC823 + { + [ImportingConstructor] + public TestClassC823(TestClassC1646 testclassc1646, TestClassC1647 testclassc1647) + { + } + } + [Export] + public class TestClassC824 + { + [ImportingConstructor] + public TestClassC824(TestClassC1648 testclassc1648, TestClassC1649 testclassc1649) + { + } + } + [Export] + public class TestClassC825 + { + [ImportingConstructor] + public TestClassC825(TestClassC1650 testclassc1650, TestClassC1651 testclassc1651) + { + } + } + [Export] + public class TestClassC826 + { + [ImportingConstructor] + public TestClassC826(TestClassC1652 testclassc1652, TestClassC1653 testclassc1653) + { + } + } + [Export] + public class TestClassC827 + { + [ImportingConstructor] + public TestClassC827(TestClassC1654 testclassc1654, TestClassC1655 testclassc1655) + { + } + } + [Export] + public class TestClassC828 + { + [ImportingConstructor] + public TestClassC828(TestClassC1656 testclassc1656, TestClassC1657 testclassc1657) + { + } + } + [Export] + public class TestClassC829 + { + [ImportingConstructor] + public TestClassC829(TestClassC1658 testclassc1658, TestClassC1659 testclassc1659) + { + } + } + [Export] + public class TestClassC830 + { + [ImportingConstructor] + public TestClassC830(TestClassC1660 testclassc1660, TestClassC1661 testclassc1661) + { + } + } + [Export] + public class TestClassC831 + { + [ImportingConstructor] + public TestClassC831(TestClassC1662 testclassc1662, TestClassC1663 testclassc1663) + { + } + } + [Export] + public class TestClassC832 + { + [ImportingConstructor] + public TestClassC832(TestClassC1664 testclassc1664, TestClassC1665 testclassc1665) + { + } + } + [Export] + public class TestClassC833 + { + [ImportingConstructor] + public TestClassC833(TestClassC1666 testclassc1666, TestClassC1667 testclassc1667) + { + } + } + [Export] + public class TestClassC834 + { + [ImportingConstructor] + public TestClassC834(TestClassC1668 testclassc1668, TestClassC1669 testclassc1669) + { + } + } + [Export] + public class TestClassC835 + { + [ImportingConstructor] + public TestClassC835(TestClassC1670 testclassc1670, TestClassC1671 testclassc1671) + { + } + } + [Export] + public class TestClassC836 + { + [ImportingConstructor] + public TestClassC836(TestClassC1672 testclassc1672, TestClassC1673 testclassc1673) + { + } + } + [Export] + public class TestClassC837 + { + [ImportingConstructor] + public TestClassC837(TestClassC1674 testclassc1674, TestClassC1675 testclassc1675) + { + } + } + [Export] + public class TestClassC838 + { + [ImportingConstructor] + public TestClassC838(TestClassC1676 testclassc1676, TestClassC1677 testclassc1677) + { + } + } + [Export] + public class TestClassC839 + { + [ImportingConstructor] + public TestClassC839(TestClassC1678 testclassc1678, TestClassC1679 testclassc1679) + { + } + } + [Export] + public class TestClassC840 + { + [ImportingConstructor] + public TestClassC840(TestClassC1680 testclassc1680, TestClassC1681 testclassc1681) + { + } + } + [Export] + public class TestClassC841 + { + [ImportingConstructor] + public TestClassC841(TestClassC1682 testclassc1682, TestClassC1683 testclassc1683) + { + } + } + [Export] + public class TestClassC842 + { + [ImportingConstructor] + public TestClassC842(TestClassC1684 testclassc1684, TestClassC1685 testclassc1685) + { + } + } + [Export] + public class TestClassC843 + { + [ImportingConstructor] + public TestClassC843(TestClassC1686 testclassc1686, TestClassC1687 testclassc1687) + { + } + } + [Export] + public class TestClassC844 + { + [ImportingConstructor] + public TestClassC844(TestClassC1688 testclassc1688, TestClassC1689 testclassc1689) + { + } + } + [Export] + public class TestClassC845 + { + [ImportingConstructor] + public TestClassC845(TestClassC1690 testclassc1690, TestClassC1691 testclassc1691) + { + } + } + [Export] + public class TestClassC846 + { + [ImportingConstructor] + public TestClassC846(TestClassC1692 testclassc1692, TestClassC1693 testclassc1693) + { + } + } + [Export] + public class TestClassC847 + { + [ImportingConstructor] + public TestClassC847(TestClassC1694 testclassc1694, TestClassC1695 testclassc1695) + { + } + } + [Export] + public class TestClassC848 + { + [ImportingConstructor] + public TestClassC848(TestClassC1696 testclassc1696, TestClassC1697 testclassc1697) + { + } + } + [Export] + public class TestClassC849 + { + [ImportingConstructor] + public TestClassC849(TestClassC1698 testclassc1698, TestClassC1699 testclassc1699) + { + } + } + [Export] + public class TestClassC850 + { + [ImportingConstructor] + public TestClassC850(TestClassC1700 testclassc1700, TestClassC1701 testclassc1701) + { + } + } + [Export] + public class TestClassC851 + { + [ImportingConstructor] + public TestClassC851(TestClassC1702 testclassc1702, TestClassC1703 testclassc1703) + { + } + } + [Export] + public class TestClassC852 + { + [ImportingConstructor] + public TestClassC852(TestClassC1704 testclassc1704, TestClassC1705 testclassc1705) + { + } + } + [Export] + public class TestClassC853 + { + [ImportingConstructor] + public TestClassC853(TestClassC1706 testclassc1706, TestClassC1707 testclassc1707) + { + } + } + [Export] + public class TestClassC854 + { + [ImportingConstructor] + public TestClassC854(TestClassC1708 testclassc1708, TestClassC1709 testclassc1709) + { + } + } + [Export] + public class TestClassC855 + { + [ImportingConstructor] + public TestClassC855(TestClassC1710 testclassc1710, TestClassC1711 testclassc1711) + { + } + } + [Export] + public class TestClassC856 + { + [ImportingConstructor] + public TestClassC856(TestClassC1712 testclassc1712, TestClassC1713 testclassc1713) + { + } + } + [Export] + public class TestClassC857 + { + [ImportingConstructor] + public TestClassC857(TestClassC1714 testclassc1714, TestClassC1715 testclassc1715) + { + } + } + [Export] + public class TestClassC858 + { + [ImportingConstructor] + public TestClassC858(TestClassC1716 testclassc1716, TestClassC1717 testclassc1717) + { + } + } + [Export] + public class TestClassC859 + { + [ImportingConstructor] + public TestClassC859(TestClassC1718 testclassc1718, TestClassC1719 testclassc1719) + { + } + } + [Export] + public class TestClassC860 + { + [ImportingConstructor] + public TestClassC860(TestClassC1720 testclassc1720, TestClassC1721 testclassc1721) + { + } + } + [Export] + public class TestClassC861 + { + [ImportingConstructor] + public TestClassC861(TestClassC1722 testclassc1722, TestClassC1723 testclassc1723) + { + } + } + [Export] + public class TestClassC862 + { + [ImportingConstructor] + public TestClassC862(TestClassC1724 testclassc1724, TestClassC1725 testclassc1725) + { + } + } + [Export] + public class TestClassC863 + { + [ImportingConstructor] + public TestClassC863(TestClassC1726 testclassc1726, TestClassC1727 testclassc1727) + { + } + } + [Export] + public class TestClassC864 + { + [ImportingConstructor] + public TestClassC864(TestClassC1728 testclassc1728, TestClassC1729 testclassc1729) + { + } + } + [Export] + public class TestClassC865 + { + [ImportingConstructor] + public TestClassC865(TestClassC1730 testclassc1730, TestClassC1731 testclassc1731) + { + } + } + [Export] + public class TestClassC866 + { + [ImportingConstructor] + public TestClassC866(TestClassC1732 testclassc1732, TestClassC1733 testclassc1733) + { + } + } + [Export] + public class TestClassC867 + { + [ImportingConstructor] + public TestClassC867(TestClassC1734 testclassc1734, TestClassC1735 testclassc1735) + { + } + } + [Export] + public class TestClassC868 + { + [ImportingConstructor] + public TestClassC868(TestClassC1736 testclassc1736, TestClassC1737 testclassc1737) + { + } + } + [Export] + public class TestClassC869 + { + [ImportingConstructor] + public TestClassC869(TestClassC1738 testclassc1738, TestClassC1739 testclassc1739) + { + } + } + [Export] + public class TestClassC870 + { + [ImportingConstructor] + public TestClassC870(TestClassC1740 testclassc1740, TestClassC1741 testclassc1741) + { + } + } + [Export] + public class TestClassC871 + { + [ImportingConstructor] + public TestClassC871(TestClassC1742 testclassc1742, TestClassC1743 testclassc1743) + { + } + } + [Export] + public class TestClassC872 + { + [ImportingConstructor] + public TestClassC872(TestClassC1744 testclassc1744, TestClassC1745 testclassc1745) + { + } + } + [Export] + public class TestClassC873 + { + [ImportingConstructor] + public TestClassC873(TestClassC1746 testclassc1746, TestClassC1747 testclassc1747) + { + } + } + [Export] + public class TestClassC874 + { + [ImportingConstructor] + public TestClassC874(TestClassC1748 testclassc1748, TestClassC1749 testclassc1749) + { + } + } + [Export] + public class TestClassC875 + { + [ImportingConstructor] + public TestClassC875(TestClassC1750 testclassc1750, TestClassC1751 testclassc1751) + { + } + } + [Export] + public class TestClassC876 + { + [ImportingConstructor] + public TestClassC876(TestClassC1752 testclassc1752, TestClassC1753 testclassc1753) + { + } + } + [Export] + public class TestClassC877 + { + [ImportingConstructor] + public TestClassC877(TestClassC1754 testclassc1754, TestClassC1755 testclassc1755) + { + } + } + [Export] + public class TestClassC878 + { + [ImportingConstructor] + public TestClassC878(TestClassC1756 testclassc1756, TestClassC1757 testclassc1757) + { + } + } + [Export] + public class TestClassC879 + { + [ImportingConstructor] + public TestClassC879(TestClassC1758 testclassc1758, TestClassC1759 testclassc1759) + { + } + } + [Export] + public class TestClassC880 + { + [ImportingConstructor] + public TestClassC880(TestClassC1760 testclassc1760, TestClassC1761 testclassc1761) + { + } + } + [Export] + public class TestClassC881 + { + [ImportingConstructor] + public TestClassC881(TestClassC1762 testclassc1762, TestClassC1763 testclassc1763) + { + } + } + [Export] + public class TestClassC882 + { + [ImportingConstructor] + public TestClassC882(TestClassC1764 testclassc1764, TestClassC1765 testclassc1765) + { + } + } + [Export] + public class TestClassC883 + { + [ImportingConstructor] + public TestClassC883(TestClassC1766 testclassc1766, TestClassC1767 testclassc1767) + { + } + } + [Export] + public class TestClassC884 + { + [ImportingConstructor] + public TestClassC884(TestClassC1768 testclassc1768, TestClassC1769 testclassc1769) + { + } + } + [Export] + public class TestClassC885 + { + [ImportingConstructor] + public TestClassC885(TestClassC1770 testclassc1770, TestClassC1771 testclassc1771) + { + } + } + [Export] + public class TestClassC886 + { + [ImportingConstructor] + public TestClassC886(TestClassC1772 testclassc1772, TestClassC1773 testclassc1773) + { + } + } + [Export] + public class TestClassC887 + { + [ImportingConstructor] + public TestClassC887(TestClassC1774 testclassc1774, TestClassC1775 testclassc1775) + { + } + } + [Export] + public class TestClassC888 + { + [ImportingConstructor] + public TestClassC888(TestClassC1776 testclassc1776, TestClassC1777 testclassc1777) + { + } + } + [Export] + public class TestClassC889 + { + [ImportingConstructor] + public TestClassC889(TestClassC1778 testclassc1778, TestClassC1779 testclassc1779) + { + } + } + [Export] + public class TestClassC890 + { + [ImportingConstructor] + public TestClassC890(TestClassC1780 testclassc1780, TestClassC1781 testclassc1781) + { + } + } + [Export] + public class TestClassC891 + { + [ImportingConstructor] + public TestClassC891(TestClassC1782 testclassc1782, TestClassC1783 testclassc1783) + { + } + } + [Export] + public class TestClassC892 + { + [ImportingConstructor] + public TestClassC892(TestClassC1784 testclassc1784, TestClassC1785 testclassc1785) + { + } + } + [Export] + public class TestClassC893 + { + [ImportingConstructor] + public TestClassC893(TestClassC1786 testclassc1786, TestClassC1787 testclassc1787) + { + } + } + [Export] + public class TestClassC894 + { + [ImportingConstructor] + public TestClassC894(TestClassC1788 testclassc1788, TestClassC1789 testclassc1789) + { + } + } + [Export] + public class TestClassC895 + { + [ImportingConstructor] + public TestClassC895(TestClassC1790 testclassc1790, TestClassC1791 testclassc1791) + { + } + } + [Export] + public class TestClassC896 + { + [ImportingConstructor] + public TestClassC896(TestClassC1792 testclassc1792, TestClassC1793 testclassc1793) + { + } + } + [Export] + public class TestClassC897 + { + [ImportingConstructor] + public TestClassC897(TestClassC1794 testclassc1794, TestClassC1795 testclassc1795) + { + } + } + [Export] + public class TestClassC898 + { + [ImportingConstructor] + public TestClassC898(TestClassC1796 testclassc1796, TestClassC1797 testclassc1797) + { + } + } + [Export] + public class TestClassC899 + { + [ImportingConstructor] + public TestClassC899(TestClassC1798 testclassc1798, TestClassC1799 testclassc1799) + { + } + } + [Export] + public class TestClassC900 + { + [ImportingConstructor] + public TestClassC900(TestClassC1800 testclassc1800, TestClassC1801 testclassc1801) + { + } + } + [Export] + public class TestClassC901 + { + [ImportingConstructor] + public TestClassC901(TestClassC1802 testclassc1802, TestClassC1803 testclassc1803) + { + } + } + [Export] + public class TestClassC902 + { + [ImportingConstructor] + public TestClassC902(TestClassC1804 testclassc1804, TestClassC1805 testclassc1805) + { + } + } + [Export] + public class TestClassC903 + { + [ImportingConstructor] + public TestClassC903(TestClassC1806 testclassc1806, TestClassC1807 testclassc1807) + { + } + } + [Export] + public class TestClassC904 + { + [ImportingConstructor] + public TestClassC904(TestClassC1808 testclassc1808, TestClassC1809 testclassc1809) + { + } + } + [Export] + public class TestClassC905 + { + [ImportingConstructor] + public TestClassC905(TestClassC1810 testclassc1810, TestClassC1811 testclassc1811) + { + } + } + [Export] + public class TestClassC906 + { + [ImportingConstructor] + public TestClassC906(TestClassC1812 testclassc1812, TestClassC1813 testclassc1813) + { + } + } + [Export] + public class TestClassC907 + { + [ImportingConstructor] + public TestClassC907(TestClassC1814 testclassc1814, TestClassC1815 testclassc1815) + { + } + } + [Export] + public class TestClassC908 + { + [ImportingConstructor] + public TestClassC908(TestClassC1816 testclassc1816, TestClassC1817 testclassc1817) + { + } + } + [Export] + public class TestClassC909 + { + [ImportingConstructor] + public TestClassC909(TestClassC1818 testclassc1818, TestClassC1819 testclassc1819) + { + } + } + [Export] + public class TestClassC910 + { + [ImportingConstructor] + public TestClassC910(TestClassC1820 testclassc1820, TestClassC1821 testclassc1821) + { + } + } + [Export] + public class TestClassC911 + { + [ImportingConstructor] + public TestClassC911(TestClassC1822 testclassc1822, TestClassC1823 testclassc1823) + { + } + } + [Export] + public class TestClassC912 + { + [ImportingConstructor] + public TestClassC912(TestClassC1824 testclassc1824, TestClassC1825 testclassc1825) + { + } + } + [Export] + public class TestClassC913 + { + [ImportingConstructor] + public TestClassC913(TestClassC1826 testclassc1826, TestClassC1827 testclassc1827) + { + } + } + [Export] + public class TestClassC914 + { + [ImportingConstructor] + public TestClassC914(TestClassC1828 testclassc1828, TestClassC1829 testclassc1829) + { + } + } + [Export] + public class TestClassC915 + { + [ImportingConstructor] + public TestClassC915(TestClassC1830 testclassc1830, TestClassC1831 testclassc1831) + { + } + } + [Export] + public class TestClassC916 + { + [ImportingConstructor] + public TestClassC916(TestClassC1832 testclassc1832, TestClassC1833 testclassc1833) + { + } + } + [Export] + public class TestClassC917 + { + [ImportingConstructor] + public TestClassC917(TestClassC1834 testclassc1834, TestClassC1835 testclassc1835) + { + } + } + [Export] + public class TestClassC918 + { + [ImportingConstructor] + public TestClassC918(TestClassC1836 testclassc1836, TestClassC1837 testclassc1837) + { + } + } + [Export] + public class TestClassC919 + { + [ImportingConstructor] + public TestClassC919(TestClassC1838 testclassc1838, TestClassC1839 testclassc1839) + { + } + } + [Export] + public class TestClassC920 + { + [ImportingConstructor] + public TestClassC920(TestClassC1840 testclassc1840, TestClassC1841 testclassc1841) + { + } + } + [Export] + public class TestClassC921 + { + [ImportingConstructor] + public TestClassC921(TestClassC1842 testclassc1842, TestClassC1843 testclassc1843) + { + } + } + [Export] + public class TestClassC922 + { + [ImportingConstructor] + public TestClassC922(TestClassC1844 testclassc1844, TestClassC1845 testclassc1845) + { + } + } + [Export] + public class TestClassC923 + { + [ImportingConstructor] + public TestClassC923(TestClassC1846 testclassc1846, TestClassC1847 testclassc1847) + { + } + } + [Export] + public class TestClassC924 + { + [ImportingConstructor] + public TestClassC924(TestClassC1848 testclassc1848, TestClassC1849 testclassc1849) + { + } + } + [Export] + public class TestClassC925 + { + [ImportingConstructor] + public TestClassC925(TestClassC1850 testclassc1850, TestClassC1851 testclassc1851) + { + } + } + [Export] + public class TestClassC926 + { + [ImportingConstructor] + public TestClassC926(TestClassC1852 testclassc1852, TestClassC1853 testclassc1853) + { + } + } + [Export] + public class TestClassC927 + { + [ImportingConstructor] + public TestClassC927(TestClassC1854 testclassc1854, TestClassC1855 testclassc1855) + { + } + } + [Export] + public class TestClassC928 + { + [ImportingConstructor] + public TestClassC928(TestClassC1856 testclassc1856, TestClassC1857 testclassc1857) + { + } + } + [Export] + public class TestClassC929 + { + [ImportingConstructor] + public TestClassC929(TestClassC1858 testclassc1858, TestClassC1859 testclassc1859) + { + } + } + [Export] + public class TestClassC930 + { + [ImportingConstructor] + public TestClassC930(TestClassC1860 testclassc1860, TestClassC1861 testclassc1861) + { + } + } + [Export] + public class TestClassC931 + { + [ImportingConstructor] + public TestClassC931(TestClassC1862 testclassc1862, TestClassC1863 testclassc1863) + { + } + } + [Export] + public class TestClassC932 + { + [ImportingConstructor] + public TestClassC932(TestClassC1864 testclassc1864, TestClassC1865 testclassc1865) + { + } + } + [Export] + public class TestClassC933 + { + [ImportingConstructor] + public TestClassC933(TestClassC1866 testclassc1866, TestClassC1867 testclassc1867) + { + } + } + [Export] + public class TestClassC934 + { + [ImportingConstructor] + public TestClassC934(TestClassC1868 testclassc1868, TestClassC1869 testclassc1869) + { + } + } + [Export] + public class TestClassC935 + { + [ImportingConstructor] + public TestClassC935(TestClassC1870 testclassc1870, TestClassC1871 testclassc1871) + { + } + } + [Export] + public class TestClassC936 + { + [ImportingConstructor] + public TestClassC936(TestClassC1872 testclassc1872, TestClassC1873 testclassc1873) + { + } + } + [Export] + public class TestClassC937 + { + [ImportingConstructor] + public TestClassC937(TestClassC1874 testclassc1874, TestClassC1875 testclassc1875) + { + } + } + [Export] + public class TestClassC938 + { + [ImportingConstructor] + public TestClassC938(TestClassC1876 testclassc1876, TestClassC1877 testclassc1877) + { + } + } + [Export] + public class TestClassC939 + { + [ImportingConstructor] + public TestClassC939(TestClassC1878 testclassc1878, TestClassC1879 testclassc1879) + { + } + } + [Export] + public class TestClassC940 + { + [ImportingConstructor] + public TestClassC940(TestClassC1880 testclassc1880, TestClassC1881 testclassc1881) + { + } + } + [Export] + public class TestClassC941 + { + [ImportingConstructor] + public TestClassC941(TestClassC1882 testclassc1882, TestClassC1883 testclassc1883) + { + } + } + [Export] + public class TestClassC942 + { + [ImportingConstructor] + public TestClassC942(TestClassC1884 testclassc1884, TestClassC1885 testclassc1885) + { + } + } + [Export] + public class TestClassC943 + { + [ImportingConstructor] + public TestClassC943(TestClassC1886 testclassc1886, TestClassC1887 testclassc1887) + { + } + } + [Export] + public class TestClassC944 + { + [ImportingConstructor] + public TestClassC944(TestClassC1888 testclassc1888, TestClassC1889 testclassc1889) + { + } + } + [Export] + public class TestClassC945 + { + [ImportingConstructor] + public TestClassC945(TestClassC1890 testclassc1890, TestClassC1891 testclassc1891) + { + } + } + [Export] + public class TestClassC946 + { + [ImportingConstructor] + public TestClassC946(TestClassC1892 testclassc1892, TestClassC1893 testclassc1893) + { + } + } + [Export] + public class TestClassC947 + { + [ImportingConstructor] + public TestClassC947(TestClassC1894 testclassc1894, TestClassC1895 testclassc1895) + { + } + } + [Export] + public class TestClassC948 + { + [ImportingConstructor] + public TestClassC948(TestClassC1896 testclassc1896, TestClassC1897 testclassc1897) + { + } + } + [Export] + public class TestClassC949 + { + [ImportingConstructor] + public TestClassC949(TestClassC1898 testclassc1898, TestClassC1899 testclassc1899) + { + } + } + [Export] + public class TestClassC950 + { + [ImportingConstructor] + public TestClassC950(TestClassC1900 testclassc1900, TestClassC1901 testclassc1901) + { + } + } + [Export] + public class TestClassC951 + { + [ImportingConstructor] + public TestClassC951(TestClassC1902 testclassc1902, TestClassC1903 testclassc1903) + { + } + } + [Export] + public class TestClassC952 + { + [ImportingConstructor] + public TestClassC952(TestClassC1904 testclassc1904, TestClassC1905 testclassc1905) + { + } + } + [Export] + public class TestClassC953 + { + [ImportingConstructor] + public TestClassC953(TestClassC1906 testclassc1906, TestClassC1907 testclassc1907) + { + } + } + [Export] + public class TestClassC954 + { + [ImportingConstructor] + public TestClassC954(TestClassC1908 testclassc1908, TestClassC1909 testclassc1909) + { + } + } + [Export] + public class TestClassC955 + { + [ImportingConstructor] + public TestClassC955(TestClassC1910 testclassc1910, TestClassC1911 testclassc1911) + { + } + } + [Export] + public class TestClassC956 + { + [ImportingConstructor] + public TestClassC956(TestClassC1912 testclassc1912, TestClassC1913 testclassc1913) + { + } + } + [Export] + public class TestClassC957 + { + [ImportingConstructor] + public TestClassC957(TestClassC1914 testclassc1914, TestClassC1915 testclassc1915) + { + } + } + [Export] + public class TestClassC958 + { + [ImportingConstructor] + public TestClassC958(TestClassC1916 testclassc1916, TestClassC1917 testclassc1917) + { + } + } + [Export] + public class TestClassC959 + { + [ImportingConstructor] + public TestClassC959(TestClassC1918 testclassc1918, TestClassC1919 testclassc1919) + { + } + } + [Export] + public class TestClassC960 + { + [ImportingConstructor] + public TestClassC960(TestClassC1920 testclassc1920, TestClassC1921 testclassc1921) + { + } + } + [Export] + public class TestClassC961 + { + [ImportingConstructor] + public TestClassC961(TestClassC1922 testclassc1922, TestClassC1923 testclassc1923) + { + } + } + [Export] + public class TestClassC962 + { + [ImportingConstructor] + public TestClassC962(TestClassC1924 testclassc1924, TestClassC1925 testclassc1925) + { + } + } + [Export] + public class TestClassC963 + { + [ImportingConstructor] + public TestClassC963(TestClassC1926 testclassc1926, TestClassC1927 testclassc1927) + { + } + } + [Export] + public class TestClassC964 + { + [ImportingConstructor] + public TestClassC964(TestClassC1928 testclassc1928, TestClassC1929 testclassc1929) + { + } + } + [Export] + public class TestClassC965 + { + [ImportingConstructor] + public TestClassC965(TestClassC1930 testclassc1930, TestClassC1931 testclassc1931) + { + } + } + [Export] + public class TestClassC966 + { + [ImportingConstructor] + public TestClassC966(TestClassC1932 testclassc1932, TestClassC1933 testclassc1933) + { + } + } + [Export] + public class TestClassC967 + { + [ImportingConstructor] + public TestClassC967(TestClassC1934 testclassc1934, TestClassC1935 testclassc1935) + { + } + } + [Export] + public class TestClassC968 + { + [ImportingConstructor] + public TestClassC968(TestClassC1936 testclassc1936, TestClassC1937 testclassc1937) + { + } + } + [Export] + public class TestClassC969 + { + [ImportingConstructor] + public TestClassC969(TestClassC1938 testclassc1938, TestClassC1939 testclassc1939) + { + } + } + [Export] + public class TestClassC970 + { + [ImportingConstructor] + public TestClassC970(TestClassC1940 testclassc1940, TestClassC1941 testclassc1941) + { + } + } + [Export] + public class TestClassC971 + { + [ImportingConstructor] + public TestClassC971(TestClassC1942 testclassc1942, TestClassC1943 testclassc1943) + { + } + } + [Export] + public class TestClassC972 + { + [ImportingConstructor] + public TestClassC972(TestClassC1944 testclassc1944, TestClassC1945 testclassc1945) + { + } + } + [Export] + public class TestClassC973 + { + [ImportingConstructor] + public TestClassC973(TestClassC1946 testclassc1946, TestClassC1947 testclassc1947) + { + } + } + [Export] + public class TestClassC974 + { + [ImportingConstructor] + public TestClassC974(TestClassC1948 testclassc1948, TestClassC1949 testclassc1949) + { + } + } + [Export] + public class TestClassC975 + { + [ImportingConstructor] + public TestClassC975(TestClassC1950 testclassc1950, TestClassC1951 testclassc1951) + { + } + } + [Export] + public class TestClassC976 + { + [ImportingConstructor] + public TestClassC976(TestClassC1952 testclassc1952, TestClassC1953 testclassc1953) + { + } + } + [Export] + public class TestClassC977 + { + [ImportingConstructor] + public TestClassC977(TestClassC1954 testclassc1954, TestClassC1955 testclassc1955) + { + } + } + [Export] + public class TestClassC978 + { + [ImportingConstructor] + public TestClassC978(TestClassC1956 testclassc1956, TestClassC1957 testclassc1957) + { + } + } + [Export] + public class TestClassC979 + { + [ImportingConstructor] + public TestClassC979(TestClassC1958 testclassc1958, TestClassC1959 testclassc1959) + { + } + } + [Export] + public class TestClassC980 + { + [ImportingConstructor] + public TestClassC980(TestClassC1960 testclassc1960, TestClassC1961 testclassc1961) + { + } + } + [Export] + public class TestClassC981 + { + [ImportingConstructor] + public TestClassC981(TestClassC1962 testclassc1962, TestClassC1963 testclassc1963) + { + } + } + [Export] + public class TestClassC982 + { + [ImportingConstructor] + public TestClassC982(TestClassC1964 testclassc1964, TestClassC1965 testclassc1965) + { + } + } + [Export] + public class TestClassC983 + { + [ImportingConstructor] + public TestClassC983(TestClassC1966 testclassc1966, TestClassC1967 testclassc1967) + { + } + } + [Export] + public class TestClassC984 + { + [ImportingConstructor] + public TestClassC984(TestClassC1968 testclassc1968, TestClassC1969 testclassc1969) + { + } + } + [Export] + public class TestClassC985 + { + [ImportingConstructor] + public TestClassC985(TestClassC1970 testclassc1970, TestClassC1971 testclassc1971) + { + } + } + [Export] + public class TestClassC986 + { + [ImportingConstructor] + public TestClassC986(TestClassC1972 testclassc1972, TestClassC1973 testclassc1973) + { + } + } + [Export] + public class TestClassC987 + { + [ImportingConstructor] + public TestClassC987(TestClassC1974 testclassc1974, TestClassC1975 testclassc1975) + { + } + } + [Export] + public class TestClassC988 + { + [ImportingConstructor] + public TestClassC988(TestClassC1976 testclassc1976, TestClassC1977 testclassc1977) + { + } + } + [Export] + public class TestClassC989 + { + [ImportingConstructor] + public TestClassC989(TestClassC1978 testclassc1978, TestClassC1979 testclassc1979) + { + } + } + [Export] + public class TestClassC990 + { + [ImportingConstructor] + public TestClassC990(TestClassC1980 testclassc1980, TestClassC1981 testclassc1981) + { + } + } + [Export] + public class TestClassC991 + { + [ImportingConstructor] + public TestClassC991(TestClassC1982 testclassc1982, TestClassC1983 testclassc1983) + { + } + } + [Export] + public class TestClassC992 + { + [ImportingConstructor] + public TestClassC992(TestClassC1984 testclassc1984, TestClassC1985 testclassc1985) + { + } + } + [Export] + public class TestClassC993 + { + [ImportingConstructor] + public TestClassC993(TestClassC1986 testclassc1986, TestClassC1987 testclassc1987) + { + } + } + [Export] + public class TestClassC994 + { + [ImportingConstructor] + public TestClassC994(TestClassC1988 testclassc1988, TestClassC1989 testclassc1989) + { + } + } + [Export] + public class TestClassC995 + { + [ImportingConstructor] + public TestClassC995(TestClassC1990 testclassc1990, TestClassC1991 testclassc1991) + { + } + } + [Export] + public class TestClassC996 + { + [ImportingConstructor] + public TestClassC996(TestClassC1992 testclassc1992, TestClassC1993 testclassc1993) + { + } + } + [Export] + public class TestClassC997 + { + [ImportingConstructor] + public TestClassC997(TestClassC1994 testclassc1994, TestClassC1995 testclassc1995) + { + } + } + [Export] + public class TestClassC998 + { + [ImportingConstructor] + public TestClassC998(TestClassC1996 testclassc1996, TestClassC1997 testclassc1997) + { + } + } + [Export] + public class TestClassC999 + { + [ImportingConstructor] + public TestClassC999(TestClassC1998 testclassc1998, TestClassC1999 testclassc1999) + { + } + } + [Export] + public class TestClassC1000 + { + [ImportingConstructor] + public TestClassC1000(TestClassC2000 testclassc2000, TestClassC2001 testclassc2001) + { + } + } + [Export] + public class TestClassC1001 + { + [ImportingConstructor] + public TestClassC1001(TestClassC2002 testclassc2002, TestClassC2003 testclassc2003) + { + } + } + [Export] + public class TestClassC1002 + { + [ImportingConstructor] + public TestClassC1002(TestClassC2004 testclassc2004, TestClassC2005 testclassc2005) + { + } + } + [Export] + public class TestClassC1003 + { + [ImportingConstructor] + public TestClassC1003(TestClassC2006 testclassc2006, TestClassC2007 testclassc2007) + { + } + } + [Export] + public class TestClassC1004 + { + [ImportingConstructor] + public TestClassC1004(TestClassC2008 testclassc2008, TestClassC2009 testclassc2009) + { + } + } + [Export] + public class TestClassC1005 + { + [ImportingConstructor] + public TestClassC1005(TestClassC2010 testclassc2010, TestClassC2011 testclassc2011) + { + } + } + [Export] + public class TestClassC1006 + { + [ImportingConstructor] + public TestClassC1006(TestClassC2012 testclassc2012, TestClassC2013 testclassc2013) + { + } + } + [Export] + public class TestClassC1007 + { + [ImportingConstructor] + public TestClassC1007(TestClassC2014 testclassc2014, TestClassC2015 testclassc2015) + { + } + } + [Export] + public class TestClassC1008 + { + [ImportingConstructor] + public TestClassC1008(TestClassC2016 testclassc2016, TestClassC2017 testclassc2017) + { + } + } + [Export] + public class TestClassC1009 + { + [ImportingConstructor] + public TestClassC1009(TestClassC2018 testclassc2018, TestClassC2019 testclassc2019) + { + } + } + [Export] + public class TestClassC1010 + { + [ImportingConstructor] + public TestClassC1010(TestClassC2020 testclassc2020, TestClassC2021 testclassc2021) + { + } + } + [Export] + public class TestClassC1011 + { + [ImportingConstructor] + public TestClassC1011(TestClassC2022 testclassc2022, TestClassC2023 testclassc2023) + { + } + } + [Export] + public class TestClassC1012 + { + [ImportingConstructor] + public TestClassC1012(TestClassC2024 testclassc2024, TestClassC2025 testclassc2025) + { + } + } + [Export] + public class TestClassC1013 + { + [ImportingConstructor] + public TestClassC1013(TestClassC2026 testclassc2026, TestClassC2027 testclassc2027) + { + } + } + [Export] + public class TestClassC1014 + { + [ImportingConstructor] + public TestClassC1014(TestClassC2028 testclassc2028, TestClassC2029 testclassc2029) + { + } + } + [Export] + public class TestClassC1015 + { + [ImportingConstructor] + public TestClassC1015(TestClassC2030 testclassc2030, TestClassC2031 testclassc2031) + { + } + } + [Export] + public class TestClassC1016 + { + [ImportingConstructor] + public TestClassC1016(TestClassC2032 testclassc2032, TestClassC2033 testclassc2033) + { + } + } + [Export] + public class TestClassC1017 + { + [ImportingConstructor] + public TestClassC1017(TestClassC2034 testclassc2034, TestClassC2035 testclassc2035) + { + } + } + [Export] + public class TestClassC1018 + { + [ImportingConstructor] + public TestClassC1018(TestClassC2036 testclassc2036, TestClassC2037 testclassc2037) + { + } + } + [Export] + public class TestClassC1019 + { + [ImportingConstructor] + public TestClassC1019(TestClassC2038 testclassc2038, TestClassC2039 testclassc2039) + { + } + } + [Export] + public class TestClassC1020 + { + [ImportingConstructor] + public TestClassC1020(TestClassC2040 testclassc2040, TestClassC2041 testclassc2041) + { + } + } + [Export] + public class TestClassC1021 + { + [ImportingConstructor] + public TestClassC1021(TestClassC2042 testclassc2042, TestClassC2043 testclassc2043) + { + } + } + [Export] + public class TestClassC1022 + { + [ImportingConstructor] + public TestClassC1022(TestClassC2044 testclassc2044, TestClassC2045 testclassc2045) + { + } + } + [Export] + public class TestClassC1023 + { + public TestClassC1023() + { + } + } + [Export] + public class TestClassC1024 + { + public TestClassC1024() + { + } + } + [Export] + public class TestClassC1025 + { + public TestClassC1025() + { + } + } + [Export] + public class TestClassC1026 + { + public TestClassC1026() + { + } + } + [Export] + public class TestClassC1027 + { + public TestClassC1027() + { + } + } + [Export] + public class TestClassC1028 + { + public TestClassC1028() + { + } + } + [Export] + public class TestClassC1029 + { + public TestClassC1029() + { + } + } + [Export] + public class TestClassC1030 + { + public TestClassC1030() + { + } + } + [Export] + public class TestClassC1031 + { + public TestClassC1031() + { + } + } + [Export] + public class TestClassC1032 + { + public TestClassC1032() + { + } + } + [Export] + public class TestClassC1033 + { + public TestClassC1033() + { + } + } + [Export] + public class TestClassC1034 + { + public TestClassC1034() + { + } + } + [Export] + public class TestClassC1035 + { + public TestClassC1035() + { + } + } + [Export] + public class TestClassC1036 + { + public TestClassC1036() + { + } + } + [Export] + public class TestClassC1037 + { + public TestClassC1037() + { + } + } + [Export] + public class TestClassC1038 + { + public TestClassC1038() + { + } + } + [Export] + public class TestClassC1039 + { + public TestClassC1039() + { + } + } + [Export] + public class TestClassC1040 + { + public TestClassC1040() + { + } + } + [Export] + public class TestClassC1041 + { + public TestClassC1041() + { + } + } + [Export] + public class TestClassC1042 + { + public TestClassC1042() + { + } + } + [Export] + public class TestClassC1043 + { + public TestClassC1043() + { + } + } + [Export] + public class TestClassC1044 + { + public TestClassC1044() + { + } + } + [Export] + public class TestClassC1045 + { + public TestClassC1045() + { + } + } + [Export] + public class TestClassC1046 + { + public TestClassC1046() + { + } + } + [Export] + public class TestClassC1047 + { + public TestClassC1047() + { + } + } + [Export] + public class TestClassC1048 + { + public TestClassC1048() + { + } + } + [Export] + public class TestClassC1049 + { + public TestClassC1049() + { + } + } + [Export] + public class TestClassC1050 + { + public TestClassC1050() + { + } + } + [Export] + public class TestClassC1051 + { + public TestClassC1051() + { + } + } + [Export] + public class TestClassC1052 + { + public TestClassC1052() + { + } + } + [Export] + public class TestClassC1053 + { + public TestClassC1053() + { + } + } + [Export] + public class TestClassC1054 + { + public TestClassC1054() + { + } + } + [Export] + public class TestClassC1055 + { + public TestClassC1055() + { + } + } + [Export] + public class TestClassC1056 + { + public TestClassC1056() + { + } + } + [Export] + public class TestClassC1057 + { + public TestClassC1057() + { + } + } + [Export] + public class TestClassC1058 + { + public TestClassC1058() + { + } + } + [Export] + public class TestClassC1059 + { + public TestClassC1059() + { + } + } + [Export] + public class TestClassC1060 + { + public TestClassC1060() + { + } + } + [Export] + public class TestClassC1061 + { + public TestClassC1061() + { + } + } + [Export] + public class TestClassC1062 + { + public TestClassC1062() + { + } + } + [Export] + public class TestClassC1063 + { + public TestClassC1063() + { + } + } + [Export] + public class TestClassC1064 + { + public TestClassC1064() + { + } + } + [Export] + public class TestClassC1065 + { + public TestClassC1065() + { + } + } + [Export] + public class TestClassC1066 + { + public TestClassC1066() + { + } + } + [Export] + public class TestClassC1067 + { + public TestClassC1067() + { + } + } + [Export] + public class TestClassC1068 + { + public TestClassC1068() + { + } + } + [Export] + public class TestClassC1069 + { + public TestClassC1069() + { + } + } + [Export] + public class TestClassC1070 + { + public TestClassC1070() + { + } + } + [Export] + public class TestClassC1071 + { + public TestClassC1071() + { + } + } + [Export] + public class TestClassC1072 + { + public TestClassC1072() + { + } + } + [Export] + public class TestClassC1073 + { + public TestClassC1073() + { + } + } + [Export] + public class TestClassC1074 + { + public TestClassC1074() + { + } + } + [Export] + public class TestClassC1075 + { + public TestClassC1075() + { + } + } + [Export] + public class TestClassC1076 + { + public TestClassC1076() + { + } + } + [Export] + public class TestClassC1077 + { + public TestClassC1077() + { + } + } + [Export] + public class TestClassC1078 + { + public TestClassC1078() + { + } + } + [Export] + public class TestClassC1079 + { + public TestClassC1079() + { + } + } + [Export] + public class TestClassC1080 + { + public TestClassC1080() + { + } + } + [Export] + public class TestClassC1081 + { + public TestClassC1081() + { + } + } + [Export] + public class TestClassC1082 + { + public TestClassC1082() + { + } + } + [Export] + public class TestClassC1083 + { + public TestClassC1083() + { + } + } + [Export] + public class TestClassC1084 + { + public TestClassC1084() + { + } + } + [Export] + public class TestClassC1085 + { + public TestClassC1085() + { + } + } + [Export] + public class TestClassC1086 + { + public TestClassC1086() + { + } + } + [Export] + public class TestClassC1087 + { + public TestClassC1087() + { + } + } + [Export] + public class TestClassC1088 + { + public TestClassC1088() + { + } + } + [Export] + public class TestClassC1089 + { + public TestClassC1089() + { + } + } + [Export] + public class TestClassC1090 + { + public TestClassC1090() + { + } + } + [Export] + public class TestClassC1091 + { + public TestClassC1091() + { + } + } + [Export] + public class TestClassC1092 + { + public TestClassC1092() + { + } + } + [Export] + public class TestClassC1093 + { + public TestClassC1093() + { + } + } + [Export] + public class TestClassC1094 + { + public TestClassC1094() + { + } + } + [Export] + public class TestClassC1095 + { + public TestClassC1095() + { + } + } + [Export] + public class TestClassC1096 + { + public TestClassC1096() + { + } + } + [Export] + public class TestClassC1097 + { + public TestClassC1097() + { + } + } + [Export] + public class TestClassC1098 + { + public TestClassC1098() + { + } + } + [Export] + public class TestClassC1099 + { + public TestClassC1099() + { + } + } + [Export] + public class TestClassC1100 + { + public TestClassC1100() + { + } + } + [Export] + public class TestClassC1101 + { + public TestClassC1101() + { + } + } + [Export] + public class TestClassC1102 + { + public TestClassC1102() + { + } + } + [Export] + public class TestClassC1103 + { + public TestClassC1103() + { + } + } + [Export] + public class TestClassC1104 + { + public TestClassC1104() + { + } + } + [Export] + public class TestClassC1105 + { + public TestClassC1105() + { + } + } + [Export] + public class TestClassC1106 + { + public TestClassC1106() + { + } + } + [Export] + public class TestClassC1107 + { + public TestClassC1107() + { + } + } + [Export] + public class TestClassC1108 + { + public TestClassC1108() + { + } + } + [Export] + public class TestClassC1109 + { + public TestClassC1109() + { + } + } + [Export] + public class TestClassC1110 + { + public TestClassC1110() + { + } + } + [Export] + public class TestClassC1111 + { + public TestClassC1111() + { + } + } + [Export] + public class TestClassC1112 + { + public TestClassC1112() + { + } + } + [Export] + public class TestClassC1113 + { + public TestClassC1113() + { + } + } + [Export] + public class TestClassC1114 + { + public TestClassC1114() + { + } + } + [Export] + public class TestClassC1115 + { + public TestClassC1115() + { + } + } + [Export] + public class TestClassC1116 + { + public TestClassC1116() + { + } + } + [Export] + public class TestClassC1117 + { + public TestClassC1117() + { + } + } + [Export] + public class TestClassC1118 + { + public TestClassC1118() + { + } + } + [Export] + public class TestClassC1119 + { + public TestClassC1119() + { + } + } + [Export] + public class TestClassC1120 + { + public TestClassC1120() + { + } + } + [Export] + public class TestClassC1121 + { + public TestClassC1121() + { + } + } + [Export] + public class TestClassC1122 + { + public TestClassC1122() + { + } + } + [Export] + public class TestClassC1123 + { + public TestClassC1123() + { + } + } + [Export] + public class TestClassC1124 + { + public TestClassC1124() + { + } + } + [Export] + public class TestClassC1125 + { + public TestClassC1125() + { + } + } + [Export] + public class TestClassC1126 + { + public TestClassC1126() + { + } + } + [Export] + public class TestClassC1127 + { + public TestClassC1127() + { + } + } + [Export] + public class TestClassC1128 + { + public TestClassC1128() + { + } + } + [Export] + public class TestClassC1129 + { + public TestClassC1129() + { + } + } + [Export] + public class TestClassC1130 + { + public TestClassC1130() + { + } + } + [Export] + public class TestClassC1131 + { + public TestClassC1131() + { + } + } + [Export] + public class TestClassC1132 + { + public TestClassC1132() + { + } + } + [Export] + public class TestClassC1133 + { + public TestClassC1133() + { + } + } + [Export] + public class TestClassC1134 + { + public TestClassC1134() + { + } + } + [Export] + public class TestClassC1135 + { + public TestClassC1135() + { + } + } + [Export] + public class TestClassC1136 + { + public TestClassC1136() + { + } + } + [Export] + public class TestClassC1137 + { + public TestClassC1137() + { + } + } + [Export] + public class TestClassC1138 + { + public TestClassC1138() + { + } + } + [Export] + public class TestClassC1139 + { + public TestClassC1139() + { + } + } + [Export] + public class TestClassC1140 + { + public TestClassC1140() + { + } + } + [Export] + public class TestClassC1141 + { + public TestClassC1141() + { + } + } + [Export] + public class TestClassC1142 + { + public TestClassC1142() + { + } + } + [Export] + public class TestClassC1143 + { + public TestClassC1143() + { + } + } + [Export] + public class TestClassC1144 + { + public TestClassC1144() + { + } + } + [Export] + public class TestClassC1145 + { + public TestClassC1145() + { + } + } + [Export] + public class TestClassC1146 + { + public TestClassC1146() + { + } + } + [Export] + public class TestClassC1147 + { + public TestClassC1147() + { + } + } + [Export] + public class TestClassC1148 + { + public TestClassC1148() + { + } + } + [Export] + public class TestClassC1149 + { + public TestClassC1149() + { + } + } + [Export] + public class TestClassC1150 + { + public TestClassC1150() + { + } + } + [Export] + public class TestClassC1151 + { + public TestClassC1151() + { + } + } + [Export] + public class TestClassC1152 + { + public TestClassC1152() + { + } + } + [Export] + public class TestClassC1153 + { + public TestClassC1153() + { + } + } + [Export] + public class TestClassC1154 + { + public TestClassC1154() + { + } + } + [Export] + public class TestClassC1155 + { + public TestClassC1155() + { + } + } + [Export] + public class TestClassC1156 + { + public TestClassC1156() + { + } + } + [Export] + public class TestClassC1157 + { + public TestClassC1157() + { + } + } + [Export] + public class TestClassC1158 + { + public TestClassC1158() + { + } + } + [Export] + public class TestClassC1159 + { + public TestClassC1159() + { + } + } + [Export] + public class TestClassC1160 + { + public TestClassC1160() + { + } + } + [Export] + public class TestClassC1161 + { + public TestClassC1161() + { + } + } + [Export] + public class TestClassC1162 + { + public TestClassC1162() + { + } + } + [Export] + public class TestClassC1163 + { + public TestClassC1163() + { + } + } + [Export] + public class TestClassC1164 + { + public TestClassC1164() + { + } + } + [Export] + public class TestClassC1165 + { + public TestClassC1165() + { + } + } + [Export] + public class TestClassC1166 + { + public TestClassC1166() + { + } + } + [Export] + public class TestClassC1167 + { + public TestClassC1167() + { + } + } + [Export] + public class TestClassC1168 + { + public TestClassC1168() + { + } + } + [Export] + public class TestClassC1169 + { + public TestClassC1169() + { + } + } + [Export] + public class TestClassC1170 + { + public TestClassC1170() + { + } + } + [Export] + public class TestClassC1171 + { + public TestClassC1171() + { + } + } + [Export] + public class TestClassC1172 + { + public TestClassC1172() + { + } + } + [Export] + public class TestClassC1173 + { + public TestClassC1173() + { + } + } + [Export] + public class TestClassC1174 + { + public TestClassC1174() + { + } + } + [Export] + public class TestClassC1175 + { + public TestClassC1175() + { + } + } + [Export] + public class TestClassC1176 + { + public TestClassC1176() + { + } + } + [Export] + public class TestClassC1177 + { + public TestClassC1177() + { + } + } + [Export] + public class TestClassC1178 + { + public TestClassC1178() + { + } + } + [Export] + public class TestClassC1179 + { + public TestClassC1179() + { + } + } + [Export] + public class TestClassC1180 + { + public TestClassC1180() + { + } + } + [Export] + public class TestClassC1181 + { + public TestClassC1181() + { + } + } + [Export] + public class TestClassC1182 + { + public TestClassC1182() + { + } + } + [Export] + public class TestClassC1183 + { + public TestClassC1183() + { + } + } + [Export] + public class TestClassC1184 + { + public TestClassC1184() + { + } + } + [Export] + public class TestClassC1185 + { + public TestClassC1185() + { + } + } + [Export] + public class TestClassC1186 + { + public TestClassC1186() + { + } + } + [Export] + public class TestClassC1187 + { + public TestClassC1187() + { + } + } + [Export] + public class TestClassC1188 + { + public TestClassC1188() + { + } + } + [Export] + public class TestClassC1189 + { + public TestClassC1189() + { + } + } + [Export] + public class TestClassC1190 + { + public TestClassC1190() + { + } + } + [Export] + public class TestClassC1191 + { + public TestClassC1191() + { + } + } + [Export] + public class TestClassC1192 + { + public TestClassC1192() + { + } + } + [Export] + public class TestClassC1193 + { + public TestClassC1193() + { + } + } + [Export] + public class TestClassC1194 + { + public TestClassC1194() + { + } + } + [Export] + public class TestClassC1195 + { + public TestClassC1195() + { + } + } + [Export] + public class TestClassC1196 + { + public TestClassC1196() + { + } + } + [Export] + public class TestClassC1197 + { + public TestClassC1197() + { + } + } + [Export] + public class TestClassC1198 + { + public TestClassC1198() + { + } + } + [Export] + public class TestClassC1199 + { + public TestClassC1199() + { + } + } + [Export] + public class TestClassC1200 + { + public TestClassC1200() + { + } + } + [Export] + public class TestClassC1201 + { + public TestClassC1201() + { + } + } + [Export] + public class TestClassC1202 + { + public TestClassC1202() + { + } + } + [Export] + public class TestClassC1203 + { + public TestClassC1203() + { + } + } + [Export] + public class TestClassC1204 + { + public TestClassC1204() + { + } + } + [Export] + public class TestClassC1205 + { + public TestClassC1205() + { + } + } + [Export] + public class TestClassC1206 + { + public TestClassC1206() + { + } + } + [Export] + public class TestClassC1207 + { + public TestClassC1207() + { + } + } + [Export] + public class TestClassC1208 + { + public TestClassC1208() + { + } + } + [Export] + public class TestClassC1209 + { + public TestClassC1209() + { + } + } + [Export] + public class TestClassC1210 + { + public TestClassC1210() + { + } + } + [Export] + public class TestClassC1211 + { + public TestClassC1211() + { + } + } + [Export] + public class TestClassC1212 + { + public TestClassC1212() + { + } + } + [Export] + public class TestClassC1213 + { + public TestClassC1213() + { + } + } + [Export] + public class TestClassC1214 + { + public TestClassC1214() + { + } + } + [Export] + public class TestClassC1215 + { + public TestClassC1215() + { + } + } + [Export] + public class TestClassC1216 + { + public TestClassC1216() + { + } + } + [Export] + public class TestClassC1217 + { + public TestClassC1217() + { + } + } + [Export] + public class TestClassC1218 + { + public TestClassC1218() + { + } + } + [Export] + public class TestClassC1219 + { + public TestClassC1219() + { + } + } + [Export] + public class TestClassC1220 + { + public TestClassC1220() + { + } + } + [Export] + public class TestClassC1221 + { + public TestClassC1221() + { + } + } + [Export] + public class TestClassC1222 + { + public TestClassC1222() + { + } + } + [Export] + public class TestClassC1223 + { + public TestClassC1223() + { + } + } + [Export] + public class TestClassC1224 + { + public TestClassC1224() + { + } + } + [Export] + public class TestClassC1225 + { + public TestClassC1225() + { + } + } + [Export] + public class TestClassC1226 + { + public TestClassC1226() + { + } + } + [Export] + public class TestClassC1227 + { + public TestClassC1227() + { + } + } + [Export] + public class TestClassC1228 + { + public TestClassC1228() + { + } + } + [Export] + public class TestClassC1229 + { + public TestClassC1229() + { + } + } + [Export] + public class TestClassC1230 + { + public TestClassC1230() + { + } + } + [Export] + public class TestClassC1231 + { + public TestClassC1231() + { + } + } + [Export] + public class TestClassC1232 + { + public TestClassC1232() + { + } + } + [Export] + public class TestClassC1233 + { + public TestClassC1233() + { + } + } + [Export] + public class TestClassC1234 + { + public TestClassC1234() + { + } + } + [Export] + public class TestClassC1235 + { + public TestClassC1235() + { + } + } + [Export] + public class TestClassC1236 + { + public TestClassC1236() + { + } + } + [Export] + public class TestClassC1237 + { + public TestClassC1237() + { + } + } + [Export] + public class TestClassC1238 + { + public TestClassC1238() + { + } + } + [Export] + public class TestClassC1239 + { + public TestClassC1239() + { + } + } + [Export] + public class TestClassC1240 + { + public TestClassC1240() + { + } + } + [Export] + public class TestClassC1241 + { + public TestClassC1241() + { + } + } + [Export] + public class TestClassC1242 + { + public TestClassC1242() + { + } + } + [Export] + public class TestClassC1243 + { + public TestClassC1243() + { + } + } + [Export] + public class TestClassC1244 + { + public TestClassC1244() + { + } + } + [Export] + public class TestClassC1245 + { + public TestClassC1245() + { + } + } + [Export] + public class TestClassC1246 + { + public TestClassC1246() + { + } + } + [Export] + public class TestClassC1247 + { + public TestClassC1247() + { + } + } + [Export] + public class TestClassC1248 + { + public TestClassC1248() + { + } + } + [Export] + public class TestClassC1249 + { + public TestClassC1249() + { + } + } + [Export] + public class TestClassC1250 + { + public TestClassC1250() + { + } + } + [Export] + public class TestClassC1251 + { + public TestClassC1251() + { + } + } + [Export] + public class TestClassC1252 + { + public TestClassC1252() + { + } + } + [Export] + public class TestClassC1253 + { + public TestClassC1253() + { + } + } + [Export] + public class TestClassC1254 + { + public TestClassC1254() + { + } + } + [Export] + public class TestClassC1255 + { + public TestClassC1255() + { + } + } + [Export] + public class TestClassC1256 + { + public TestClassC1256() + { + } + } + [Export] + public class TestClassC1257 + { + public TestClassC1257() + { + } + } + [Export] + public class TestClassC1258 + { + public TestClassC1258() + { + } + } + [Export] + public class TestClassC1259 + { + public TestClassC1259() + { + } + } + [Export] + public class TestClassC1260 + { + public TestClassC1260() + { + } + } + [Export] + public class TestClassC1261 + { + public TestClassC1261() + { + } + } + [Export] + public class TestClassC1262 + { + public TestClassC1262() + { + } + } + [Export] + public class TestClassC1263 + { + public TestClassC1263() + { + } + } + [Export] + public class TestClassC1264 + { + public TestClassC1264() + { + } + } + [Export] + public class TestClassC1265 + { + public TestClassC1265() + { + } + } + [Export] + public class TestClassC1266 + { + public TestClassC1266() + { + } + } + [Export] + public class TestClassC1267 + { + public TestClassC1267() + { + } + } + [Export] + public class TestClassC1268 + { + public TestClassC1268() + { + } + } + [Export] + public class TestClassC1269 + { + public TestClassC1269() + { + } + } + [Export] + public class TestClassC1270 + { + public TestClassC1270() + { + } + } + [Export] + public class TestClassC1271 + { + public TestClassC1271() + { + } + } + [Export] + public class TestClassC1272 + { + public TestClassC1272() + { + } + } + [Export] + public class TestClassC1273 + { + public TestClassC1273() + { + } + } + [Export] + public class TestClassC1274 + { + public TestClassC1274() + { + } + } + [Export] + public class TestClassC1275 + { + public TestClassC1275() + { + } + } + [Export] + public class TestClassC1276 + { + public TestClassC1276() + { + } + } + [Export] + public class TestClassC1277 + { + public TestClassC1277() + { + } + } + [Export] + public class TestClassC1278 + { + public TestClassC1278() + { + } + } + [Export] + public class TestClassC1279 + { + public TestClassC1279() + { + } + } + [Export] + public class TestClassC1280 + { + public TestClassC1280() + { + } + } + [Export] + public class TestClassC1281 + { + public TestClassC1281() + { + } + } + [Export] + public class TestClassC1282 + { + public TestClassC1282() + { + } + } + [Export] + public class TestClassC1283 + { + public TestClassC1283() + { + } + } + [Export] + public class TestClassC1284 + { + public TestClassC1284() + { + } + } + [Export] + public class TestClassC1285 + { + public TestClassC1285() + { + } + } + [Export] + public class TestClassC1286 + { + public TestClassC1286() + { + } + } + [Export] + public class TestClassC1287 + { + public TestClassC1287() + { + } + } + [Export] + public class TestClassC1288 + { + public TestClassC1288() + { + } + } + [Export] + public class TestClassC1289 + { + public TestClassC1289() + { + } + } + [Export] + public class TestClassC1290 + { + public TestClassC1290() + { + } + } + [Export] + public class TestClassC1291 + { + public TestClassC1291() + { + } + } + [Export] + public class TestClassC1292 + { + public TestClassC1292() + { + } + } + [Export] + public class TestClassC1293 + { + public TestClassC1293() + { + } + } + [Export] + public class TestClassC1294 + { + public TestClassC1294() + { + } + } + [Export] + public class TestClassC1295 + { + public TestClassC1295() + { + } + } + [Export] + public class TestClassC1296 + { + public TestClassC1296() + { + } + } + [Export] + public class TestClassC1297 + { + public TestClassC1297() + { + } + } + [Export] + public class TestClassC1298 + { + public TestClassC1298() + { + } + } + [Export] + public class TestClassC1299 + { + public TestClassC1299() + { + } + } + [Export] + public class TestClassC1300 + { + public TestClassC1300() + { + } + } + [Export] + public class TestClassC1301 + { + public TestClassC1301() + { + } + } + [Export] + public class TestClassC1302 + { + public TestClassC1302() + { + } + } + [Export] + public class TestClassC1303 + { + public TestClassC1303() + { + } + } + [Export] + public class TestClassC1304 + { + public TestClassC1304() + { + } + } + [Export] + public class TestClassC1305 + { + public TestClassC1305() + { + } + } + [Export] + public class TestClassC1306 + { + public TestClassC1306() + { + } + } + [Export] + public class TestClassC1307 + { + public TestClassC1307() + { + } + } + [Export] + public class TestClassC1308 + { + public TestClassC1308() + { + } + } + [Export] + public class TestClassC1309 + { + public TestClassC1309() + { + } + } + [Export] + public class TestClassC1310 + { + public TestClassC1310() + { + } + } + [Export] + public class TestClassC1311 + { + public TestClassC1311() + { + } + } + [Export] + public class TestClassC1312 + { + public TestClassC1312() + { + } + } + [Export] + public class TestClassC1313 + { + public TestClassC1313() + { + } + } + [Export] + public class TestClassC1314 + { + public TestClassC1314() + { + } + } + [Export] + public class TestClassC1315 + { + public TestClassC1315() + { + } + } + [Export] + public class TestClassC1316 + { + public TestClassC1316() + { + } + } + [Export] + public class TestClassC1317 + { + public TestClassC1317() + { + } + } + [Export] + public class TestClassC1318 + { + public TestClassC1318() + { + } + } + [Export] + public class TestClassC1319 + { + public TestClassC1319() + { + } + } + [Export] + public class TestClassC1320 + { + public TestClassC1320() + { + } + } + [Export] + public class TestClassC1321 + { + public TestClassC1321() + { + } + } + [Export] + public class TestClassC1322 + { + public TestClassC1322() + { + } + } + [Export] + public class TestClassC1323 + { + public TestClassC1323() + { + } + } + [Export] + public class TestClassC1324 + { + public TestClassC1324() + { + } + } + [Export] + public class TestClassC1325 + { + public TestClassC1325() + { + } + } + [Export] + public class TestClassC1326 + { + public TestClassC1326() + { + } + } + [Export] + public class TestClassC1327 + { + public TestClassC1327() + { + } + } + [Export] + public class TestClassC1328 + { + public TestClassC1328() + { + } + } + [Export] + public class TestClassC1329 + { + public TestClassC1329() + { + } + } + [Export] + public class TestClassC1330 + { + public TestClassC1330() + { + } + } + [Export] + public class TestClassC1331 + { + public TestClassC1331() + { + } + } + [Export] + public class TestClassC1332 + { + public TestClassC1332() + { + } + } + [Export] + public class TestClassC1333 + { + public TestClassC1333() + { + } + } + [Export] + public class TestClassC1334 + { + public TestClassC1334() + { + } + } + [Export] + public class TestClassC1335 + { + public TestClassC1335() + { + } + } + [Export] + public class TestClassC1336 + { + public TestClassC1336() + { + } + } + [Export] + public class TestClassC1337 + { + public TestClassC1337() + { + } + } + [Export] + public class TestClassC1338 + { + public TestClassC1338() + { + } + } + [Export] + public class TestClassC1339 + { + public TestClassC1339() + { + } + } + [Export] + public class TestClassC1340 + { + public TestClassC1340() + { + } + } + [Export] + public class TestClassC1341 + { + public TestClassC1341() + { + } + } + [Export] + public class TestClassC1342 + { + public TestClassC1342() + { + } + } + [Export] + public class TestClassC1343 + { + public TestClassC1343() + { + } + } + [Export] + public class TestClassC1344 + { + public TestClassC1344() + { + } + } + [Export] + public class TestClassC1345 + { + public TestClassC1345() + { + } + } + [Export] + public class TestClassC1346 + { + public TestClassC1346() + { + } + } + [Export] + public class TestClassC1347 + { + public TestClassC1347() + { + } + } + [Export] + public class TestClassC1348 + { + public TestClassC1348() + { + } + } + [Export] + public class TestClassC1349 + { + public TestClassC1349() + { + } + } + [Export] + public class TestClassC1350 + { + public TestClassC1350() + { + } + } + [Export] + public class TestClassC1351 + { + public TestClassC1351() + { + } + } + [Export] + public class TestClassC1352 + { + public TestClassC1352() + { + } + } + [Export] + public class TestClassC1353 + { + public TestClassC1353() + { + } + } + [Export] + public class TestClassC1354 + { + public TestClassC1354() + { + } + } + [Export] + public class TestClassC1355 + { + public TestClassC1355() + { + } + } + [Export] + public class TestClassC1356 + { + public TestClassC1356() + { + } + } + [Export] + public class TestClassC1357 + { + public TestClassC1357() + { + } + } + [Export] + public class TestClassC1358 + { + public TestClassC1358() + { + } + } + [Export] + public class TestClassC1359 + { + public TestClassC1359() + { + } + } + [Export] + public class TestClassC1360 + { + public TestClassC1360() + { + } + } + [Export] + public class TestClassC1361 + { + public TestClassC1361() + { + } + } + [Export] + public class TestClassC1362 + { + public TestClassC1362() + { + } + } + [Export] + public class TestClassC1363 + { + public TestClassC1363() + { + } + } + [Export] + public class TestClassC1364 + { + public TestClassC1364() + { + } + } + [Export] + public class TestClassC1365 + { + public TestClassC1365() + { + } + } + [Export] + public class TestClassC1366 + { + public TestClassC1366() + { + } + } + [Export] + public class TestClassC1367 + { + public TestClassC1367() + { + } + } + [Export] + public class TestClassC1368 + { + public TestClassC1368() + { + } + } + [Export] + public class TestClassC1369 + { + public TestClassC1369() + { + } + } + [Export] + public class TestClassC1370 + { + public TestClassC1370() + { + } + } + [Export] + public class TestClassC1371 + { + public TestClassC1371() + { + } + } + [Export] + public class TestClassC1372 + { + public TestClassC1372() + { + } + } + [Export] + public class TestClassC1373 + { + public TestClassC1373() + { + } + } + [Export] + public class TestClassC1374 + { + public TestClassC1374() + { + } + } + [Export] + public class TestClassC1375 + { + public TestClassC1375() + { + } + } + [Export] + public class TestClassC1376 + { + public TestClassC1376() + { + } + } + [Export] + public class TestClassC1377 + { + public TestClassC1377() + { + } + } + [Export] + public class TestClassC1378 + { + public TestClassC1378() + { + } + } + [Export] + public class TestClassC1379 + { + public TestClassC1379() + { + } + } + [Export] + public class TestClassC1380 + { + public TestClassC1380() + { + } + } + [Export] + public class TestClassC1381 + { + public TestClassC1381() + { + } + } + [Export] + public class TestClassC1382 + { + public TestClassC1382() + { + } + } + [Export] + public class TestClassC1383 + { + public TestClassC1383() + { + } + } + [Export] + public class TestClassC1384 + { + public TestClassC1384() + { + } + } + [Export] + public class TestClassC1385 + { + public TestClassC1385() + { + } + } + [Export] + public class TestClassC1386 + { + public TestClassC1386() + { + } + } + [Export] + public class TestClassC1387 + { + public TestClassC1387() + { + } + } + [Export] + public class TestClassC1388 + { + public TestClassC1388() + { + } + } + [Export] + public class TestClassC1389 + { + public TestClassC1389() + { + } + } + [Export] + public class TestClassC1390 + { + public TestClassC1390() + { + } + } + [Export] + public class TestClassC1391 + { + public TestClassC1391() + { + } + } + [Export] + public class TestClassC1392 + { + public TestClassC1392() + { + } + } + [Export] + public class TestClassC1393 + { + public TestClassC1393() + { + } + } + [Export] + public class TestClassC1394 + { + public TestClassC1394() + { + } + } + [Export] + public class TestClassC1395 + { + public TestClassC1395() + { + } + } + [Export] + public class TestClassC1396 + { + public TestClassC1396() + { + } + } + [Export] + public class TestClassC1397 + { + public TestClassC1397() + { + } + } + [Export] + public class TestClassC1398 + { + public TestClassC1398() + { + } + } + [Export] + public class TestClassC1399 + { + public TestClassC1399() + { + } + } + [Export] + public class TestClassC1400 + { + public TestClassC1400() + { + } + } + [Export] + public class TestClassC1401 + { + public TestClassC1401() + { + } + } + [Export] + public class TestClassC1402 + { + public TestClassC1402() + { + } + } + [Export] + public class TestClassC1403 + { + public TestClassC1403() + { + } + } + [Export] + public class TestClassC1404 + { + public TestClassC1404() + { + } + } + [Export] + public class TestClassC1405 + { + public TestClassC1405() + { + } + } + [Export] + public class TestClassC1406 + { + public TestClassC1406() + { + } + } + [Export] + public class TestClassC1407 + { + public TestClassC1407() + { + } + } + [Export] + public class TestClassC1408 + { + public TestClassC1408() + { + } + } + [Export] + public class TestClassC1409 + { + public TestClassC1409() + { + } + } + [Export] + public class TestClassC1410 + { + public TestClassC1410() + { + } + } + [Export] + public class TestClassC1411 + { + public TestClassC1411() + { + } + } + [Export] + public class TestClassC1412 + { + public TestClassC1412() + { + } + } + [Export] + public class TestClassC1413 + { + public TestClassC1413() + { + } + } + [Export] + public class TestClassC1414 + { + public TestClassC1414() + { + } + } + [Export] + public class TestClassC1415 + { + public TestClassC1415() + { + } + } + [Export] + public class TestClassC1416 + { + public TestClassC1416() + { + } + } + [Export] + public class TestClassC1417 + { + public TestClassC1417() + { + } + } + [Export] + public class TestClassC1418 + { + public TestClassC1418() + { + } + } + [Export] + public class TestClassC1419 + { + public TestClassC1419() + { + } + } + [Export] + public class TestClassC1420 + { + public TestClassC1420() + { + } + } + [Export] + public class TestClassC1421 + { + public TestClassC1421() + { + } + } + [Export] + public class TestClassC1422 + { + public TestClassC1422() + { + } + } + [Export] + public class TestClassC1423 + { + public TestClassC1423() + { + } + } + [Export] + public class TestClassC1424 + { + public TestClassC1424() + { + } + } + [Export] + public class TestClassC1425 + { + public TestClassC1425() + { + } + } + [Export] + public class TestClassC1426 + { + public TestClassC1426() + { + } + } + [Export] + public class TestClassC1427 + { + public TestClassC1427() + { + } + } + [Export] + public class TestClassC1428 + { + public TestClassC1428() + { + } + } + [Export] + public class TestClassC1429 + { + public TestClassC1429() + { + } + } + [Export] + public class TestClassC1430 + { + public TestClassC1430() + { + } + } + [Export] + public class TestClassC1431 + { + public TestClassC1431() + { + } + } + [Export] + public class TestClassC1432 + { + public TestClassC1432() + { + } + } + [Export] + public class TestClassC1433 + { + public TestClassC1433() + { + } + } + [Export] + public class TestClassC1434 + { + public TestClassC1434() + { + } + } + [Export] + public class TestClassC1435 + { + public TestClassC1435() + { + } + } + [Export] + public class TestClassC1436 + { + public TestClassC1436() + { + } + } + [Export] + public class TestClassC1437 + { + public TestClassC1437() + { + } + } + [Export] + public class TestClassC1438 + { + public TestClassC1438() + { + } + } + [Export] + public class TestClassC1439 + { + public TestClassC1439() + { + } + } + [Export] + public class TestClassC1440 + { + public TestClassC1440() + { + } + } + [Export] + public class TestClassC1441 + { + public TestClassC1441() + { + } + } + [Export] + public class TestClassC1442 + { + public TestClassC1442() + { + } + } + [Export] + public class TestClassC1443 + { + public TestClassC1443() + { + } + } + [Export] + public class TestClassC1444 + { + public TestClassC1444() + { + } + } + [Export] + public class TestClassC1445 + { + public TestClassC1445() + { + } + } + [Export] + public class TestClassC1446 + { + public TestClassC1446() + { + } + } + [Export] + public class TestClassC1447 + { + public TestClassC1447() + { + } + } + [Export] + public class TestClassC1448 + { + public TestClassC1448() + { + } + } + [Export] + public class TestClassC1449 + { + public TestClassC1449() + { + } + } + [Export] + public class TestClassC1450 + { + public TestClassC1450() + { + } + } + [Export] + public class TestClassC1451 + { + public TestClassC1451() + { + } + } + [Export] + public class TestClassC1452 + { + public TestClassC1452() + { + } + } + [Export] + public class TestClassC1453 + { + public TestClassC1453() + { + } + } + [Export] + public class TestClassC1454 + { + public TestClassC1454() + { + } + } + [Export] + public class TestClassC1455 + { + public TestClassC1455() + { + } + } + [Export] + public class TestClassC1456 + { + public TestClassC1456() + { + } + } + [Export] + public class TestClassC1457 + { + public TestClassC1457() + { + } + } + [Export] + public class TestClassC1458 + { + public TestClassC1458() + { + } + } + [Export] + public class TestClassC1459 + { + public TestClassC1459() + { + } + } + [Export] + public class TestClassC1460 + { + public TestClassC1460() + { + } + } + [Export] + public class TestClassC1461 + { + public TestClassC1461() + { + } + } + [Export] + public class TestClassC1462 + { + public TestClassC1462() + { + } + } + [Export] + public class TestClassC1463 + { + public TestClassC1463() + { + } + } + [Export] + public class TestClassC1464 + { + public TestClassC1464() + { + } + } + [Export] + public class TestClassC1465 + { + public TestClassC1465() + { + } + } + [Export] + public class TestClassC1466 + { + public TestClassC1466() + { + } + } + [Export] + public class TestClassC1467 + { + public TestClassC1467() + { + } + } + [Export] + public class TestClassC1468 + { + public TestClassC1468() + { + } + } + [Export] + public class TestClassC1469 + { + public TestClassC1469() + { + } + } + [Export] + public class TestClassC1470 + { + public TestClassC1470() + { + } + } + [Export] + public class TestClassC1471 + { + public TestClassC1471() + { + } + } + [Export] + public class TestClassC1472 + { + public TestClassC1472() + { + } + } + [Export] + public class TestClassC1473 + { + public TestClassC1473() + { + } + } + [Export] + public class TestClassC1474 + { + public TestClassC1474() + { + } + } + [Export] + public class TestClassC1475 + { + public TestClassC1475() + { + } + } + [Export] + public class TestClassC1476 + { + public TestClassC1476() + { + } + } + [Export] + public class TestClassC1477 + { + public TestClassC1477() + { + } + } + [Export] + public class TestClassC1478 + { + public TestClassC1478() + { + } + } + [Export] + public class TestClassC1479 + { + public TestClassC1479() + { + } + } + [Export] + public class TestClassC1480 + { + public TestClassC1480() + { + } + } + [Export] + public class TestClassC1481 + { + public TestClassC1481() + { + } + } + [Export] + public class TestClassC1482 + { + public TestClassC1482() + { + } + } + [Export] + public class TestClassC1483 + { + public TestClassC1483() + { + } + } + [Export] + public class TestClassC1484 + { + public TestClassC1484() + { + } + } + [Export] + public class TestClassC1485 + { + public TestClassC1485() + { + } + } + [Export] + public class TestClassC1486 + { + public TestClassC1486() + { + } + } + [Export] + public class TestClassC1487 + { + public TestClassC1487() + { + } + } + [Export] + public class TestClassC1488 + { + public TestClassC1488() + { + } + } + [Export] + public class TestClassC1489 + { + public TestClassC1489() + { + } + } + [Export] + public class TestClassC1490 + { + public TestClassC1490() + { + } + } + [Export] + public class TestClassC1491 + { + public TestClassC1491() + { + } + } + [Export] + public class TestClassC1492 + { + public TestClassC1492() + { + } + } + [Export] + public class TestClassC1493 + { + public TestClassC1493() + { + } + } + [Export] + public class TestClassC1494 + { + public TestClassC1494() + { + } + } + [Export] + public class TestClassC1495 + { + public TestClassC1495() + { + } + } + [Export] + public class TestClassC1496 + { + public TestClassC1496() + { + } + } + [Export] + public class TestClassC1497 + { + public TestClassC1497() + { + } + } + [Export] + public class TestClassC1498 + { + public TestClassC1498() + { + } + } + [Export] + public class TestClassC1499 + { + public TestClassC1499() + { + } + } + [Export] + public class TestClassC1500 + { + public TestClassC1500() + { + } + } + [Export] + public class TestClassC1501 + { + public TestClassC1501() + { + } + } + [Export] + public class TestClassC1502 + { + public TestClassC1502() + { + } + } + [Export] + public class TestClassC1503 + { + public TestClassC1503() + { + } + } + [Export] + public class TestClassC1504 + { + public TestClassC1504() + { + } + } + [Export] + public class TestClassC1505 + { + public TestClassC1505() + { + } + } + [Export] + public class TestClassC1506 + { + public TestClassC1506() + { + } + } + [Export] + public class TestClassC1507 + { + public TestClassC1507() + { + } + } + [Export] + public class TestClassC1508 + { + public TestClassC1508() + { + } + } + [Export] + public class TestClassC1509 + { + public TestClassC1509() + { + } + } + [Export] + public class TestClassC1510 + { + public TestClassC1510() + { + } + } + [Export] + public class TestClassC1511 + { + public TestClassC1511() + { + } + } + [Export] + public class TestClassC1512 + { + public TestClassC1512() + { + } + } + [Export] + public class TestClassC1513 + { + public TestClassC1513() + { + } + } + [Export] + public class TestClassC1514 + { + public TestClassC1514() + { + } + } + [Export] + public class TestClassC1515 + { + public TestClassC1515() + { + } + } + [Export] + public class TestClassC1516 + { + public TestClassC1516() + { + } + } + [Export] + public class TestClassC1517 + { + public TestClassC1517() + { + } + } + [Export] + public class TestClassC1518 + { + public TestClassC1518() + { + } + } + [Export] + public class TestClassC1519 + { + public TestClassC1519() + { + } + } + [Export] + public class TestClassC1520 + { + public TestClassC1520() + { + } + } + [Export] + public class TestClassC1521 + { + public TestClassC1521() + { + } + } + [Export] + public class TestClassC1522 + { + public TestClassC1522() + { + } + } + [Export] + public class TestClassC1523 + { + public TestClassC1523() + { + } + } + [Export] + public class TestClassC1524 + { + public TestClassC1524() + { + } + } + [Export] + public class TestClassC1525 + { + public TestClassC1525() + { + } + } + [Export] + public class TestClassC1526 + { + public TestClassC1526() + { + } + } + [Export] + public class TestClassC1527 + { + public TestClassC1527() + { + } + } + [Export] + public class TestClassC1528 + { + public TestClassC1528() + { + } + } + [Export] + public class TestClassC1529 + { + public TestClassC1529() + { + } + } + [Export] + public class TestClassC1530 + { + public TestClassC1530() + { + } + } + [Export] + public class TestClassC1531 + { + public TestClassC1531() + { + } + } + [Export] + public class TestClassC1532 + { + public TestClassC1532() + { + } + } + [Export] + public class TestClassC1533 + { + public TestClassC1533() + { + } + } + [Export] + public class TestClassC1534 + { + public TestClassC1534() + { + } + } + [Export] + public class TestClassC1535 + { + public TestClassC1535() + { + } + } + [Export] + public class TestClassC1536 + { + public TestClassC1536() + { + } + } + [Export] + public class TestClassC1537 + { + public TestClassC1537() + { + } + } + [Export] + public class TestClassC1538 + { + public TestClassC1538() + { + } + } + [Export] + public class TestClassC1539 + { + public TestClassC1539() + { + } + } + [Export] + public class TestClassC1540 + { + public TestClassC1540() + { + } + } + [Export] + public class TestClassC1541 + { + public TestClassC1541() + { + } + } + [Export] + public class TestClassC1542 + { + public TestClassC1542() + { + } + } + [Export] + public class TestClassC1543 + { + public TestClassC1543() + { + } + } + [Export] + public class TestClassC1544 + { + public TestClassC1544() + { + } + } + [Export] + public class TestClassC1545 + { + public TestClassC1545() + { + } + } + [Export] + public class TestClassC1546 + { + public TestClassC1546() + { + } + } + [Export] + public class TestClassC1547 + { + public TestClassC1547() + { + } + } + [Export] + public class TestClassC1548 + { + public TestClassC1548() + { + } + } + [Export] + public class TestClassC1549 + { + public TestClassC1549() + { + } + } + [Export] + public class TestClassC1550 + { + public TestClassC1550() + { + } + } + [Export] + public class TestClassC1551 + { + public TestClassC1551() + { + } + } + [Export] + public class TestClassC1552 + { + public TestClassC1552() + { + } + } + [Export] + public class TestClassC1553 + { + public TestClassC1553() + { + } + } + [Export] + public class TestClassC1554 + { + public TestClassC1554() + { + } + } + [Export] + public class TestClassC1555 + { + public TestClassC1555() + { + } + } + [Export] + public class TestClassC1556 + { + public TestClassC1556() + { + } + } + [Export] + public class TestClassC1557 + { + public TestClassC1557() + { + } + } + [Export] + public class TestClassC1558 + { + public TestClassC1558() + { + } + } + [Export] + public class TestClassC1559 + { + public TestClassC1559() + { + } + } + [Export] + public class TestClassC1560 + { + public TestClassC1560() + { + } + } + [Export] + public class TestClassC1561 + { + public TestClassC1561() + { + } + } + [Export] + public class TestClassC1562 + { + public TestClassC1562() + { + } + } + [Export] + public class TestClassC1563 + { + public TestClassC1563() + { + } + } + [Export] + public class TestClassC1564 + { + public TestClassC1564() + { + } + } + [Export] + public class TestClassC1565 + { + public TestClassC1565() + { + } + } + [Export] + public class TestClassC1566 + { + public TestClassC1566() + { + } + } + [Export] + public class TestClassC1567 + { + public TestClassC1567() + { + } + } + [Export] + public class TestClassC1568 + { + public TestClassC1568() + { + } + } + [Export] + public class TestClassC1569 + { + public TestClassC1569() + { + } + } + [Export] + public class TestClassC1570 + { + public TestClassC1570() + { + } + } + [Export] + public class TestClassC1571 + { + public TestClassC1571() + { + } + } + [Export] + public class TestClassC1572 + { + public TestClassC1572() + { + } + } + [Export] + public class TestClassC1573 + { + public TestClassC1573() + { + } + } + [Export] + public class TestClassC1574 + { + public TestClassC1574() + { + } + } + [Export] + public class TestClassC1575 + { + public TestClassC1575() + { + } + } + [Export] + public class TestClassC1576 + { + public TestClassC1576() + { + } + } + [Export] + public class TestClassC1577 + { + public TestClassC1577() + { + } + } + [Export] + public class TestClassC1578 + { + public TestClassC1578() + { + } + } + [Export] + public class TestClassC1579 + { + public TestClassC1579() + { + } + } + [Export] + public class TestClassC1580 + { + public TestClassC1580() + { + } + } + [Export] + public class TestClassC1581 + { + public TestClassC1581() + { + } + } + [Export] + public class TestClassC1582 + { + public TestClassC1582() + { + } + } + [Export] + public class TestClassC1583 + { + public TestClassC1583() + { + } + } + [Export] + public class TestClassC1584 + { + public TestClassC1584() + { + } + } + [Export] + public class TestClassC1585 + { + public TestClassC1585() + { + } + } + [Export] + public class TestClassC1586 + { + public TestClassC1586() + { + } + } + [Export] + public class TestClassC1587 + { + public TestClassC1587() + { + } + } + [Export] + public class TestClassC1588 + { + public TestClassC1588() + { + } + } + [Export] + public class TestClassC1589 + { + public TestClassC1589() + { + } + } + [Export] + public class TestClassC1590 + { + public TestClassC1590() + { + } + } + [Export] + public class TestClassC1591 + { + public TestClassC1591() + { + } + } + [Export] + public class TestClassC1592 + { + public TestClassC1592() + { + } + } + [Export] + public class TestClassC1593 + { + public TestClassC1593() + { + } + } + [Export] + public class TestClassC1594 + { + public TestClassC1594() + { + } + } + [Export] + public class TestClassC1595 + { + public TestClassC1595() + { + } + } + [Export] + public class TestClassC1596 + { + public TestClassC1596() + { + } + } + [Export] + public class TestClassC1597 + { + public TestClassC1597() + { + } + } + [Export] + public class TestClassC1598 + { + public TestClassC1598() + { + } + } + [Export] + public class TestClassC1599 + { + public TestClassC1599() + { + } + } + [Export] + public class TestClassC1600 + { + public TestClassC1600() + { + } + } + [Export] + public class TestClassC1601 + { + public TestClassC1601() + { + } + } + [Export] + public class TestClassC1602 + { + public TestClassC1602() + { + } + } + [Export] + public class TestClassC1603 + { + public TestClassC1603() + { + } + } + [Export] + public class TestClassC1604 + { + public TestClassC1604() + { + } + } + [Export] + public class TestClassC1605 + { + public TestClassC1605() + { + } + } + [Export] + public class TestClassC1606 + { + public TestClassC1606() + { + } + } + [Export] + public class TestClassC1607 + { + public TestClassC1607() + { + } + } + [Export] + public class TestClassC1608 + { + public TestClassC1608() + { + } + } + [Export] + public class TestClassC1609 + { + public TestClassC1609() + { + } + } + [Export] + public class TestClassC1610 + { + public TestClassC1610() + { + } + } + [Export] + public class TestClassC1611 + { + public TestClassC1611() + { + } + } + [Export] + public class TestClassC1612 + { + public TestClassC1612() + { + } + } + [Export] + public class TestClassC1613 + { + public TestClassC1613() + { + } + } + [Export] + public class TestClassC1614 + { + public TestClassC1614() + { + } + } + [Export] + public class TestClassC1615 + { + public TestClassC1615() + { + } + } + [Export] + public class TestClassC1616 + { + public TestClassC1616() + { + } + } + [Export] + public class TestClassC1617 + { + public TestClassC1617() + { + } + } + [Export] + public class TestClassC1618 + { + public TestClassC1618() + { + } + } + [Export] + public class TestClassC1619 + { + public TestClassC1619() + { + } + } + [Export] + public class TestClassC1620 + { + public TestClassC1620() + { + } + } + [Export] + public class TestClassC1621 + { + public TestClassC1621() + { + } + } + [Export] + public class TestClassC1622 + { + public TestClassC1622() + { + } + } + [Export] + public class TestClassC1623 + { + public TestClassC1623() + { + } + } + [Export] + public class TestClassC1624 + { + public TestClassC1624() + { + } + } + [Export] + public class TestClassC1625 + { + public TestClassC1625() + { + } + } + [Export] + public class TestClassC1626 + { + public TestClassC1626() + { + } + } + [Export] + public class TestClassC1627 + { + public TestClassC1627() + { + } + } + [Export] + public class TestClassC1628 + { + public TestClassC1628() + { + } + } + [Export] + public class TestClassC1629 + { + public TestClassC1629() + { + } + } + [Export] + public class TestClassC1630 + { + public TestClassC1630() + { + } + } + [Export] + public class TestClassC1631 + { + public TestClassC1631() + { + } + } + [Export] + public class TestClassC1632 + { + public TestClassC1632() + { + } + } + [Export] + public class TestClassC1633 + { + public TestClassC1633() + { + } + } + [Export] + public class TestClassC1634 + { + public TestClassC1634() + { + } + } + [Export] + public class TestClassC1635 + { + public TestClassC1635() + { + } + } + [Export] + public class TestClassC1636 + { + public TestClassC1636() + { + } + } + [Export] + public class TestClassC1637 + { + public TestClassC1637() + { + } + } + [Export] + public class TestClassC1638 + { + public TestClassC1638() + { + } + } + [Export] + public class TestClassC1639 + { + public TestClassC1639() + { + } + } + [Export] + public class TestClassC1640 + { + public TestClassC1640() + { + } + } + [Export] + public class TestClassC1641 + { + public TestClassC1641() + { + } + } + [Export] + public class TestClassC1642 + { + public TestClassC1642() + { + } + } + [Export] + public class TestClassC1643 + { + public TestClassC1643() + { + } + } + [Export] + public class TestClassC1644 + { + public TestClassC1644() + { + } + } + [Export] + public class TestClassC1645 + { + public TestClassC1645() + { + } + } + [Export] + public class TestClassC1646 + { + public TestClassC1646() + { + } + } + [Export] + public class TestClassC1647 + { + public TestClassC1647() + { + } + } + [Export] + public class TestClassC1648 + { + public TestClassC1648() + { + } + } + [Export] + public class TestClassC1649 + { + public TestClassC1649() + { + } + } + [Export] + public class TestClassC1650 + { + public TestClassC1650() + { + } + } + [Export] + public class TestClassC1651 + { + public TestClassC1651() + { + } + } + [Export] + public class TestClassC1652 + { + public TestClassC1652() + { + } + } + [Export] + public class TestClassC1653 + { + public TestClassC1653() + { + } + } + [Export] + public class TestClassC1654 + { + public TestClassC1654() + { + } + } + [Export] + public class TestClassC1655 + { + public TestClassC1655() + { + } + } + [Export] + public class TestClassC1656 + { + public TestClassC1656() + { + } + } + [Export] + public class TestClassC1657 + { + public TestClassC1657() + { + } + } + [Export] + public class TestClassC1658 + { + public TestClassC1658() + { + } + } + [Export] + public class TestClassC1659 + { + public TestClassC1659() + { + } + } + [Export] + public class TestClassC1660 + { + public TestClassC1660() + { + } + } + [Export] + public class TestClassC1661 + { + public TestClassC1661() + { + } + } + [Export] + public class TestClassC1662 + { + public TestClassC1662() + { + } + } + [Export] + public class TestClassC1663 + { + public TestClassC1663() + { + } + } + [Export] + public class TestClassC1664 + { + public TestClassC1664() + { + } + } + [Export] + public class TestClassC1665 + { + public TestClassC1665() + { + } + } + [Export] + public class TestClassC1666 + { + public TestClassC1666() + { + } + } + [Export] + public class TestClassC1667 + { + public TestClassC1667() + { + } + } + [Export] + public class TestClassC1668 + { + public TestClassC1668() + { + } + } + [Export] + public class TestClassC1669 + { + public TestClassC1669() + { + } + } + [Export] + public class TestClassC1670 + { + public TestClassC1670() + { + } + } + [Export] + public class TestClassC1671 + { + public TestClassC1671() + { + } + } + [Export] + public class TestClassC1672 + { + public TestClassC1672() + { + } + } + [Export] + public class TestClassC1673 + { + public TestClassC1673() + { + } + } + [Export] + public class TestClassC1674 + { + public TestClassC1674() + { + } + } + [Export] + public class TestClassC1675 + { + public TestClassC1675() + { + } + } + [Export] + public class TestClassC1676 + { + public TestClassC1676() + { + } + } + [Export] + public class TestClassC1677 + { + public TestClassC1677() + { + } + } + [Export] + public class TestClassC1678 + { + public TestClassC1678() + { + } + } + [Export] + public class TestClassC1679 + { + public TestClassC1679() + { + } + } + [Export] + public class TestClassC1680 + { + public TestClassC1680() + { + } + } + [Export] + public class TestClassC1681 + { + public TestClassC1681() + { + } + } + [Export] + public class TestClassC1682 + { + public TestClassC1682() + { + } + } + [Export] + public class TestClassC1683 + { + public TestClassC1683() + { + } + } + [Export] + public class TestClassC1684 + { + public TestClassC1684() + { + } + } + [Export] + public class TestClassC1685 + { + public TestClassC1685() + { + } + } + [Export] + public class TestClassC1686 + { + public TestClassC1686() + { + } + } + [Export] + public class TestClassC1687 + { + public TestClassC1687() + { + } + } + [Export] + public class TestClassC1688 + { + public TestClassC1688() + { + } + } + [Export] + public class TestClassC1689 + { + public TestClassC1689() + { + } + } + [Export] + public class TestClassC1690 + { + public TestClassC1690() + { + } + } + [Export] + public class TestClassC1691 + { + public TestClassC1691() + { + } + } + [Export] + public class TestClassC1692 + { + public TestClassC1692() + { + } + } + [Export] + public class TestClassC1693 + { + public TestClassC1693() + { + } + } + [Export] + public class TestClassC1694 + { + public TestClassC1694() + { + } + } + [Export] + public class TestClassC1695 + { + public TestClassC1695() + { + } + } + [Export] + public class TestClassC1696 + { + public TestClassC1696() + { + } + } + [Export] + public class TestClassC1697 + { + public TestClassC1697() + { + } + } + [Export] + public class TestClassC1698 + { + public TestClassC1698() + { + } + } + [Export] + public class TestClassC1699 + { + public TestClassC1699() + { + } + } + [Export] + public class TestClassC1700 + { + public TestClassC1700() + { + } + } + [Export] + public class TestClassC1701 + { + public TestClassC1701() + { + } + } + [Export] + public class TestClassC1702 + { + public TestClassC1702() + { + } + } + [Export] + public class TestClassC1703 + { + public TestClassC1703() + { + } + } + [Export] + public class TestClassC1704 + { + public TestClassC1704() + { + } + } + [Export] + public class TestClassC1705 + { + public TestClassC1705() + { + } + } + [Export] + public class TestClassC1706 + { + public TestClassC1706() + { + } + } + [Export] + public class TestClassC1707 + { + public TestClassC1707() + { + } + } + [Export] + public class TestClassC1708 + { + public TestClassC1708() + { + } + } + [Export] + public class TestClassC1709 + { + public TestClassC1709() + { + } + } + [Export] + public class TestClassC1710 + { + public TestClassC1710() + { + } + } + [Export] + public class TestClassC1711 + { + public TestClassC1711() + { + } + } + [Export] + public class TestClassC1712 + { + public TestClassC1712() + { + } + } + [Export] + public class TestClassC1713 + { + public TestClassC1713() + { + } + } + [Export] + public class TestClassC1714 + { + public TestClassC1714() + { + } + } + [Export] + public class TestClassC1715 + { + public TestClassC1715() + { + } + } + [Export] + public class TestClassC1716 + { + public TestClassC1716() + { + } + } + [Export] + public class TestClassC1717 + { + public TestClassC1717() + { + } + } + [Export] + public class TestClassC1718 + { + public TestClassC1718() + { + } + } + [Export] + public class TestClassC1719 + { + public TestClassC1719() + { + } + } + [Export] + public class TestClassC1720 + { + public TestClassC1720() + { + } + } + [Export] + public class TestClassC1721 + { + public TestClassC1721() + { + } + } + [Export] + public class TestClassC1722 + { + public TestClassC1722() + { + } + } + [Export] + public class TestClassC1723 + { + public TestClassC1723() + { + } + } + [Export] + public class TestClassC1724 + { + public TestClassC1724() + { + } + } + [Export] + public class TestClassC1725 + { + public TestClassC1725() + { + } + } + [Export] + public class TestClassC1726 + { + public TestClassC1726() + { + } + } + [Export] + public class TestClassC1727 + { + public TestClassC1727() + { + } + } + [Export] + public class TestClassC1728 + { + public TestClassC1728() + { + } + } + [Export] + public class TestClassC1729 + { + public TestClassC1729() + { + } + } + [Export] + public class TestClassC1730 + { + public TestClassC1730() + { + } + } + [Export] + public class TestClassC1731 + { + public TestClassC1731() + { + } + } + [Export] + public class TestClassC1732 + { + public TestClassC1732() + { + } + } + [Export] + public class TestClassC1733 + { + public TestClassC1733() + { + } + } + [Export] + public class TestClassC1734 + { + public TestClassC1734() + { + } + } + [Export] + public class TestClassC1735 + { + public TestClassC1735() + { + } + } + [Export] + public class TestClassC1736 + { + public TestClassC1736() + { + } + } + [Export] + public class TestClassC1737 + { + public TestClassC1737() + { + } + } + [Export] + public class TestClassC1738 + { + public TestClassC1738() + { + } + } + [Export] + public class TestClassC1739 + { + public TestClassC1739() + { + } + } + [Export] + public class TestClassC1740 + { + public TestClassC1740() + { + } + } + [Export] + public class TestClassC1741 + { + public TestClassC1741() + { + } + } + [Export] + public class TestClassC1742 + { + public TestClassC1742() + { + } + } + [Export] + public class TestClassC1743 + { + public TestClassC1743() + { + } + } + [Export] + public class TestClassC1744 + { + public TestClassC1744() + { + } + } + [Export] + public class TestClassC1745 + { + public TestClassC1745() + { + } + } + [Export] + public class TestClassC1746 + { + public TestClassC1746() + { + } + } + [Export] + public class TestClassC1747 + { + public TestClassC1747() + { + } + } + [Export] + public class TestClassC1748 + { + public TestClassC1748() + { + } + } + [Export] + public class TestClassC1749 + { + public TestClassC1749() + { + } + } + [Export] + public class TestClassC1750 + { + public TestClassC1750() + { + } + } + [Export] + public class TestClassC1751 + { + public TestClassC1751() + { + } + } + [Export] + public class TestClassC1752 + { + public TestClassC1752() + { + } + } + [Export] + public class TestClassC1753 + { + public TestClassC1753() + { + } + } + [Export] + public class TestClassC1754 + { + public TestClassC1754() + { + } + } + [Export] + public class TestClassC1755 + { + public TestClassC1755() + { + } + } + [Export] + public class TestClassC1756 + { + public TestClassC1756() + { + } + } + [Export] + public class TestClassC1757 + { + public TestClassC1757() + { + } + } + [Export] + public class TestClassC1758 + { + public TestClassC1758() + { + } + } + [Export] + public class TestClassC1759 + { + public TestClassC1759() + { + } + } + [Export] + public class TestClassC1760 + { + public TestClassC1760() + { + } + } + [Export] + public class TestClassC1761 + { + public TestClassC1761() + { + } + } + [Export] + public class TestClassC1762 + { + public TestClassC1762() + { + } + } + [Export] + public class TestClassC1763 + { + public TestClassC1763() + { + } + } + [Export] + public class TestClassC1764 + { + public TestClassC1764() + { + } + } + [Export] + public class TestClassC1765 + { + public TestClassC1765() + { + } + } + [Export] + public class TestClassC1766 + { + public TestClassC1766() + { + } + } + [Export] + public class TestClassC1767 + { + public TestClassC1767() + { + } + } + [Export] + public class TestClassC1768 + { + public TestClassC1768() + { + } + } + [Export] + public class TestClassC1769 + { + public TestClassC1769() + { + } + } + [Export] + public class TestClassC1770 + { + public TestClassC1770() + { + } + } + [Export] + public class TestClassC1771 + { + public TestClassC1771() + { + } + } + [Export] + public class TestClassC1772 + { + public TestClassC1772() + { + } + } + [Export] + public class TestClassC1773 + { + public TestClassC1773() + { + } + } + [Export] + public class TestClassC1774 + { + public TestClassC1774() + { + } + } + [Export] + public class TestClassC1775 + { + public TestClassC1775() + { + } + } + [Export] + public class TestClassC1776 + { + public TestClassC1776() + { + } + } + [Export] + public class TestClassC1777 + { + public TestClassC1777() + { + } + } + [Export] + public class TestClassC1778 + { + public TestClassC1778() + { + } + } + [Export] + public class TestClassC1779 + { + public TestClassC1779() + { + } + } + [Export] + public class TestClassC1780 + { + public TestClassC1780() + { + } + } + [Export] + public class TestClassC1781 + { + public TestClassC1781() + { + } + } + [Export] + public class TestClassC1782 + { + public TestClassC1782() + { + } + } + [Export] + public class TestClassC1783 + { + public TestClassC1783() + { + } + } + [Export] + public class TestClassC1784 + { + public TestClassC1784() + { + } + } + [Export] + public class TestClassC1785 + { + public TestClassC1785() + { + } + } + [Export] + public class TestClassC1786 + { + public TestClassC1786() + { + } + } + [Export] + public class TestClassC1787 + { + public TestClassC1787() + { + } + } + [Export] + public class TestClassC1788 + { + public TestClassC1788() + { + } + } + [Export] + public class TestClassC1789 + { + public TestClassC1789() + { + } + } + [Export] + public class TestClassC1790 + { + public TestClassC1790() + { + } + } + [Export] + public class TestClassC1791 + { + public TestClassC1791() + { + } + } + [Export] + public class TestClassC1792 + { + public TestClassC1792() + { + } + } + [Export] + public class TestClassC1793 + { + public TestClassC1793() + { + } + } + [Export] + public class TestClassC1794 + { + public TestClassC1794() + { + } + } + [Export] + public class TestClassC1795 + { + public TestClassC1795() + { + } + } + [Export] + public class TestClassC1796 + { + public TestClassC1796() + { + } + } + [Export] + public class TestClassC1797 + { + public TestClassC1797() + { + } + } + [Export] + public class TestClassC1798 + { + public TestClassC1798() + { + } + } + [Export] + public class TestClassC1799 + { + public TestClassC1799() + { + } + } + [Export] + public class TestClassC1800 + { + public TestClassC1800() + { + } + } + [Export] + public class TestClassC1801 + { + public TestClassC1801() + { + } + } + [Export] + public class TestClassC1802 + { + public TestClassC1802() + { + } + } + [Export] + public class TestClassC1803 + { + public TestClassC1803() + { + } + } + [Export] + public class TestClassC1804 + { + public TestClassC1804() + { + } + } + [Export] + public class TestClassC1805 + { + public TestClassC1805() + { + } + } + [Export] + public class TestClassC1806 + { + public TestClassC1806() + { + } + } + [Export] + public class TestClassC1807 + { + public TestClassC1807() + { + } + } + [Export] + public class TestClassC1808 + { + public TestClassC1808() + { + } + } + [Export] + public class TestClassC1809 + { + public TestClassC1809() + { + } + } + [Export] + public class TestClassC1810 + { + public TestClassC1810() + { + } + } + [Export] + public class TestClassC1811 + { + public TestClassC1811() + { + } + } + [Export] + public class TestClassC1812 + { + public TestClassC1812() + { + } + } + [Export] + public class TestClassC1813 + { + public TestClassC1813() + { + } + } + [Export] + public class TestClassC1814 + { + public TestClassC1814() + { + } + } + [Export] + public class TestClassC1815 + { + public TestClassC1815() + { + } + } + [Export] + public class TestClassC1816 + { + public TestClassC1816() + { + } + } + [Export] + public class TestClassC1817 + { + public TestClassC1817() + { + } + } + [Export] + public class TestClassC1818 + { + public TestClassC1818() + { + } + } + [Export] + public class TestClassC1819 + { + public TestClassC1819() + { + } + } + [Export] + public class TestClassC1820 + { + public TestClassC1820() + { + } + } + [Export] + public class TestClassC1821 + { + public TestClassC1821() + { + } + } + [Export] + public class TestClassC1822 + { + public TestClassC1822() + { + } + } + [Export] + public class TestClassC1823 + { + public TestClassC1823() + { + } + } + [Export] + public class TestClassC1824 + { + public TestClassC1824() + { + } + } + [Export] + public class TestClassC1825 + { + public TestClassC1825() + { + } + } + [Export] + public class TestClassC1826 + { + public TestClassC1826() + { + } + } + [Export] + public class TestClassC1827 + { + public TestClassC1827() + { + } + } + [Export] + public class TestClassC1828 + { + public TestClassC1828() + { + } + } + [Export] + public class TestClassC1829 + { + public TestClassC1829() + { + } + } + [Export] + public class TestClassC1830 + { + public TestClassC1830() + { + } + } + [Export] + public class TestClassC1831 + { + public TestClassC1831() + { + } + } + [Export] + public class TestClassC1832 + { + public TestClassC1832() + { + } + } + [Export] + public class TestClassC1833 + { + public TestClassC1833() + { + } + } + [Export] + public class TestClassC1834 + { + public TestClassC1834() + { + } + } + [Export] + public class TestClassC1835 + { + public TestClassC1835() + { + } + } + [Export] + public class TestClassC1836 + { + public TestClassC1836() + { + } + } + [Export] + public class TestClassC1837 + { + public TestClassC1837() + { + } + } + [Export] + public class TestClassC1838 + { + public TestClassC1838() + { + } + } + [Export] + public class TestClassC1839 + { + public TestClassC1839() + { + } + } + [Export] + public class TestClassC1840 + { + public TestClassC1840() + { + } + } + [Export] + public class TestClassC1841 + { + public TestClassC1841() + { + } + } + [Export] + public class TestClassC1842 + { + public TestClassC1842() + { + } + } + [Export] + public class TestClassC1843 + { + public TestClassC1843() + { + } + } + [Export] + public class TestClassC1844 + { + public TestClassC1844() + { + } + } + [Export] + public class TestClassC1845 + { + public TestClassC1845() + { + } + } + [Export] + public class TestClassC1846 + { + public TestClassC1846() + { + } + } + [Export] + public class TestClassC1847 + { + public TestClassC1847() + { + } + } + [Export] + public class TestClassC1848 + { + public TestClassC1848() + { + } + } + [Export] + public class TestClassC1849 + { + public TestClassC1849() + { + } + } + [Export] + public class TestClassC1850 + { + public TestClassC1850() + { + } + } + [Export] + public class TestClassC1851 + { + public TestClassC1851() + { + } + } + [Export] + public class TestClassC1852 + { + public TestClassC1852() + { + } + } + [Export] + public class TestClassC1853 + { + public TestClassC1853() + { + } + } + [Export] + public class TestClassC1854 + { + public TestClassC1854() + { + } + } + [Export] + public class TestClassC1855 + { + public TestClassC1855() + { + } + } + [Export] + public class TestClassC1856 + { + public TestClassC1856() + { + } + } + [Export] + public class TestClassC1857 + { + public TestClassC1857() + { + } + } + [Export] + public class TestClassC1858 + { + public TestClassC1858() + { + } + } + [Export] + public class TestClassC1859 + { + public TestClassC1859() + { + } + } + [Export] + public class TestClassC1860 + { + public TestClassC1860() + { + } + } + [Export] + public class TestClassC1861 + { + public TestClassC1861() + { + } + } + [Export] + public class TestClassC1862 + { + public TestClassC1862() + { + } + } + [Export] + public class TestClassC1863 + { + public TestClassC1863() + { + } + } + [Export] + public class TestClassC1864 + { + public TestClassC1864() + { + } + } + [Export] + public class TestClassC1865 + { + public TestClassC1865() + { + } + } + [Export] + public class TestClassC1866 + { + public TestClassC1866() + { + } + } + [Export] + public class TestClassC1867 + { + public TestClassC1867() + { + } + } + [Export] + public class TestClassC1868 + { + public TestClassC1868() + { + } + } + [Export] + public class TestClassC1869 + { + public TestClassC1869() + { + } + } + [Export] + public class TestClassC1870 + { + public TestClassC1870() + { + } + } + [Export] + public class TestClassC1871 + { + public TestClassC1871() + { + } + } + [Export] + public class TestClassC1872 + { + public TestClassC1872() + { + } + } + [Export] + public class TestClassC1873 + { + public TestClassC1873() + { + } + } + [Export] + public class TestClassC1874 + { + public TestClassC1874() + { + } + } + [Export] + public class TestClassC1875 + { + public TestClassC1875() + { + } + } + [Export] + public class TestClassC1876 + { + public TestClassC1876() + { + } + } + [Export] + public class TestClassC1877 + { + public TestClassC1877() + { + } + } + [Export] + public class TestClassC1878 + { + public TestClassC1878() + { + } + } + [Export] + public class TestClassC1879 + { + public TestClassC1879() + { + } + } + [Export] + public class TestClassC1880 + { + public TestClassC1880() + { + } + } + [Export] + public class TestClassC1881 + { + public TestClassC1881() + { + } + } + [Export] + public class TestClassC1882 + { + public TestClassC1882() + { + } + } + [Export] + public class TestClassC1883 + { + public TestClassC1883() + { + } + } + [Export] + public class TestClassC1884 + { + public TestClassC1884() + { + } + } + [Export] + public class TestClassC1885 + { + public TestClassC1885() + { + } + } + [Export] + public class TestClassC1886 + { + public TestClassC1886() + { + } + } + [Export] + public class TestClassC1887 + { + public TestClassC1887() + { + } + } + [Export] + public class TestClassC1888 + { + public TestClassC1888() + { + } + } + [Export] + public class TestClassC1889 + { + public TestClassC1889() + { + } + } + [Export] + public class TestClassC1890 + { + public TestClassC1890() + { + } + } + [Export] + public class TestClassC1891 + { + public TestClassC1891() + { + } + } + [Export] + public class TestClassC1892 + { + public TestClassC1892() + { + } + } + [Export] + public class TestClassC1893 + { + public TestClassC1893() + { + } + } + [Export] + public class TestClassC1894 + { + public TestClassC1894() + { + } + } + [Export] + public class TestClassC1895 + { + public TestClassC1895() + { + } + } + [Export] + public class TestClassC1896 + { + public TestClassC1896() + { + } + } + [Export] + public class TestClassC1897 + { + public TestClassC1897() + { + } + } + [Export] + public class TestClassC1898 + { + public TestClassC1898() + { + } + } + [Export] + public class TestClassC1899 + { + public TestClassC1899() + { + } + } + [Export] + public class TestClassC1900 + { + public TestClassC1900() + { + } + } + [Export] + public class TestClassC1901 + { + public TestClassC1901() + { + } + } + [Export] + public class TestClassC1902 + { + public TestClassC1902() + { + } + } + [Export] + public class TestClassC1903 + { + public TestClassC1903() + { + } + } + [Export] + public class TestClassC1904 + { + public TestClassC1904() + { + } + } + [Export] + public class TestClassC1905 + { + public TestClassC1905() + { + } + } + [Export] + public class TestClassC1906 + { + public TestClassC1906() + { + } + } + [Export] + public class TestClassC1907 + { + public TestClassC1907() + { + } + } + [Export] + public class TestClassC1908 + { + public TestClassC1908() + { + } + } + [Export] + public class TestClassC1909 + { + public TestClassC1909() + { + } + } + [Export] + public class TestClassC1910 + { + public TestClassC1910() + { + } + } + [Export] + public class TestClassC1911 + { + public TestClassC1911() + { + } + } + [Export] + public class TestClassC1912 + { + public TestClassC1912() + { + } + } + [Export] + public class TestClassC1913 + { + public TestClassC1913() + { + } + } + [Export] + public class TestClassC1914 + { + public TestClassC1914() + { + } + } + [Export] + public class TestClassC1915 + { + public TestClassC1915() + { + } + } + [Export] + public class TestClassC1916 + { + public TestClassC1916() + { + } + } + [Export] + public class TestClassC1917 + { + public TestClassC1917() + { + } + } + [Export] + public class TestClassC1918 + { + public TestClassC1918() + { + } + } + [Export] + public class TestClassC1919 + { + public TestClassC1919() + { + } + } + [Export] + public class TestClassC1920 + { + public TestClassC1920() + { + } + } + [Export] + public class TestClassC1921 + { + public TestClassC1921() + { + } + } + [Export] + public class TestClassC1922 + { + public TestClassC1922() + { + } + } + [Export] + public class TestClassC1923 + { + public TestClassC1923() + { + } + } + [Export] + public class TestClassC1924 + { + public TestClassC1924() + { + } + } + [Export] + public class TestClassC1925 + { + public TestClassC1925() + { + } + } + [Export] + public class TestClassC1926 + { + public TestClassC1926() + { + } + } + [Export] + public class TestClassC1927 + { + public TestClassC1927() + { + } + } + [Export] + public class TestClassC1928 + { + public TestClassC1928() + { + } + } + [Export] + public class TestClassC1929 + { + public TestClassC1929() + { + } + } + [Export] + public class TestClassC1930 + { + public TestClassC1930() + { + } + } + [Export] + public class TestClassC1931 + { + public TestClassC1931() + { + } + } + [Export] + public class TestClassC1932 + { + public TestClassC1932() + { + } + } + [Export] + public class TestClassC1933 + { + public TestClassC1933() + { + } + } + [Export] + public class TestClassC1934 + { + public TestClassC1934() + { + } + } + [Export] + public class TestClassC1935 + { + public TestClassC1935() + { + } + } + [Export] + public class TestClassC1936 + { + public TestClassC1936() + { + } + } + [Export] + public class TestClassC1937 + { + public TestClassC1937() + { + } + } + [Export] + public class TestClassC1938 + { + public TestClassC1938() + { + } + } + [Export] + public class TestClassC1939 + { + public TestClassC1939() + { + } + } + [Export] + public class TestClassC1940 + { + public TestClassC1940() + { + } + } + [Export] + public class TestClassC1941 + { + public TestClassC1941() + { + } + } + [Export] + public class TestClassC1942 + { + public TestClassC1942() + { + } + } + [Export] + public class TestClassC1943 + { + public TestClassC1943() + { + } + } + [Export] + public class TestClassC1944 + { + public TestClassC1944() + { + } + } + [Export] + public class TestClassC1945 + { + public TestClassC1945() + { + } + } + [Export] + public class TestClassC1946 + { + public TestClassC1946() + { + } + } + [Export] + public class TestClassC1947 + { + public TestClassC1947() + { + } + } + [Export] + public class TestClassC1948 + { + public TestClassC1948() + { + } + } + [Export] + public class TestClassC1949 + { + public TestClassC1949() + { + } + } + [Export] + public class TestClassC1950 + { + public TestClassC1950() + { + } + } + [Export] + public class TestClassC1951 + { + public TestClassC1951() + { + } + } + [Export] + public class TestClassC1952 + { + public TestClassC1952() + { + } + } + [Export] + public class TestClassC1953 + { + public TestClassC1953() + { + } + } + [Export] + public class TestClassC1954 + { + public TestClassC1954() + { + } + } + [Export] + public class TestClassC1955 + { + public TestClassC1955() + { + } + } + [Export] + public class TestClassC1956 + { + public TestClassC1956() + { + } + } + [Export] + public class TestClassC1957 + { + public TestClassC1957() + { + } + } + [Export] + public class TestClassC1958 + { + public TestClassC1958() + { + } + } + [Export] + public class TestClassC1959 + { + public TestClassC1959() + { + } + } + [Export] + public class TestClassC1960 + { + public TestClassC1960() + { + } + } + [Export] + public class TestClassC1961 + { + public TestClassC1961() + { + } + } + [Export] + public class TestClassC1962 + { + public TestClassC1962() + { + } + } + [Export] + public class TestClassC1963 + { + public TestClassC1963() + { + } + } + [Export] + public class TestClassC1964 + { + public TestClassC1964() + { + } + } + [Export] + public class TestClassC1965 + { + public TestClassC1965() + { + } + } + [Export] + public class TestClassC1966 + { + public TestClassC1966() + { + } + } + [Export] + public class TestClassC1967 + { + public TestClassC1967() + { + } + } + [Export] + public class TestClassC1968 + { + public TestClassC1968() + { + } + } + [Export] + public class TestClassC1969 + { + public TestClassC1969() + { + } + } + [Export] + public class TestClassC1970 + { + public TestClassC1970() + { + } + } + [Export] + public class TestClassC1971 + { + public TestClassC1971() + { + } + } + [Export] + public class TestClassC1972 + { + public TestClassC1972() + { + } + } + [Export] + public class TestClassC1973 + { + public TestClassC1973() + { + } + } + [Export] + public class TestClassC1974 + { + public TestClassC1974() + { + } + } + [Export] + public class TestClassC1975 + { + public TestClassC1975() + { + } + } + [Export] + public class TestClassC1976 + { + public TestClassC1976() + { + } + } + [Export] + public class TestClassC1977 + { + public TestClassC1977() + { + } + } + [Export] + public class TestClassC1978 + { + public TestClassC1978() + { + } + } + [Export] + public class TestClassC1979 + { + public TestClassC1979() + { + } + } + [Export] + public class TestClassC1980 + { + public TestClassC1980() + { + } + } + [Export] + public class TestClassC1981 + { + public TestClassC1981() + { + } + } + [Export] + public class TestClassC1982 + { + public TestClassC1982() + { + } + } + [Export] + public class TestClassC1983 + { + public TestClassC1983() + { + } + } + [Export] + public class TestClassC1984 + { + public TestClassC1984() + { + } + } + [Export] + public class TestClassC1985 + { + public TestClassC1985() + { + } + } + [Export] + public class TestClassC1986 + { + public TestClassC1986() + { + } + } + [Export] + public class TestClassC1987 + { + public TestClassC1987() + { + } + } + [Export] + public class TestClassC1988 + { + public TestClassC1988() + { + } + } + [Export] + public class TestClassC1989 + { + public TestClassC1989() + { + } + } + [Export] + public class TestClassC1990 + { + public TestClassC1990() + { + } + } + [Export] + public class TestClassC1991 + { + public TestClassC1991() + { + } + } + [Export] + public class TestClassC1992 + { + public TestClassC1992() + { + } + } + [Export] + public class TestClassC1993 + { + public TestClassC1993() + { + } + } + [Export] + public class TestClassC1994 + { + public TestClassC1994() + { + } + } + [Export] + public class TestClassC1995 + { + public TestClassC1995() + { + } + } + [Export] + public class TestClassC1996 + { + public TestClassC1996() + { + } + } + [Export] + public class TestClassC1997 + { + public TestClassC1997() + { + } + } + [Export] + public class TestClassC1998 + { + public TestClassC1998() + { + } + } + [Export] + public class TestClassC1999 + { + public TestClassC1999() + { + } + } + [Export] + public class TestClassC2000 + { + public TestClassC2000() + { + } + } + [Export] + public class TestClassC2001 + { + public TestClassC2001() + { + } + } + [Export] + public class TestClassC2002 + { + public TestClassC2002() + { + } + } + [Export] + public class TestClassC2003 + { + public TestClassC2003() + { + } + } + [Export] + public class TestClassC2004 + { + public TestClassC2004() + { + } + } + [Export] + public class TestClassC2005 + { + public TestClassC2005() + { + } + } + [Export] + public class TestClassC2006 + { + public TestClassC2006() + { + } + } + [Export] + public class TestClassC2007 + { + public TestClassC2007() + { + } + } + [Export] + public class TestClassC2008 + { + public TestClassC2008() + { + } + } + [Export] + public class TestClassC2009 + { + public TestClassC2009() + { + } + } + [Export] + public class TestClassC2010 + { + public TestClassC2010() + { + } + } + [Export] + public class TestClassC2011 + { + public TestClassC2011() + { + } + } + [Export] + public class TestClassC2012 + { + public TestClassC2012() + { + } + } + [Export] + public class TestClassC2013 + { + public TestClassC2013() + { + } + } + [Export] + public class TestClassC2014 + { + public TestClassC2014() + { + } + } + [Export] + public class TestClassC2015 + { + public TestClassC2015() + { + } + } + [Export] + public class TestClassC2016 + { + public TestClassC2016() + { + } + } + [Export] + public class TestClassC2017 + { + public TestClassC2017() + { + } + } + [Export] + public class TestClassC2018 + { + public TestClassC2018() + { + } + } + [Export] + public class TestClassC2019 + { + public TestClassC2019() + { + } + } + [Export] + public class TestClassC2020 + { + public TestClassC2020() + { + } + } + [Export] + public class TestClassC2021 + { + public TestClassC2021() + { + } + } + [Export] + public class TestClassC2022 + { + public TestClassC2022() + { + } + } + [Export] + public class TestClassC2023 + { + public TestClassC2023() + { + } + } + [Export] + public class TestClassC2024 + { + public TestClassC2024() + { + } + } + [Export] + public class TestClassC2025 + { + public TestClassC2025() + { + } + } + [Export] + public class TestClassC2026 + { + public TestClassC2026() + { + } + } + [Export] + public class TestClassC2027 + { + public TestClassC2027() + { + } + } + [Export] + public class TestClassC2028 + { + public TestClassC2028() + { + } + } + [Export] + public class TestClassC2029 + { + public TestClassC2029() + { + } + } + [Export] + public class TestClassC2030 + { + public TestClassC2030() + { + } + } + [Export] + public class TestClassC2031 + { + public TestClassC2031() + { + } + } + [Export] + public class TestClassC2032 + { + public TestClassC2032() + { + } + } + [Export] + public class TestClassC2033 + { + public TestClassC2033() + { + } + } + [Export] + public class TestClassC2034 + { + public TestClassC2034() + { + } + } + [Export] + public class TestClassC2035 + { + public TestClassC2035() + { + } + } + [Export] + public class TestClassC2036 + { + public TestClassC2036() + { + } + } + [Export] + public class TestClassC2037 + { + public TestClassC2037() + { + } + } + [Export] + public class TestClassC2038 + { + public TestClassC2038() + { + } + } + [Export] + public class TestClassC2039 + { + public TestClassC2039() + { + } + } + [Export] + public class TestClassC2040 + { + public TestClassC2040() + { + } + } + [Export] + public class TestClassC2041 + { + public TestClassC2041() + { + } + } + [Export] + public class TestClassC2042 + { + public TestClassC2042() + { + } + } + [Export] + public class TestClassC2043 + { + public TestClassC2043() + { + } + } + [Export] + public class TestClassC2044 + { + public TestClassC2044() + { + } + } + [Export] + public class TestClassC2045 + { + public TestClassC2045() + { + } + } +} diff --git a/src/System.Composition/perftests/Microsoft.Composition.ThroughputHarness.csproj b/src/System.Composition/perftests/Microsoft.Composition.ThroughputHarness.csproj new file mode 100644 index 000000000000..f941174dcec2 --- /dev/null +++ b/src/System.Composition/perftests/Microsoft.Composition.ThroughputHarness.csproj @@ -0,0 +1,67 @@ + + + + + + {E3E3DA53-B8AC-46B6-8AAB-EBF751A2D0C3} + Exe + Properties + CompositionThroughput + CompositionThroughput + 512 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + {e6592fad-10b5-4b56-9287-d72dd136992f} + System.Composition.Convention + + + {2b8fecc6-34a1-48fe-ba75-99572d2d6db2} + System.Composition.Hosting + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + {b4b5e15c-e6b9-48ea-94c2-f067484d4d3e} + System.Composition.TypedParts + + + + + diff --git a/src/System.Composition/perftests/Program.cs b/src/System.Composition/perftests/Program.cs new file mode 100644 index 000000000000..90b67a0c224e --- /dev/null +++ b/src/System.Composition/perftests/Program.cs @@ -0,0 +1,153 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal class Program + { + private static void Main(string[] args) + { + //SerialRunForPeformanceAnalysis(new LightweightWebBenchmark()); + //return; + + Console.WriteLine("Composition Throughput Benchmarks"); + Console.WriteLine("================================="); + Console.Write(" "); + WriteResultRow("Benchmark", "Version", "Serial", "Parallel", "Delta", "Start"); + + var suites = new[] { + new Suite("Selftest", 30, new Benchmark[] { + new FiftyPerSecondTestBenchmark() + }), + new Suite("Shootout with New", 20000000, new Benchmark[] { + new LightweightNewBenchmark(), + new LightweightNLNewBenchmark(), + new OperatorNewBenchmark() + }), + new Suite("Huge Graph", 200000, new Benchmark[] { + new LightweightHugeGraphABenchmark(), + new LightweightLongGraphBBenchmark(), + new LightweightHugeGraphCBenchmark(), + new LightweightHugeGraph4Benchmark() + }), + new Suite("Web", 200000, new Benchmark[] { + new NativeCodeWebBenchmark(), + new LightweightWebBenchmark() + }) + }; + + foreach (var suite in suites) + { + RunSuite(suite); + } + } + + private static void Debug(Benchmark benchmark) + { + var op = benchmark.GetOperation(); + op(); + } + + private static void SerialRunForPeformanceAnalysis(Benchmark benchmark) + { + var op = benchmark.GetOperation(); + bool keepGoing = true; + var worker = new Thread(() => + { + while (keepGoing) + { + op(); + } + }); + + worker.Start(); + Thread.Sleep(60000); // Run for 1 minute + keepGoing = false; + worker.Join(); + } + + private static void RunSuite(Suite suite) + { + Console.WriteLine("--- {0} - {1} operations ---", suite.Name, suite.StandardRunOperations); + + var benchmarks = suite.IncludedBenchmarks.Concat(new[] { new ControlBenchmark() }).OrderBy(f => Guid.NewGuid()).ToArray(); + + var results = from f in benchmarks + let op = f.GetOperation() + select new + { + Framework = f, + TestPass = f.SelfTest(), + Startup = MeasureStartupMilliseconds(f), + Serial = ThroughputHarness.MeasureOperationsPerSecond(op, suite.StandardRunOperations, false), + Parallel = ThroughputHarness.MeasureOperationsPerSecond(op, suite.StandardRunOperations * Environment.ProcessorCount, true) + }; + + foreach (var result in results) + { + WritePassFail(result.TestPass, result.Parallel != 0 && result.Serial != 0); + WriteResultRow(result.Framework.Description, + result.Framework.Version.ToString(), + result.Serial, + result.Parallel, + ((decimal)result.Parallel / result.Serial).ToString("#.00"), + result.Startup); + } + } + + private static long MeasureStartupMilliseconds(Benchmark benchmark) + { + var sw = new Stopwatch(); + sw.Start(); + var op = benchmark.GetOperation(); + op(); + sw.Stop(); + return sw.ElapsedMilliseconds; + } + + private static void WritePassFail(bool passed, bool producedResult) + { + var c = ConsoleColor.Red; + var ch = 'F'; + + if (passed) + { + if (producedResult) + { + c = ConsoleColor.Green; + ch = 'P'; + } + else + { + c = ConsoleColor.Yellow; + ch = 'W'; + } + } + + Console.Write("["); + Console.ForegroundColor = c; + Console.Write(ch); + Console.ResetColor(); + Console.Write("] "); + } + + private static void WriteResultRow(string description, string version, object s, object p, object delta, object startup) + { + Console.WriteLine("{0} | {1} | {2} | {3} | {4} | {5}", + description.PadLeft(4).PadRight(21), + version.PadRight(9), + s.ToString().PadLeft(9), + p.ToString().PadLeft(9), + delta.ToString().PadLeft(5), + startup.ToString().PadLeft(4)); + } + } +} diff --git a/src/System.Composition/perftests/Properties/AssemblyInfo.cs b/src/System.Composition/perftests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..34e6861dc112 --- /dev/null +++ b/src/System.Composition/perftests/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + diff --git a/src/System.Composition/perftests/ShootoutWithNewBenchmark.cs b/src/System.Composition/perftests/ShootoutWithNewBenchmark.cs new file mode 100644 index 000000000000..53d9e7cd4d65 --- /dev/null +++ b/src/System.Composition/perftests/ShootoutWithNewBenchmark.cs @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Composition.Hosting; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + [Export] + public class X { } + + [Export] + public class XFactory + { + private readonly ExportFactory _xfactory; + + [ImportingConstructor] + public XFactory(ExportFactory xfactory) + { + _xfactory = xfactory; + } + + public Export CreateX() + { + return _xfactory.CreateExport(); + } + } + + internal abstract class ShootoutWithNewBenchmark : Benchmark + { + public override bool SelfTest() + { + return true; + } + } + + internal class OperatorNewBenchmark : ShootoutWithNewBenchmark + { + public override Action GetOperation() + { + return () => new X(); + } + } + + internal class LightweightNewBenchmark : ShootoutWithNewBenchmark + { + public override Action GetOperation() + { + var c = new ContainerConfiguration() + .WithPart(typeof(X)) + .WithPart(typeof(XFactory)) + .CreateContainer(); + + var xf = c.GetExport(); + return () => + { + var x = xf.CreateX(); + var unused = x.Value; + x.Dispose(); + }; + } + } + + internal class LightweightNLNewBenchmark : ShootoutWithNewBenchmark + { + public override Action GetOperation() + { + var c = new ContainerConfiguration() + .WithPart(typeof(X)) + .CreateContainer(); + + return () => + { + c.GetExport(); + }; + } + } +} diff --git a/src/System.Composition/perftests/Suite.cs b/src/System.Composition/perftests/Suite.cs new file mode 100644 index 000000000000..7a9cda92affa --- /dev/null +++ b/src/System.Composition/perftests/Suite.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal class Suite + { + private readonly string _name; + private readonly int _standardRunOperations; + private readonly Benchmark[] _includedBenchmarks; + + public Suite(string name, int standardRunOperations, Benchmark[] includedBenchmarks) + { + _name = name; _standardRunOperations = standardRunOperations; _includedBenchmarks = includedBenchmarks; + } + + public string Name { get { return _name; } } + + public int StandardRunOperations { get { return _standardRunOperations; } } + + public Benchmark[] IncludedBenchmarks { get { return _includedBenchmarks; } } + } +} diff --git a/src/System.Composition/perftests/ThroughputHarness.cs b/src/System.Composition/perftests/ThroughputHarness.cs new file mode 100644 index 000000000000..4c8d64a7ff78 --- /dev/null +++ b/src/System.Composition/perftests/ThroughputHarness.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal static class ThroughputHarness + { + public static long MeasureOperationsPerSecond(Action operation, int operations, bool isParallel) + { + GC.Collect(); + + var cores = Enumerable.Range(0, System.Environment.ProcessorCount); + var opsPerCore = operations / System.Environment.ProcessorCount; + + try + { + var sw = new Stopwatch(); + sw.Start(); + + if (isParallel) + { + cores.AsParallel().ForAll(core => + { + for (var j = 0; j < opsPerCore; ++j) + operation(); + }); + } + else + { + for (var op = 0; op < operations; ++op) + operation(); + } + + sw.Stop(); + return (long)((decimal)operations * Stopwatch.Frequency / sw.ElapsedTicks); + } + catch + { + return 0; + } + } + } +} diff --git a/src/System.Composition/perftests/WebBenchmarkScenario.cs b/src/System.Composition/perftests/WebBenchmarkScenario.cs new file mode 100644 index 000000000000..edecd3e29739 --- /dev/null +++ b/src/System.Composition/perftests/WebBenchmarkScenario.cs @@ -0,0 +1,132 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CompositionThroughput.Web +{ + internal static class Boundaries + { + public const string Web = "Web"; + } + + [Export, Shared] + public class GlobalA + { + } + + [Export, Shared] + public class GlobalB + { + } + + [Export, Shared(Boundaries.Web)] + public class A + { + private readonly GlobalA _ga; + + [ImportingConstructor] + public A(GlobalA ga) { _ga = ga; } + + public GlobalA GA { get { return _ga; } } + } + + [Export, Shared(Boundaries.Web)] + public class B + { + private readonly GlobalB _gb; + + [ImportingConstructor] + public B(GlobalB gb) { _gb = gb; } + + public GlobalB GB { get { return _gb; } } + } + + [Export] + public class Transient + { + } + + [Export, Shared(Boundaries.Web)] + public class Wide + { + private readonly A _a1, _a2; + private readonly B _b; + private readonly Transient _t; + + [ImportingConstructor] + public Wide(A a1, A a2, B b, Transient t) { _a1 = a1; _a2 = a2; _b = b; _t = t; } + + public A A1 { get { return _a1; } } + + public A A2 { get { return _a2; } } + + public B B { get { return _b; } } + + public Transient T { get { return _t; } } + } + + public class Disposable : IDisposable + { + public bool IsDisposed { get; set; } + public void Dispose() { IsDisposed = true; } + } + + [Export, Shared(Boundaries.Web)] + public class TailA : Disposable + { + private readonly TailB _b; + + [ImportingConstructor] + public TailA(TailB b) { _b = b; } + + public TailB TailB { get { return _b; } } + } + + [Export, Shared(Boundaries.Web)] + public class TailB : Disposable + { + private readonly TailC _c; + + [ImportingConstructor] + public TailB(TailC c) { _c = c; } + + public TailC TailC { get { return _c; } } + } + + [Export, Shared(Boundaries.Web)] + public class TailC : Disposable + { + } + + [Export, Shared(Boundaries.Web)] + public class Long + { + private readonly TailA _a; + + [ImportingConstructor] + public Long(TailA a) { _a = a; } + + public TailA TailA { get { return _a; } } + } + + [Export, Shared(Boundaries.Web)] + public class OperationRoot + { + private readonly Wide _w; + private readonly Long _l; + + [ImportingConstructor] + public OperationRoot(Wide w, Long l) { _w = w; _l = l; } + + public Long Long { get { return _l; } } + + public Wide Wide { get { return _w; } } + } +} + diff --git a/src/System.Composition/perftests/WebBenchmarks.cs b/src/System.Composition/perftests/WebBenchmarks.cs new file mode 100644 index 000000000000..c563dcabcc55 --- /dev/null +++ b/src/System.Composition/perftests/WebBenchmarks.cs @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Composition.Hosting; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CompositionThroughput +{ + internal abstract class WebBenchmark : Benchmark + { + public override Action GetOperation() + { + var op = GetCompositionOperation(); + return () => op().Item2(); + } + + public override bool SelfTest() + { + var op = GetCompositionOperation(); + var r1 = op(); + + if (!(r1.Item1 is Web.OperationRoot)) + return false; + + r1.Item2(); + var or1 = (Web.OperationRoot)r1.Item1; + if (!(or1.Long.TailA.IsDisposed && + or1.Long.TailA.TailB.IsDisposed && + or1.Long.TailA.TailB.TailC.IsDisposed)) + return false; + + if (or1.Wide.A1 != or1.Wide.A2) + return false; + + var r2 = op(); + if (r2.Item1 == r1.Item1) + return false; + + var or2 = (Web.OperationRoot)r2.Item1; + if (or2.Long.TailA.IsDisposed) + return false; + + if (or1.Wide.A1 == or2.Wide.A1) + return false; + + if (or1.Wide.A1.GA != or2.Wide.A1.GA) + return false; + + r2.Item2(); + return true; + } + + public abstract Func> GetCompositionOperation(); + } + + internal class LightweightWebBenchmark : WebBenchmark + { + [Export] + private class WebServer + { + [Import, SharingBoundary(Web.Boundaries.Web)] + public ExportFactory WebScopeFactory { get; set; } + } + + public override Func> GetCompositionOperation() + { + var container = new ContainerConfiguration() + .WithParts(new[]{ + typeof(WebServer), + typeof(Web.OperationRoot), + typeof(Web.GlobalA), + typeof(Web.GlobalB), + typeof(Web.Transient), + typeof(Web.Wide), + typeof(Web.A), + typeof(Web.B), + typeof(Web.Long), + typeof(Web.TailA), + typeof(Web.TailB), + typeof(Web.TailC)}) + .CreateContainer(); + + var sf = container.GetExport().WebScopeFactory; + return () => + { + var x = sf.CreateExport(); + return Tuple.Create(x.Value, x.Dispose); + }; + } + } + + internal class NativeCodeWebBenchmark : WebBenchmark + { + public override Func> GetCompositionOperation() + { + var globalA = new Web.GlobalA(); + var globalB = new Web.GlobalB(); + return () => + { + var tc = new Web.TailC(); + var tb = new Web.TailB(tc); + var ta = new Web.TailA(tb); + var a = new Web.A(globalA); + var b = new Web.B(globalB); + var transient = new Web.Transient(); + var w = new Web.Wide(a, a, b, transient); + var l = new Web.Long(ta); + var r = new Web.OperationRoot(w, l); + return Tuple.Create(r, () => { ta.Dispose(); tb.Dispose(); tc.Dispose(); }); + }; + } + } + + internal static class CompositionScope + { + public const string Global = "Global"; + } +} diff --git a/src/System.Composition/perftests/project.json b/src/System.Composition/perftests/project.json new file mode 100644 index 000000000000..3f587568a335 --- /dev/null +++ b/src/System.Composition/perftests/project.json @@ -0,0 +1,18 @@ +{ + "dependencies": { + "System.Collections": "4.0.10", + "System.Collections.Concurrent": "4.0.10", + "System.Console": "4.0.0-beta-23019", + "System.Linq": "4.0.0", + "System.Linq.Parallel": "4.0.0", + "System.Reflection": "4.0.10", + "System.Runtime": "4.0.20", + "System.Runtime.Extensions": "4.0.10", + "System.Threading": "4.0.10", + "System.Threading.Tasks.Parallel": "4.0.0", + "System.Threading.Thread": "4.0.0-beta-23019" + }, + "frameworks": { + "dnxcore50": {} + } +} \ No newline at end of file diff --git a/src/System.Composition/perftests/project.lock.json b/src/System.Composition/perftests/project.lock.json new file mode 100644 index 000000000000..485186865f45 --- /dev/null +++ b/src/System.Composition/perftests/project.lock.json @@ -0,0 +1,935 @@ +{ + "locked": true, + "version": -9996, + "targets": { + "DNXCore,Version=v5.0": { + "System.Collections/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Collections.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Collections.dll": {} + } + }, + "System.Collections.Concurrent/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Threading.Tasks": "4.0.10", + "System.Diagnostics.Tracing": "4.0.20", + "System.Resources.ResourceManager": "4.0.0", + "System.Diagnostics.Debug": "4.0.10", + "System.Threading": "4.0.10", + "System.Collections": "4.0.10", + "System.Runtime.Extensions": "4.0.10", + "System.Globalization": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Collections.Concurrent.dll": {} + }, + "runtime": { + "lib/dotnet/System.Collections.Concurrent.dll": {} + } + }, + "System.Console/4.0.0-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23019", + "System.Runtime.InteropServices": "4.0.20-beta-23019", + "System.Resources.ResourceManager": "4.0.0-beta-23019", + "System.IO.FileSystem.Primitives": "4.0.0-beta-23019", + "System.IO": "4.0.10-beta-23019", + "System.Threading.Tasks": "4.0.10-beta-23019", + "System.Text.Encoding": "4.0.10-beta-23019", + "System.Threading": "4.0.10-beta-23019", + "System.Text.Encoding.Extensions": "4.0.10-beta-23019" + }, + "compile": { + "ref/dotnet/System.Console.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Console.dll": {} + } + }, + "System.Diagnostics.Debug/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Diagnostics.Debug.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Diagnostics.Debug.dll": {} + } + }, + "System.Diagnostics.Tracing/4.0.20": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Diagnostics.Tracing.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Diagnostics.Tracing.dll": {} + } + }, + "System.Globalization/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Globalization.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Globalization.dll": {} + } + }, + "System.IO/4.0.10-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23019", + "System.Text.Encoding": "4.0.0-beta-23019", + "System.Threading.Tasks": "4.0.0-beta-23019" + }, + "compile": { + "ref/dotnet/System.IO.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.IO.dll": {} + } + }, + "System.IO.FileSystem.Primitives/4.0.0-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.20-beta-23019" + }, + "compile": { + "ref/dotnet/System.IO.FileSystem.Primitives.dll": {} + }, + "runtime": { + "lib/dotnet/System.IO.FileSystem.Primitives.dll": {} + } + }, + "System.Linq/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Collections": "4.0.10", + "System.Resources.ResourceManager": "4.0.0", + "System.Diagnostics.Debug": "4.0.10", + "System.Runtime.Extensions": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Linq.dll": {} + }, + "runtime": { + "lib/dotnet/System.Linq.dll": {} + } + }, + "System.Linq.Parallel/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Collections.Concurrent": "4.0.10", + "System.Linq": "4.0.0", + "System.Collections": "4.0.10", + "System.Threading.Tasks": "4.0.10", + "System.Diagnostics.Tracing": "4.0.20", + "System.Resources.ResourceManager": "4.0.0", + "System.Threading": "4.0.10", + "System.Diagnostics.Debug": "4.0.10", + "System.Runtime.Extensions": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Linq.Parallel.dll": {} + }, + "runtime": { + "lib/dotnet/System.Linq.Parallel.dll": {} + } + }, + "System.Private.Uri/4.0.0": { + "runtime": { + "lib/DNXCore50/System.Private.Uri.dll": {} + } + }, + "System.Reflection/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.IO": "4.0.0", + "System.Reflection.Primitives": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.dll": {} + } + }, + "System.Reflection.Primitives/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Primitives.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Primitives.dll": {} + } + }, + "System.Resources.ResourceManager/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Globalization": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Resources.ResourceManager.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Resources.ResourceManager.dll": {} + } + }, + "System.Runtime/4.0.20": { + "dependencies": { + "System.Private.Uri": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.dll": {} + } + }, + "System.Runtime.Extensions/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Runtime.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Extensions.dll": {} + } + }, + "System.Runtime.Handles/4.0.0-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23019" + }, + "compile": { + "ref/dotnet/System.Runtime.Handles.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Handles.dll": {} + } + }, + "System.Runtime.InteropServices/4.0.20-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23019", + "System.Reflection": "4.0.0-beta-23019", + "System.Reflection.Primitives": "4.0.0-beta-23019", + "System.Runtime.Handles": "4.0.0-beta-23019" + }, + "compile": { + "ref/dotnet/System.Runtime.InteropServices.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.InteropServices.dll": {} + } + }, + "System.Text.Encoding/4.0.10-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23019" + }, + "compile": { + "ref/dotnet/System.Text.Encoding.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Text.Encoding.dll": {} + } + }, + "System.Text.Encoding.Extensions/4.0.10-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23019", + "System.Text.Encoding": "4.0.10-beta-23019" + }, + "compile": { + "ref/dotnet/System.Text.Encoding.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Text.Encoding.Extensions.dll": {} + } + }, + "System.Threading/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Threading.Tasks": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.dll": {} + } + }, + "System.Threading.Tasks/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.Tasks.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.Tasks.dll": {} + } + }, + "System.Threading.Tasks.Parallel/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Collections.Concurrent": "4.0.10", + "System.Threading.Tasks": "4.0.10", + "System.Diagnostics.Tracing": "4.0.20", + "System.Resources.ResourceManager": "4.0.0", + "System.Diagnostics.Debug": "4.0.10", + "System.Threading": "4.0.10", + "System.Runtime.Extensions": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Threading.Tasks.Parallel.dll": {} + }, + "runtime": { + "lib/dotnet/System.Threading.Tasks.Parallel.dll": {} + } + }, + "System.Threading.Thread/4.0.0-beta-23019": { + "dependencies": { + "System.Runtime": "4.0.0-beta-23019" + }, + "compile": { + "ref/dotnet/System.Threading.Thread.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.Thread.dll": {} + } + } + } + }, + "libraries": { + "System.Collections/4.0.10": { + "serviceable": true, + "sha512": "ux6ilcZZjV/Gp7JEZpe+2V1eTueq6NuoGRM3eZCFuPM25hLVVgCRuea6STW8hvqreIOE59irJk5/ovpA5xQipw==", + "files": [ + "System.Collections.4.0.10.nupkg", + "System.Collections.4.0.10.nupkg.sha512", + "System.Collections.nuspec", + "lib/DNXCore50/System.Collections.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Collections.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Collections.dll", + "ref/dotnet/System.Collections.xml", + "ref/dotnet/de/System.Collections.xml", + "ref/dotnet/es/System.Collections.xml", + "ref/dotnet/fr/System.Collections.xml", + "ref/dotnet/it/System.Collections.xml", + "ref/dotnet/ja/System.Collections.xml", + "ref/dotnet/ko/System.Collections.xml", + "ref/dotnet/ru/System.Collections.xml", + "ref/dotnet/zh-hans/System.Collections.xml", + "ref/dotnet/zh-hant/System.Collections.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Collections.dll" + ] + }, + "System.Collections.Concurrent/4.0.10": { + "serviceable": true, + "sha512": "ZtMEqOPAjAIqR8fqom9AOKRaB94a+emO2O8uOP6vyJoNswSPrbiwN7iH53rrVpvjMVx0wr4/OMpI7486uGZjbw==", + "files": [ + "System.Collections.Concurrent.4.0.10.nupkg", + "System.Collections.Concurrent.4.0.10.nupkg.sha512", + "System.Collections.Concurrent.nuspec", + "lib/dotnet/System.Collections.Concurrent.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Collections.Concurrent.dll", + "ref/dotnet/System.Collections.Concurrent.xml", + "ref/dotnet/de/System.Collections.Concurrent.xml", + "ref/dotnet/es/System.Collections.Concurrent.xml", + "ref/dotnet/fr/System.Collections.Concurrent.xml", + "ref/dotnet/it/System.Collections.Concurrent.xml", + "ref/dotnet/ja/System.Collections.Concurrent.xml", + "ref/dotnet/ko/System.Collections.Concurrent.xml", + "ref/dotnet/ru/System.Collections.Concurrent.xml", + "ref/dotnet/zh-hans/System.Collections.Concurrent.xml", + "ref/dotnet/zh-hant/System.Collections.Concurrent.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Console/4.0.0-beta-23019": { + "sha512": "RuoqqvFoPFtGJXb8+yigoz8EmNIUFfrMvb1Ea6uMJbhd5nqCRvzjyyWBaDJBRNhVOCPVQldhU4q2rG2W2IfXDQ==", + "files": [ + "System.Console.4.0.0-beta-23019.nupkg", + "System.Console.4.0.0-beta-23019.nupkg.sha512", + "System.Console.nuspec", + "lib/DNXCore50/System.Console.dll", + "lib/net46/System.Console.dll", + "ref/dotnet/System.Console.dll", + "ref/net46/System.Console.dll" + ] + }, + "System.Diagnostics.Debug/4.0.10": { + "serviceable": true, + "sha512": "pi2KthuvI2LWV2c2V+fwReDsDiKpNl040h6DcwFOb59SafsPT/V1fCy0z66OKwysurJkBMmp5j5CBe3Um+ub0g==", + "files": [ + "System.Diagnostics.Debug.4.0.10.nupkg", + "System.Diagnostics.Debug.4.0.10.nupkg.sha512", + "System.Diagnostics.Debug.nuspec", + "lib/DNXCore50/System.Diagnostics.Debug.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Diagnostics.Debug.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Diagnostics.Debug.dll", + "ref/dotnet/System.Diagnostics.Debug.xml", + "ref/dotnet/de/System.Diagnostics.Debug.xml", + "ref/dotnet/es/System.Diagnostics.Debug.xml", + "ref/dotnet/fr/System.Diagnostics.Debug.xml", + "ref/dotnet/it/System.Diagnostics.Debug.xml", + "ref/dotnet/ja/System.Diagnostics.Debug.xml", + "ref/dotnet/ko/System.Diagnostics.Debug.xml", + "ref/dotnet/ru/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hans/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hant/System.Diagnostics.Debug.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Diagnostics.Debug.dll" + ] + }, + "System.Diagnostics.Tracing/4.0.20": { + "serviceable": true, + "sha512": "gn/wexGHc35Fv++5L1gYHMY5g25COfiZ0PGrL+3PfwzoJd4X2LbTAm/U8d385SI6BKQBI/z4dQfvneS9J27+Tw==", + "files": [ + "System.Diagnostics.Tracing.4.0.20.nupkg", + "System.Diagnostics.Tracing.4.0.20.nupkg.sha512", + "System.Diagnostics.Tracing.nuspec", + "lib/DNXCore50/System.Diagnostics.Tracing.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Diagnostics.Tracing.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Diagnostics.Tracing.dll", + "ref/dotnet/System.Diagnostics.Tracing.xml", + "ref/dotnet/de/System.Diagnostics.Tracing.xml", + "ref/dotnet/es/System.Diagnostics.Tracing.xml", + "ref/dotnet/fr/System.Diagnostics.Tracing.xml", + "ref/dotnet/it/System.Diagnostics.Tracing.xml", + "ref/dotnet/ja/System.Diagnostics.Tracing.xml", + "ref/dotnet/ko/System.Diagnostics.Tracing.xml", + "ref/dotnet/ru/System.Diagnostics.Tracing.xml", + "ref/dotnet/zh-hans/System.Diagnostics.Tracing.xml", + "ref/dotnet/zh-hant/System.Diagnostics.Tracing.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Diagnostics.Tracing.dll" + ] + }, + "System.Globalization/4.0.10": { + "sha512": "kzRtbbCNAxdafFBDogcM36ehA3th8c1PGiz8QRkZn8O5yMBorDHSK8/TGJPYOaCS5zdsGk0u9qXHnW91nqy7fw==", + "files": [ + "System.Globalization.4.0.10.nupkg", + "System.Globalization.4.0.10.nupkg.sha512", + "System.Globalization.nuspec", + "lib/DNXCore50/System.Globalization.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Globalization.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Globalization.dll", + "ref/dotnet/System.Globalization.xml", + "ref/dotnet/de/System.Globalization.xml", + "ref/dotnet/es/System.Globalization.xml", + "ref/dotnet/fr/System.Globalization.xml", + "ref/dotnet/it/System.Globalization.xml", + "ref/dotnet/ja/System.Globalization.xml", + "ref/dotnet/ko/System.Globalization.xml", + "ref/dotnet/ru/System.Globalization.xml", + "ref/dotnet/zh-hans/System.Globalization.xml", + "ref/dotnet/zh-hant/System.Globalization.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Globalization.dll" + ] + }, + "System.IO/4.0.10-beta-23019": { + "sha512": "/FgcleTGRMbI9XXlZCNNyNCLb+DzLXdyw2KqF1U0Su+Z8ztLBgpXGI9Vv1adnqRXXolBPNSlnHBMNEGqZzMYvA==", + "files": [ + "System.IO.4.0.10-beta-23019.nupkg", + "System.IO.4.0.10-beta-23019.nupkg.sha512", + "System.IO.nuspec", + "lib/DNXCore50/System.IO.dll", + "lib/net46/_._", + "lib/netcore50/System.IO.dll", + "ref/dotnet/System.IO.dll", + "ref/net46/_._", + "runtimes/win8-aot/lib/netcore50/System.IO.dll" + ] + }, + "System.IO.FileSystem.Primitives/4.0.0-beta-23019": { + "sha512": "wGjn8X4EAnKEH4+uZ3CjiUCHW9WoXuWFNrzORmMhzvHpmxJUsiZkjvKhXGakclVlqMI+T4yn+MDwbrpC3TGofQ==", + "files": [ + "System.IO.FileSystem.Primitives.4.0.0-beta-23019.nupkg", + "System.IO.FileSystem.Primitives.4.0.0-beta-23019.nupkg.sha512", + "System.IO.FileSystem.Primitives.nuspec", + "lib/dotnet/System.IO.FileSystem.Primitives.dll", + "lib/net46/System.IO.FileSystem.Primitives.dll", + "ref/dotnet/System.IO.FileSystem.Primitives.dll", + "ref/net46/System.IO.FileSystem.Primitives.dll" + ] + }, + "System.Linq/4.0.0": { + "serviceable": true, + "sha512": "r6Hlc+ytE6m/9UBr+nNRRdoJEWjoeQiT3L3lXYFDHoXk3VYsRBCDNXrawcexw7KPLaH0zamQLiAb6avhZ50cGg==", + "files": [ + "System.Linq.4.0.0.nupkg", + "System.Linq.4.0.0.nupkg.sha512", + "System.Linq.nuspec", + "lib/dotnet/System.Linq.dll", + "lib/net45/_._", + "lib/netcore50/System.Linq.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Linq.dll", + "ref/dotnet/System.Linq.xml", + "ref/dotnet/de/System.Linq.xml", + "ref/dotnet/es/System.Linq.xml", + "ref/dotnet/fr/System.Linq.xml", + "ref/dotnet/it/System.Linq.xml", + "ref/dotnet/ja/System.Linq.xml", + "ref/dotnet/ko/System.Linq.xml", + "ref/dotnet/ru/System.Linq.xml", + "ref/dotnet/zh-hans/System.Linq.xml", + "ref/dotnet/zh-hant/System.Linq.xml", + "ref/net45/_._", + "ref/netcore50/System.Linq.dll", + "ref/netcore50/System.Linq.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._" + ] + }, + "System.Linq.Parallel/4.0.0": { + "serviceable": true, + "sha512": "PtH7KKh1BbzVow4XY17pnrn7Io63ApMdwzRE2o2HnzsKQD/0o7X5xe6mxrDUqTm9ZCR3/PNhAlP13VY1HnHsbA==", + "files": [ + "System.Linq.Parallel.4.0.0.nupkg", + "System.Linq.Parallel.4.0.0.nupkg.sha512", + "System.Linq.Parallel.nuspec", + "lib/dotnet/System.Linq.Parallel.dll", + "lib/net45/_._", + "lib/netcore50/System.Linq.Parallel.dll", + "lib/win8/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Linq.Parallel.dll", + "ref/dotnet/System.Linq.Parallel.xml", + "ref/dotnet/de/System.Linq.Parallel.xml", + "ref/dotnet/es/System.Linq.Parallel.xml", + "ref/dotnet/fr/System.Linq.Parallel.xml", + "ref/dotnet/it/System.Linq.Parallel.xml", + "ref/dotnet/ja/System.Linq.Parallel.xml", + "ref/dotnet/ko/System.Linq.Parallel.xml", + "ref/dotnet/ru/System.Linq.Parallel.xml", + "ref/dotnet/zh-hans/System.Linq.Parallel.xml", + "ref/dotnet/zh-hant/System.Linq.Parallel.xml", + "ref/net45/_._", + "ref/netcore50/System.Linq.Parallel.dll", + "ref/netcore50/System.Linq.Parallel.xml", + "ref/win8/_._", + "ref/wpa81/_._" + ] + }, + "System.Private.Uri/4.0.0": { + "serviceable": true, + "sha512": "CtuxaCKcRIvPcsqquVl3mPp79EDZPMr2UogfiFCxCs+t2z1VjbpQsKNs1GHZ8VQetqbk1mr0V1yAfMe6y8CHDA==", + "files": [ + "System.Private.Uri.4.0.0.nupkg", + "System.Private.Uri.4.0.0.nupkg.sha512", + "System.Private.Uri.nuspec", + "lib/DNXCore50/System.Private.Uri.dll", + "lib/netcore50/System.Private.Uri.dll", + "ref/dnxcore50/_._", + "ref/netcore50/_._", + "runtimes/win8-aot/lib/netcore50/System.Private.Uri.dll" + ] + }, + "System.Reflection/4.0.10": { + "sha512": "WZ+4lEE4gqGx6mrqLhSiW4oi6QLPWwdNjzhhTONmhELOrW8Cw9phlO9tltgvRUuQUqYtBiliFwhO5S5fCJElVw==", + "files": [ + "System.Reflection.4.0.10.nupkg", + "System.Reflection.4.0.10.nupkg.sha512", + "System.Reflection.nuspec", + "lib/DNXCore50/System.Reflection.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Reflection.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.dll", + "ref/dotnet/System.Reflection.xml", + "ref/dotnet/de/System.Reflection.xml", + "ref/dotnet/es/System.Reflection.xml", + "ref/dotnet/fr/System.Reflection.xml", + "ref/dotnet/it/System.Reflection.xml", + "ref/dotnet/ja/System.Reflection.xml", + "ref/dotnet/ko/System.Reflection.xml", + "ref/dotnet/ru/System.Reflection.xml", + "ref/dotnet/zh-hans/System.Reflection.xml", + "ref/dotnet/zh-hant/System.Reflection.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.dll" + ] + }, + "System.Reflection.Primitives/4.0.0": { + "serviceable": true, + "sha512": "n9S0XpKv2ruc17FSnaiX6nV47VfHTZ1wLjKZlAirUZCvDQCH71mVp+Ohabn0xXLh5pK2PKp45HCxkqu5Fxn/lA==", + "files": [ + "System.Reflection.Primitives.4.0.0.nupkg", + "System.Reflection.Primitives.4.0.0.nupkg.sha512", + "System.Reflection.Primitives.nuspec", + "lib/DNXCore50/System.Reflection.Primitives.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Primitives.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Reflection.Primitives.dll", + "ref/dotnet/System.Reflection.Primitives.xml", + "ref/dotnet/de/System.Reflection.Primitives.xml", + "ref/dotnet/es/System.Reflection.Primitives.xml", + "ref/dotnet/fr/System.Reflection.Primitives.xml", + "ref/dotnet/it/System.Reflection.Primitives.xml", + "ref/dotnet/ja/System.Reflection.Primitives.xml", + "ref/dotnet/ko/System.Reflection.Primitives.xml", + "ref/dotnet/ru/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hans/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hant/System.Reflection.Primitives.xml", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Primitives.dll", + "ref/netcore50/System.Reflection.Primitives.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.Primitives.dll" + ] + }, + "System.Resources.ResourceManager/4.0.0": { + "serviceable": true, + "sha512": "qmqeZ4BJgjfU+G2JbrZt4Dk1LsMxO4t+f/9HarNY6w8pBgweO6jT+cknUH7c3qIrGvyUqraBhU45Eo6UtA0fAw==", + "files": [ + "System.Resources.ResourceManager.4.0.0.nupkg", + "System.Resources.ResourceManager.4.0.0.nupkg.sha512", + "System.Resources.ResourceManager.nuspec", + "lib/DNXCore50/System.Resources.ResourceManager.dll", + "lib/net45/_._", + "lib/netcore50/System.Resources.ResourceManager.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Resources.ResourceManager.dll", + "ref/dotnet/System.Resources.ResourceManager.xml", + "ref/dotnet/de/System.Resources.ResourceManager.xml", + "ref/dotnet/es/System.Resources.ResourceManager.xml", + "ref/dotnet/fr/System.Resources.ResourceManager.xml", + "ref/dotnet/it/System.Resources.ResourceManager.xml", + "ref/dotnet/ja/System.Resources.ResourceManager.xml", + "ref/dotnet/ko/System.Resources.ResourceManager.xml", + "ref/dotnet/ru/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hans/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hant/System.Resources.ResourceManager.xml", + "ref/net45/_._", + "ref/netcore50/System.Resources.ResourceManager.dll", + "ref/netcore50/System.Resources.ResourceManager.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Resources.ResourceManager.dll" + ] + }, + "System.Runtime/4.0.20": { + "serviceable": true, + "sha512": "X7N/9Bz7jVPorqdVFO86ns1sX6MlQM+WTxELtx+Z4VG45x9+LKmWH0GRqjgKprUnVuwmfB9EJ9DQng14Z7/zwg==", + "files": [ + "System.Runtime.4.0.20.nupkg", + "System.Runtime.4.0.20.nupkg.sha512", + "System.Runtime.nuspec", + "lib/DNXCore50/System.Runtime.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.dll", + "ref/dotnet/System.Runtime.xml", + "ref/dotnet/de/System.Runtime.xml", + "ref/dotnet/es/System.Runtime.xml", + "ref/dotnet/fr/System.Runtime.xml", + "ref/dotnet/it/System.Runtime.xml", + "ref/dotnet/ja/System.Runtime.xml", + "ref/dotnet/ko/System.Runtime.xml", + "ref/dotnet/ru/System.Runtime.xml", + "ref/dotnet/zh-hans/System.Runtime.xml", + "ref/dotnet/zh-hant/System.Runtime.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.dll" + ] + }, + "System.Runtime.Extensions/4.0.10": { + "serviceable": true, + "sha512": "5dsEwf3Iml7d5OZeT20iyOjT+r+okWpN7xI2v+R4cgd3WSj4DeRPTvPFjDpacbVW4skCAZ8B9hxXJYgkCFKJ1A==", + "files": [ + "System.Runtime.Extensions.4.0.10.nupkg", + "System.Runtime.Extensions.4.0.10.nupkg.sha512", + "System.Runtime.Extensions.nuspec", + "lib/DNXCore50/System.Runtime.Extensions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Extensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Extensions.dll", + "ref/dotnet/System.Runtime.Extensions.xml", + "ref/dotnet/de/System.Runtime.Extensions.xml", + "ref/dotnet/es/System.Runtime.Extensions.xml", + "ref/dotnet/fr/System.Runtime.Extensions.xml", + "ref/dotnet/it/System.Runtime.Extensions.xml", + "ref/dotnet/ja/System.Runtime.Extensions.xml", + "ref/dotnet/ko/System.Runtime.Extensions.xml", + "ref/dotnet/ru/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hans/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hant/System.Runtime.Extensions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Extensions.dll" + ] + }, + "System.Runtime.Handles/4.0.0-beta-23019": { + "sha512": "7yUKDrX/q6iXj0daFW7LM3Fe5qY0l9hIcd4OxLzb8vcwHvxTvcTK11jMMPwtwlv3xjTqUG+FxYfonKXENQ4a2Q==", + "files": [ + "System.Runtime.Handles.4.0.0-beta-23019.nupkg", + "System.Runtime.Handles.4.0.0-beta-23019.nupkg.sha512", + "System.Runtime.Handles.nuspec", + "lib/DNXCore50/System.Runtime.Handles.dll", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Handles.dll", + "ref/dotnet/System.Runtime.Handles.dll", + "ref/net46/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Handles.dll" + ] + }, + "System.Runtime.InteropServices/4.0.20-beta-23019": { + "sha512": "KYzLtkN65ySMGpQ/uvHFSdu3hcFmp0Y8Foh16bWCT+xNeHVFIY8A8j5oqUYHbOwJuPNrwoIBOsHisVrD6mRfkA==", + "files": [ + "System.Runtime.InteropServices.4.0.20-beta-23019.nupkg", + "System.Runtime.InteropServices.4.0.20-beta-23019.nupkg.sha512", + "System.Runtime.InteropServices.nuspec", + "lib/DNXCore50/System.Runtime.InteropServices.dll", + "lib/net46/_._", + "lib/netcore50/System.Runtime.InteropServices.dll", + "ref/dotnet/System.Runtime.InteropServices.dll", + "ref/net46/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.InteropServices.dll" + ] + }, + "System.Text.Encoding/4.0.10-beta-23019": { + "sha512": "NKMM7EowhH4JzVRNip0l8RZqMy934A98sLGUpddQslUus5N3Qsbg+mUTpGjd3X0ns2kASjmJFvvh5i8hh9qMMQ==", + "files": [ + "System.Text.Encoding.4.0.10-beta-23019.nupkg", + "System.Text.Encoding.4.0.10-beta-23019.nupkg.sha512", + "System.Text.Encoding.nuspec", + "lib/DNXCore50/System.Text.Encoding.dll", + "lib/net46/_._", + "lib/netcore50/System.Text.Encoding.dll", + "ref/dotnet/System.Text.Encoding.dll", + "ref/net46/_._", + "runtimes/win8-aot/lib/netcore50/System.Text.Encoding.dll" + ] + }, + "System.Text.Encoding.Extensions/4.0.10-beta-23019": { + "sha512": "LBtVrbFvCa0GAAT7z5m/w0dMSynoqPi+11C670me7+1tmW9rnj5O0DGTR9x1GgUgcqf1I+t5lGFyvrHO14++oQ==", + "files": [ + "System.Text.Encoding.Extensions.4.0.10-beta-23019.nupkg", + "System.Text.Encoding.Extensions.4.0.10-beta-23019.nupkg.sha512", + "System.Text.Encoding.Extensions.nuspec", + "lib/DNXCore50/System.Text.Encoding.Extensions.dll", + "lib/net46/_._", + "lib/netcore50/System.Text.Encoding.Extensions.dll", + "ref/dotnet/System.Text.Encoding.Extensions.dll", + "ref/net46/_._", + "runtimes/win8-aot/lib/netcore50/System.Text.Encoding.Extensions.dll" + ] + }, + "System.Threading/4.0.10": { + "serviceable": true, + "sha512": "0w6pRxIEE7wuiOJeKabkDgeIKmqf4ER1VNrs6qFwHnooEE78yHwi/bKkg5Jo8/pzGLm0xQJw0nEmPXt1QBAIUA==", + "files": [ + "System.Threading.4.0.10.nupkg", + "System.Threading.4.0.10.nupkg.sha512", + "System.Threading.nuspec", + "lib/DNXCore50/System.Threading.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.dll", + "ref/dotnet/System.Threading.xml", + "ref/dotnet/de/System.Threading.xml", + "ref/dotnet/es/System.Threading.xml", + "ref/dotnet/fr/System.Threading.xml", + "ref/dotnet/it/System.Threading.xml", + "ref/dotnet/ja/System.Threading.xml", + "ref/dotnet/ko/System.Threading.xml", + "ref/dotnet/ru/System.Threading.xml", + "ref/dotnet/zh-hans/System.Threading.xml", + "ref/dotnet/zh-hant/System.Threading.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.dll" + ] + }, + "System.Threading.Tasks/4.0.10": { + "serviceable": true, + "sha512": "NOwJGDfk79jR0bnzosbXLVD/PdI8KzBeESoa3CofEM5v9R5EBfcI0Jyf18stx+0IYV9okmDIDxVtxq9TbnR9bQ==", + "files": [ + "System.Threading.Tasks.4.0.10.nupkg", + "System.Threading.Tasks.4.0.10.nupkg.sha512", + "System.Threading.Tasks.nuspec", + "lib/DNXCore50/System.Threading.Tasks.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.Tasks.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.Tasks.dll", + "ref/dotnet/System.Threading.Tasks.xml", + "ref/dotnet/de/System.Threading.Tasks.xml", + "ref/dotnet/es/System.Threading.Tasks.xml", + "ref/dotnet/fr/System.Threading.Tasks.xml", + "ref/dotnet/it/System.Threading.Tasks.xml", + "ref/dotnet/ja/System.Threading.Tasks.xml", + "ref/dotnet/ko/System.Threading.Tasks.xml", + "ref/dotnet/ru/System.Threading.Tasks.xml", + "ref/dotnet/zh-hans/System.Threading.Tasks.xml", + "ref/dotnet/zh-hant/System.Threading.Tasks.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.Tasks.dll" + ] + }, + "System.Threading.Tasks.Parallel/4.0.0": { + "serviceable": true, + "sha512": "GXDhjPhF3nE4RtDia0W6JR4UMdmhOyt9ibHmsNV6GLRT4HAGqU636Teo4tqvVQOFp2R6b1ffxPXiRaoqtzGxuA==", + "files": [ + "System.Threading.Tasks.Parallel.4.0.0.nupkg", + "System.Threading.Tasks.Parallel.4.0.0.nupkg.sha512", + "System.Threading.Tasks.Parallel.nuspec", + "lib/dotnet/System.Threading.Tasks.Parallel.dll", + "lib/net45/_._", + "lib/netcore50/System.Threading.Tasks.Parallel.dll", + "lib/win8/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Threading.Tasks.Parallel.dll", + "ref/dotnet/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/de/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/es/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/fr/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/it/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/ja/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/ko/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/ru/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/zh-hans/System.Threading.Tasks.Parallel.xml", + "ref/dotnet/zh-hant/System.Threading.Tasks.Parallel.xml", + "ref/net45/_._", + "ref/netcore50/System.Threading.Tasks.Parallel.dll", + "ref/netcore50/System.Threading.Tasks.Parallel.xml", + "ref/win8/_._", + "ref/wpa81/_._" + ] + }, + "System.Threading.Thread/4.0.0-beta-23019": { + "sha512": "ECx+zZlXCfhkpZ0PUVrzp5UB6zRdzi94LsQhm7DtUS/uB17I3sYh0RsnMu/5jTULByQ1Ju4K/JTbM28InXO/PQ==", + "files": [ + "System.Threading.Thread.4.0.0-beta-23019.nupkg", + "System.Threading.Thread.4.0.0-beta-23019.nupkg.sha512", + "System.Threading.Thread.nuspec", + "lib/DNXCore50/System.Threading.Thread.dll", + "lib/net46/System.Threading.Thread.dll", + "ref/dotnet/System.Threading.Thread.dll", + "ref/net46/System.Threading.Thread.dll" + ] + } + }, + "projectFileDependencyGroups": { + "": [ + "System.Collections >= 4.0.10", + "System.Collections.Concurrent >= 4.0.10", + "System.Console >= 4.0.0-beta-23019", + "System.Linq >= 4.0.0", + "System.Linq.Parallel >= 4.0.0", + "System.Reflection >= 4.0.10", + "System.Runtime >= 4.0.20", + "System.Runtime.Extensions >= 4.0.10", + "System.Threading >= 4.0.10", + "System.Threading.Tasks.Parallel >= 4.0.0", + "System.Threading.Thread >= 4.0.0-beta-23019" + ], + "DNXCore,Version=v5.0": [] + } +} \ No newline at end of file diff --git a/src/System.Composition/scenarios/TestLibrary/Properties/AssemblyInfo.cs b/src/System.Composition/scenarios/TestLibrary/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..613ff1df50a4 --- /dev/null +++ b/src/System.Composition/scenarios/TestLibrary/Properties/AssemblyInfo.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] diff --git a/src/System.Composition/scenarios/TestLibrary/TestClass.cs b/src/System.Composition/scenarios/TestLibrary/TestClass.cs new file mode 100644 index 000000000000..95798dd177f5 --- /dev/null +++ b/src/System.Composition/scenarios/TestLibrary/TestClass.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestLibrary +{ + [Export] + public class ClassWithDependecy + { + public TestDependency _dep; + [ImportingConstructor] + public ClassWithDependecy(TestDependency dep) + { + _dep = dep; + } + } + + [Export] + public class ClassWithDependecyAndSameBaseType + { + public IDependency _dep; + [ImportingConstructor] + public ClassWithDependecyAndSameBaseType(IDependency dep) + { + _dep = dep; + } + } + + + [Export] + [Export(typeof(IDependency))] + public class TestDependency : IDependency + { + public TestDependency() + { + } + } + + public class NotRealDependency : IDependency + { + public NotRealDependency() + { + } + } + + + public interface IDependency + { + } +} diff --git a/src/System.Composition/scenarios/TestLibrary/TestLibrary.csproj b/src/System.Composition/scenarios/TestLibrary/TestLibrary.csproj new file mode 100644 index 000000000000..8a75645db041 --- /dev/null +++ b/src/System.Composition/scenarios/TestLibrary/TestLibrary.csproj @@ -0,0 +1,41 @@ + + + + + + {DA6841A5-0344-4CC7-98B0-89CBEE18DEE3} + Library + Properties + TestLibrary + TestLibrary + v4.5 + Profile259 + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\..\..\oob\ + true + 10.0 + + + + + + + + + + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + + + diff --git a/src/System.Composition/tests/ActivationEventOrderingTests.cs b/src/System.Composition/tests/ActivationEventOrderingTests.cs new file mode 100644 index 000000000000..cb939aec4c41 --- /dev/null +++ b/src/System.Composition/tests/ActivationEventOrderingTests.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Composition.Hosting; +using Xunit; + +namespace System.Composition.UnitTests +{ + [Export] + public class Imported { } + + [Export] + public class TracksImportSatisfaction + { + [Import] + public Imported Imported { get; set; } + + public Imported SetOnImportsSatisfied { get; set; } + + [OnImportsSatisfied] + public void OnImportsSatisfied() + { + SetOnImportsSatisfied = Imported; + } + } + public class ActivationEventOrderingTests : ContainerTests + { + [Fact] + public void OnImportsSatisfiedIsCalledAfterPropertyInjection() + { + var cc = CreateContainer(typeof(TracksImportSatisfaction), typeof(Imported)); + + var tis = cc.GetExport(); + + Assert.NotNull(tis.SetOnImportsSatisfied); + } + } +} diff --git a/src/System.Composition/tests/CardinalityTests.cs b/src/System.Composition/tests/CardinalityTests.cs new file mode 100644 index 000000000000..906cd3127242 --- /dev/null +++ b/src/System.Composition/tests/CardinalityTests.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class CardinalityTests : ContainerTests + { + public interface ILog { } + + [Export(typeof(ILog))] + public class LogA : ILog { } + + [Export(typeof(ILog))] + public class LogB : ILog { } + + [Export] + public class UsesLog + { + [ImportingConstructor] + public UsesLog(ILog log) { } + } + + [Fact] + public void RequestingOneWhereMultipleArePresentFails() + { + var c = CreateContainer(typeof(LogA), typeof(LogB)); + var x = AssertX.Throws(() => + c.GetExport()); + Assert.True(x.Message.Contains("LogA")); + Assert.True(x.Message.Contains("LogB")); + } + + [Fact] + public void ImportingOneWhereMultipleArePresentFails() + { + var c = CreateContainer(typeof(LogA), typeof(LogB), typeof(UsesLog)); + var x = AssertX.Throws(() => + c.GetExport()); + Assert.True(x.Message.Contains("LogA")); + Assert.True(x.Message.Contains("LogB")); + } + } +} diff --git a/src/System.Composition/tests/CircularityTests.cs b/src/System.Composition/tests/CircularityTests.cs new file mode 100644 index 000000000000..43d4627a35f2 --- /dev/null +++ b/src/System.Composition/tests/CircularityTests.cs @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.UnitTests.Util; +using System.Composition.Runtime; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class CircularityTests : ContainerTests + { + public interface IA { } + + [Export, Shared] + public class BLazy + { + public Lazy A; + + [ImportingConstructor] + public BLazy(Lazy ia) + { + A = ia; + } + } + + [Export(typeof(IA))] + public class ACircular : IA + { + public BLazy B; + + [ImportingConstructor] + public ACircular(BLazy b) + { + B = b; + } + } + + [Export, Shared] + public class PropertyPropertyA + { + [Import] + public PropertyPropertyB B { get; set; } + } + + [Export] + public class PropertyPropertyB + { + [Import] + public PropertyPropertyA A { get; set; } + } + + [Export] + public class ConstructorPropertyA + { + [Import] + public ConstructorPropertyB B { get; set; } + } + + [Export, Shared] + public class ConstructorPropertyB + { + [ImportingConstructor] + public ConstructorPropertyB(ConstructorPropertyA a) + { + A = a; + } + + public ConstructorPropertyA A { get; private set; } + } + + public class CircularM + { + public string Name { get; set; } + } + + [Export, ExportMetadata("Name", "A")] + public class MetadataCircularityA + { + [Import] + public Lazy B { get; set; } + } + + [Export, ExportMetadata("Name", "B"), Shared] + public class MetadataCircularityB + { + [Import] + public Lazy A { get; set; } + } + + [Export, Shared] + public class NonPrereqSelfDependency + { + [Import] + public NonPrereqSelfDependency Self { get; set; } + } + + [Export] + public class PrDepA + { + [ImportingConstructor] + public PrDepA(PrDepB b) { } + } + + [Export] + public class PrDepB + { + [ImportingConstructor] + public PrDepB(PrDepA a) { } + } + + [Fact] + public void CanHandleDefinitionCircularity() + { + var cc = CreateContainer(typeof(ACircular), typeof(BLazy)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(ACircular), x.A.Value); + Assert.IsAssignableFrom(typeof(BLazy), ((ACircular)x.A.Value).B); + } + + [Fact] + public void CanHandleDefinitionCircularity2() + { + var cc = CreateContainer(typeof(ACircular), typeof(BLazy)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(BLazy), ((ACircular)((ACircular)x).B.A.Value).B); + } + + [Fact] + public void HandlesPropertyPropertyCircularity() + { + var cc = CreateContainer(typeof(PropertyPropertyA), typeof(PropertyPropertyB)); + var a = cc.GetExport(); + Assert.Same(a.B.A, a); + } + + [Fact] + public void HandlesPropertyPropertyCircularityReversed() + { + var cc = CreateContainer(typeof(PropertyPropertyA), typeof(PropertyPropertyB)); + var b = cc.GetExport(); + Assert.Same(b.A.B, b.A.B.A.B); + } + + [Fact] + public void HandlesConstructorPropertyCircularity() + { + var cc = CreateContainer(typeof(ConstructorPropertyA), typeof(ConstructorPropertyB)); + var a = cc.GetExport(); + Assert.Same(a.B.A.B.A, a.B.A); + } + + [Fact] + public void HandlesConstructorPropertyCircularityReversed() + { + var cc = CreateContainer(typeof(ConstructorPropertyA), typeof(ConstructorPropertyB)); + var b = cc.GetExport(); + Assert.Same(b, b.A.B); + } + + [Fact] + public void HandlesMetadataCircularity() + { + var cc = CreateContainer(typeof(MetadataCircularityA), typeof(MetadataCircularityB)); + var a = cc.GetExport(); + + Assert.Equal(a.B.Metadata.Name, "B"); + Assert.Equal(a.B.Value.A.Metadata.Name, "A"); + } + + [Fact] + public void SharedPartCanHaveNonPrereqDependencyOnSelf() + { + var cc = CreateContainer(typeof(NonPrereqSelfDependency)); + var npsd = cc.GetExport(); + Assert.Same(npsd, npsd.Self); + } + + [Fact] + public void PrerequisiteCircularitiesAreDetected() + { + var cc = CreateContainer(typeof(PrDepA), typeof(PrDepB)); + + var x = AssertX.Throws(() => + { + cc.GetExport(); + }); + } + } +} diff --git a/src/System.Composition/tests/CompositionContextExtensionsTests.cs b/src/System.Composition/tests/CompositionContextExtensionsTests.cs new file mode 100644 index 000000000000..c5bab6aae663 --- /dev/null +++ b/src/System.Composition/tests/CompositionContextExtensionsTests.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class CompositionContextExtensionsTests : ContainerTests + { + public interface IUnregistered { } + + [Fact] + public void GettingAnOptionalExportThatDoesntExistReturnsNull() + { + var c = CreateContainer(); + + IUnregistered unregistered; + Assert.False(c.TryGetExport(null, out unregistered)); + Assert.Null(unregistered); + } + } +} diff --git a/src/System.Composition/tests/ConcurrencyTests.cs b/src/System.Composition/tests/ConcurrencyTests.cs new file mode 100644 index 000000000000..c121c992257f --- /dev/null +++ b/src/System.Composition/tests/ConcurrencyTests.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ConcurrencyTests : ContainerTests + { + [Export, Shared] + public class PausesDuringActivation + { + public bool IsActivationComplete { get; set; } + + [OnImportsSatisfied] + public void OnImportsSatisfied() + { + Task.Delay(200).Wait(); + IsActivationComplete = true; + } + } + + // This does not test the desired behaviour deterministically, + // but is close enough to be repeatable at least on my machine :) + [Fact] + public void SharedInstancesAreNotVisibleUntilActivationCompletes() + { + var c = CreateContainer(typeof(PausesDuringActivation)); + Task.Run(() => c.GetExport()); + Task.Delay(50).Wait(); + var pda = c.GetExport(); + Assert.True(pda.IsActivationComplete); + } + } +} diff --git a/src/System.Composition/tests/ContainerTests.cs b/src/System.Composition/tests/ContainerTests.cs new file mode 100644 index 000000000000..d8387e522038 --- /dev/null +++ b/src/System.Composition/tests/ContainerTests.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Text; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Providers; +using System.Composition.Convention; +using System.Reflection; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ContainerTests + { + protected static CompositionContext CreateContainer(params Type[] types) + { + return new ContainerConfiguration() + .WithParts(types) + .CreateContainer(); + } + + protected static CompositionContext CreateContainer(ConventionBuilder rb, params Type[] types) + { + return new ContainerConfiguration() + .WithParts(types) + .WithDefaultConventions(rb) + .CreateContainer(); + } + } +} diff --git a/src/System.Composition/tests/ContractTests.cs b/src/System.Composition/tests/ContractTests.cs new file mode 100644 index 000000000000..ff879ae8c8d7 --- /dev/null +++ b/src/System.Composition/tests/ContractTests.cs @@ -0,0 +1,93 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ContractTests + { + private class AType { } + + private static readonly Type s_defaultContractType = typeof(AType); + + [Fact] + public void FormattingAContractWithNoDiscriminatorShowsTheSimpleTypeName() + { + var c = new CompositionContract(typeof(AType)); + var s = c.ToString(); + Assert.Equal("AType", s); + } + + [Fact] + public void FormattingAContractWithAStringDiscriminatorShowsTheDiscriminatorInQuotes() + { + var c = new CompositionContract(typeof(AType), "at"); + var s = c.ToString(); + Assert.Equal("AType \"at\"", s); + } + + [Fact] + public void ChangingTheTypeOfAContractPreservesTheContractName() + { + var name = "a"; + var c = new CompositionContract(typeof(object), name); + var d = c.ChangeType(typeof(AType)); + Assert.Equal(name, d.ContractName); + } + + [Fact] + public void ChangingTheTypeOfAContractChangesTheContractType() + { + var c = new CompositionContract(typeof(object)); + var d = c.ChangeType(typeof(AType)); + Assert.Equal(typeof(AType), d.ContractType); + } + + [Fact] + public void ConstraintsWithEquivalentKeysAndValuesAreEqual() + { + var mcd1 = new CompositionContract(s_defaultContractType, null, new Dictionary { { "A", new[] { "B" } } }); + var mcd2 = new CompositionContract(s_defaultContractType, null, new Dictionary { { "A", new[] { "B" } } }); + Assert.True(mcd1.Equals(mcd2)); + } + + [Fact] + public void ConstraintsWithEquivalentKeysAndValuesHaveTheSameHashCode() + { + var mcd1 = new CompositionContract(s_defaultContractType, null, new Dictionary { { "A", new[] { "B" } } }); + var mcd2 = new CompositionContract(s_defaultContractType, null, new Dictionary { { "A", new[] { "B" } } }); + Assert.Equal(mcd1.GetHashCode(), mcd2.GetHashCode()); + } + + [Fact] + public void FormattingTheContractPrintsConstraintKeysAndValues() + { + var mcd = new CompositionContract(typeof(AType), null, new Dictionary { { "A", 1 }, { "B", "C" } }); + var s = mcd.ToString(); + Assert.Equal("AType { A = 1, B = \"C\" }", s); + } + + [Fact] + public void FormattingTheContractPrintsNameAndDiscriminator() + { + var mcd = new CompositionContract(typeof(AType), "inner", new Dictionary { { "A", 1 } }); + var s = mcd.ToString(); + Assert.Equal("AType \"inner\" { A = 1 }", s); + } + + [Fact] + public void AContractWithConstraintIsNotEqualToAContractWithoutConstraint() + { + var first = new CompositionContract(typeof(string), null, new Dictionary { { "A", 1 } }); + var second = new CompositionContract(typeof(string)); + Assert.False(first.Equals(second)); + } + } +} diff --git a/src/System.Composition/tests/CustomerReportedMetadataBug.cs b/src/System.Composition/tests/CustomerReportedMetadataBug.cs new file mode 100644 index 000000000000..ca9af1c1e9de --- /dev/null +++ b/src/System.Composition/tests/CustomerReportedMetadataBug.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.Lightweight.UnitTests +{ + public class CustomerReportedMetadataBug + { + public class ServiceMetadata + { + public string Name { get; set; } + } + + public interface IService + { + } + + [Export(typeof(IService)), ExportMetadata("Name", "1")] + public class SampleService1 : IService + { + public SampleService1() + { + } + } + + public class LooseImporter + { + [ImportMany] + public IList> Services { get; set; } + } + + [Fact] + public void SampleServicesCorrectlyImported() + { + var container = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var importer = new LooseImporter(); + container.SatisfyImports(importer); + + Assert.Equal(1, importer.Services.Count); + } + } +} diff --git a/src/System.Composition/tests/DictionaryImportTests.cs b/src/System.Composition/tests/DictionaryImportTests.cs new file mode 100644 index 000000000000..ae88a0ef8d2e --- /dev/null +++ b/src/System.Composition/tests/DictionaryImportTests.cs @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Composition; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Convention; +using System.Composition.UnitTests.Util; +using System.Composition.Runtime; +using Microsoft.Composition.Demos.ExtendedCollectionImports; +using Microsoft.Composition.Demos.ExtendedCollectionImports.Dictionaries; +using Xunit; + +namespace System.Composition.UnitTests +{ + public interface IValued { } + + [Export(typeof(IValued)), ExportMetadata("Value", "A")] + public class ValueA : IValued { } + + [Export(typeof(IValued)), ExportMetadata("Value", "B")] + public class ValueB : IValued { } + + [Export(typeof(IValued))] + public class ValueMissing : IValued { } + + [Export(typeof(IValued)), ExportMetadata("Value", 1)] + public class NonStringValue : IValued { } + + [Export] + public class Consumer + { + [Import, KeyByMetadata("Value")] + public IDictionary Values { get; set; } + } + + [Export] + public class LazyConsumer + { + [Import, KeyByMetadata("Value")] + public IDictionary> Values { get; set; } + } + + public class ConventionConsumer + { + public IDictionary Values; + + public ConventionConsumer( + [KeyByMetadata("Value")] IDictionary values) + { + Values = values; + } + } + public class DictionaryImportTests + { + private CompositionContext CreateContainer(params Type[] types) + { + var configuration = new ContainerConfiguration() + .WithParts(types) + .WithProvider(new DictionaryExportDescriptorProvider()); + + return configuration.CreateContainer(); + } + + [Fact] + public void DictionaryImportsKeyedByMetadata() + { + var container = CreateContainer(new[] { typeof(ValueA), typeof(ValueB), typeof(Consumer) }); + + var consumer = container.GetExport(); + + Assert.IsAssignableFrom(typeof(ValueA), consumer.Values["A"]); + Assert.IsAssignableFrom(typeof(ValueB), consumer.Values["B"]); + Assert.Equal(2, consumer.Values.Count()); + } + + [Fact] + public void DictionaryImportsRecieveMetadataFromNestedAdapters() + { + var container = CreateContainer(new[] { typeof(ValueA), typeof(ValueB), typeof(LazyConsumer) }); + + var consumer = container.GetExport(); + + var a = (Lazy)consumer.Values["A"]; + Assert.False(a.IsValueCreated); + } + + [Fact] + public void WhenAMetadataKeyIsDuplicatedAnInformativeExceptionIsThrown() + { + var container = CreateContainer(typeof(ValueA), typeof(ValueA), typeof(Consumer)); + var x = AssertX.Throws(() => container.GetExport()); + Assert.Equal("The metadata 'Value' cannot be used as a dictionary import key because the value 'A' is associated with exports from parts 'ValueA' and 'ValueA'.", x.Message); + } + + [Fact] + public void WhenAMetadataKeyIsMissingAnInformativeExceptionIsThrown() + { + var container = CreateContainer(typeof(ValueA), typeof(ValueMissing), typeof(Consumer)); + var x = AssertX.Throws(() => container.GetExport()); + Assert.Equal("The metadata 'Value' cannot be used as a dictionary import key because it is missing from exports on part(s) 'ValueMissing'.", x.Message); + } + + [Fact] + public void WhenAMetadataValueIsOfTheWrongTypeAnInformativeExceptionIsThrown() + { + var container = CreateContainer(typeof(ValueA), typeof(NonStringValue), typeof(Consumer)); + var x = AssertX.Throws(() => container.GetExport()); + Assert.Equal("The metadata 'Value' cannot be used as a dictionary import key of type 'String' because the value(s) supplied by 'NonStringValue' are of the wrong type.", x.Message); + } + + [Fact] + public void DictionaryImportsCompatibleWithConventionBuilder() + { + var rb = new ConventionBuilder(); + rb.ForType().Export(); + var container = new ContainerConfiguration() + .WithPart(rb) + .WithParts(typeof(ValueA), typeof(ValueB)) + .WithProvider(new DictionaryExportDescriptorProvider()) + .CreateContainer(); + + var consumer = container.GetExport(); + + Assert.Equal(2, consumer.Values.Count()); + } + } +} diff --git a/src/System.Composition/tests/DiscoveryTests.cs b/src/System.Composition/tests/DiscoveryTests.cs new file mode 100644 index 000000000000..44224e45a651 --- /dev/null +++ b/src/System.Composition/tests/DiscoveryTests.cs @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Composition.Convention; +using System.Composition.Runtime; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Composition.Hosting; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class DiscoveryTests : ContainerTests + { + public interface IRule { } + + public class RuleExportAttribute : ExportAttribute + { + public RuleExportAttribute() : base(typeof(IRule)) { } + } + + [RuleExport] + public class UnfairRule : IRule { } + + [Export(typeof(IRule))] + public class IncompatibleRule { } + + public class IncompatibleRuleProperty + { + [Export(typeof(IRule))] + public string Rule { get; set; } + } + + [Export, PartNotDiscoverable] + public class NotDiscoverable { } + + [Fact] + public void DiscoversCustomExportAttributes() + { + var container = CreateContainer(typeof(UnfairRule)); + var rule = container.GetExport(); + Assert.IsAssignableFrom(typeof(UnfairRule), rule); + } + + [Fact] + public void DiscoversCustomExportAttributesUnderConventions() + { + var container = CreateContainer(new ConventionBuilder(), typeof(UnfairRule)); + var rule = container.GetExport(); + Assert.IsAssignableFrom(typeof(UnfairRule), rule); + } + + [Fact] + public void InstanceExportsOfIncompatibleContractsAreDetected() + { + var x = AssertX.Throws(() => CreateContainer(typeof(IncompatibleRule))); + Assert.Equal("Exported contract type 'IRule' is not assignable from part 'IncompatibleRule'.", x.Message); + } + + [Fact] + public void PropertyExportsOfIncompatibleContractsAreDetected() + { + var x = AssertX.Throws(() => CreateContainer(typeof(IncompatibleRuleProperty))); + Assert.Equal("Exported contract type 'IRule' is not assignable from property 'Rule' of part 'IncompatibleRuleProperty'.", x.Message); + } + + [Fact] + public void ANonDiscoverablePartIsIgnored() + { + var container = CreateContainer(typeof(NotDiscoverable)); + NotDiscoverable unused; + Assert.False(container.TryGetExport(null, out unused)); + } + + public interface IBus { } + + [Export(typeof(IBus))] + public class CloudBus : IBus { } + + public class SpecialCloudBus : CloudBus { } + + [Fact] + public void DoesNotDiscoverExportAttributesFromBase() + { + var container = CreateContainer(typeof(SpecialCloudBus)); + + IBus bus; + Assert.False(container.TryGetExport(null, out bus)); + } + + public abstract class BaseController + { + [Import] + public IBus Bus { get; set; } + } + + [Export] + public class HomeController : BaseController + { + } + + [Fact] + public void SatisfiesImportsAppliedToBase() + { + var container = CreateContainer(typeof(HomeController), typeof(CloudBus)); + var hc = container.GetExport(); + Assert.IsAssignableFrom(typeof(CloudBus), hc.Bus); + } + + private class CustomImportAttribute : ImportAttribute { } + + [Export] + public class MultipleImportsOnProperty + { + [Import, CustomImport] + public string MultiImport { get; set; } + } + + [Fact] + public void MultipleImportAttributesAreDetected() + { + var c = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var x = AssertX.Throws(() => c.GetExport()); + Assert.Equal("Multiple imports have been configured for 'MultiImport'. At most one import can be applied to a single site.", x.Message); + } + } +} diff --git a/src/System.Composition/tests/ErrorMessageQualityTests.cs b/src/System.Composition/tests/ErrorMessageQualityTests.cs new file mode 100644 index 000000000000..7dd8beea2782 --- /dev/null +++ b/src/System.Composition/tests/ErrorMessageQualityTests.cs @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ErrorMessageQualityTests : ContainerTests + { + public class Unregistered { } + + [Export] + public class UserOfUnregistered + { + [Import] + public Unregistered Unregistered { get; set; } + } + + [Export] + public class CycleA + { + [Import] + public CycleB B { get; set; } + } + + [Export] + public class CycleB + { + [Import] + public CycleC C { get; set; } + } + + [Export] + public class CycleC + { + [Import] + public CycleA A { get; set; } + } + + [Export] + public class ShouldBeOne { } + + public class ButThereIsAnother + { + [Export(typeof(ShouldBeOne))] + public ShouldBeOne Another { get { return new ShouldBeOne(); } } + } + + [Export] + public class RequiresOnlyOne + { + [Import] + public ShouldBeOne One { get; set; } + } + + [Fact] + public void MissingTopLevelExportMessageIsInformative() + { + var cc = CreateContainer(); + var x = AssertX.Throws(() => cc.GetExport()); + Assert.Equal("No export was found for the contract 'Unregistered'.", x.Message); + } + + [Fact] + public void MissingTopLevelNamedExportMessageIsInformative() + { + var cc = CreateContainer(); + var x = AssertX.Throws(() => cc.GetExport("unregistered")); + Assert.Equal("No export was found for the contract 'Unregistered \"unregistered\"'.", x.Message); + } + + [Fact] + public void MissingDependencyMessageIsInformative() + { + var cc = CreateContainer(typeof(UserOfUnregistered)); + var x = AssertX.Throws(() => cc.GetExport()); + Assert.Equal("No export was found for the contract 'Unregistered'" + Environment.NewLine + + " -> required by import 'Unregistered' of part 'UserOfUnregistered'" + Environment.NewLine + + " -> required by initial request for contract 'UserOfUnregistered'", x.Message); + } + + [Fact] + public void CycleMessageIsInformative() + { + var cc = CreateContainer(typeof(CycleA), typeof(CycleB), typeof(CycleC)); + var x = AssertX.Throws(() => cc.GetExport()); + Assert.Equal("Detected an unsupported cycle for part 'CycleA'." + + " To construct a valid cycle, at least one part in the cycle must be shared, and at least one import in the cycle must be non-prerequisite (e.g. a property)." + Environment.NewLine + + " -> required by import 'A' of part 'CycleC'" + Environment.NewLine + + " -> required by import 'C' of part 'CycleB'" + Environment.NewLine + + " -> required by import 'B' of part 'CycleA'" + Environment.NewLine + + " -> required by initial request for contract 'CycleA'", x.Message); + } + + [Fact] + public void CardinalityViolationMessageIsInformative() + { + var cc = CreateContainer(typeof(ShouldBeOne), typeof(ButThereIsAnother), typeof(RequiresOnlyOne)); + var x = AssertX.Throws(() => cc.GetExport()); + Assert.Equal("Only one export for the contract 'ShouldBeOne' is allowed, but the following parts: 'ButThereIsAnother', 'ShouldBeOne' export it." + Environment.NewLine + + " -> required by import 'One' of part 'RequiresOnlyOne'" + Environment.NewLine + + " -> required by initial request for contract 'RequiresOnlyOne'", x.Message); + } + } +} diff --git a/src/System.Composition/tests/ExportDescriptorProviderTests.cs b/src/System.Composition/tests/ExportDescriptorProviderTests.cs new file mode 100644 index 000000000000..d1b0ab344b43 --- /dev/null +++ b/src/System.Composition/tests/ExportDescriptorProviderTests.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.Lightweight.UnitTests +{ + public class ExportDescriptorProviderTests + { + public class DefaultObjectExportDescriptorProvider : ExportDescriptorProvider + { + private readonly CompositionContract _supportedContract = new CompositionContract(typeof(object)); + + public static readonly object DefaultObject = "Hello, World!"; + + public override IEnumerable GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor) + { + if (!contract.Equals(_supportedContract)) + return NoExportDescriptors; + + var implementations = descriptorAccessor.ResolveDependencies("test for existing", contract, false); + if (implementations.Any()) + return NoExportDescriptors; + + return new[] { new ExportDescriptorPromise(contract, "test metadataProvider", false, NoDependencies, _ => ExportDescriptor.Create((c, o) => DefaultObject, NoMetadata)) }; + } + } + + public class ExportsObject + { + [Export] + public object AnObject { get { return "Not the default"; } } + } + + [Fact] + public void ProvidersCanLocateImplementationsOfAContractItSupports() + { + var container = new ContainerConfiguration() + .WithProvider(new DefaultObjectExportDescriptorProvider()) + .WithPart() + .CreateContainer(); + + var o = container.GetExport(); + Assert.NotEqual(DefaultObjectExportDescriptorProvider.DefaultObject, o); + } + + [Fact] + public void ProvidersCanDetectAbsenceOfAContractItSupports() + { + var container = new ContainerConfiguration() + .WithProvider(new DefaultObjectExportDescriptorProvider()) + .CreateContainer(); + + var o = container.GetExport(); + Assert.Equal(DefaultObjectExportDescriptorProvider.DefaultObject, o); + } + } +} diff --git a/src/System.Composition/tests/ExportFactoryTests.cs b/src/System.Composition/tests/ExportFactoryTests.cs new file mode 100644 index 000000000000..a03998e0c86c --- /dev/null +++ b/src/System.Composition/tests/ExportFactoryTests.cs @@ -0,0 +1,239 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ExportFactoryTests : ContainerTests + { + private static class Boundaries + { + public const string DataConsistency = "DataConsistency"; + public const string UserIdentity = "UserIdentity"; + } + + [Shared, Export] + public class SharedUnbounded { } + + [Shared(Boundaries.DataConsistency), Export] + public class SharedBoundedByDC { } + + [Export] + public class DataConsistencyBoundaryProvider + { + [Import, SharingBoundary(Boundaries.DataConsistency)] + public ExportFactory SharingScopeFactory { get; set; } + } + + [Export] + public class SharedPartConsumer + { + public SharedBoundedByDC Sc1, Sc2; + + [ImportingConstructor] + public SharedPartConsumer(SharedBoundedByDC sc1, SharedBoundedByDC sc2) + { + Sc1 = sc1; + Sc2 = sc2; + } + } + + public interface IA { } + + [Export(typeof(IA))] + public class A : IA, IDisposable + { + public bool IsDisposed; + + public void Dispose() + { + IsDisposed = true; + } + } + + [Shared, Export] + public class GloballySharedWithDependency + { + public IA A; + + [ImportingConstructor] + public GloballySharedWithDependency(IA a) + { + A = a; + } + } + + [Export] + public class UseExportFactory + { + [Import] + public ExportFactory AFactory { get; set; } + } + + [Export] + public class DisposesFactoryProduct : IDisposable + { + private readonly ExportFactory _factory; + + [ImportingConstructor] + public DisposesFactoryProduct(ExportFactory factory) + { + _factory = factory; + } + + public Export Product { get; set; } + + public void CreateProduct() + { + Product = _factory.CreateExport(); + } + + public void Dispose() + { + Product.Dispose(); + } + } + + [Fact] + public void SharedPartsAreSharedBetweenAllScopes() + { + var cc = CreateContainer(typeof(SharedUnbounded), typeof(DataConsistencyBoundaryProvider)); + var bp = cc.GetExport().SharingScopeFactory; + var x = bp.CreateExport().Value.GetExport(); + var y = bp.CreateExport().Value.GetExport(); + Assert.Same(x, y); + } + + [Fact] + public void TheSameSharedInstanceIsReusedWithinItsSharingBoundary() + { + var cc = CreateContainer(typeof(SharedBoundedByDC), typeof(SharedPartConsumer), typeof(DataConsistencyBoundaryProvider)); + var sf = cc.GetExport().SharingScopeFactory; + var s = sf.CreateExport(); + var s2 = sf.CreateExport(); + var x = s.Value.GetExport(); + var y = s2.Value.GetExport(); + Assert.Same(x.Sc1, x.Sc2); + Assert.NotSame(x.Sc1, y.Sc1); + } + + [Fact] + public void NonSharedInstancesCreatedByAnExportFactoryAreControlledByTheirExportLifetimeContext() + { + var cc = CreateContainer(typeof(A), typeof(UseExportFactory)); + var bef = cc.GetExport(); + var a = bef.AFactory.CreateExport(); + Assert.IsAssignableFrom(typeof(A), a.Value); + Assert.False(((A)a.Value).IsDisposed); + a.Dispose(); + Assert.True(((A)a.Value).IsDisposed); + } + + [Fact] + public void DependenciesOfSharedPartsAreResolvedInTheGlobalScope() + { + var cc = new ContainerConfiguration() + .WithParts(typeof(GloballySharedWithDependency), typeof(A), typeof(DataConsistencyBoundaryProvider)) + .CreateContainer(); + var s = cc.GetExport().SharingScopeFactory.CreateExport(); + var g = s.Value.GetExport(); + s.Dispose(); + var a = (A)g.A; + Assert.False(a.IsDisposed); + cc.Dispose(); + Assert.True(a.IsDisposed); + } + + [Fact] + public void WhenABoundaryIsPresentBoundedPartsCannotBeCreatedOutsideIt() + { + var container = CreateContainer(typeof(DataConsistencyBoundaryProvider), typeof(SharedBoundedByDC)); + var x = AssertX.Throws(() => container.GetExport()); + } + + [Fact] + public void TheProductOfAnExportFactoryCanBeDisposedDuringDisposalOfTheParent() + { + var container = new ContainerConfiguration() + .WithPart() + .WithPart() + .CreateContainer(); + + var dfp = container.GetExport(); + dfp.CreateProduct(); + + var a = dfp.Product.Value as A; + + container.Dispose(); + + Assert.True(a.IsDisposed); + } + + [Export("Special", typeof(IA))] + public class A1 : IA { } + + [Export("Special", typeof(IA))] + public class A2 : IA { } + + [Export] + public class AConsumer + { + [ImportMany("Special")] + public ExportFactory[] AFactories { get; set; } + } + + [Fact] + public void ExportFactoryCanBeComposedWithImportManyAndNames() + { + var cc = CreateContainer(typeof(AConsumer), typeof(A1), typeof(A2)); + var cons = cc.GetExport(); + Assert.Equal(2, cons.AFactories.Length); + } + + [Export] + public class Disposable : IDisposable + { + public bool IsDisposed { get; set; } + + public void Dispose() + { + IsDisposed = true; + } + } + + [Export] + public class HasDisposableDependency + { + [Import] + public Disposable Dependency { get; set; } + } + + [Export] + public class HasFactory + { + [Import] + public ExportFactory Factory { get; set; } + } + + [Fact] + public void WhenReleasingAnExportFromAnExportFactoryItsNonSharedDependenciesAreDisposed() + { + var cc = CreateContainer(typeof(Disposable), typeof(HasDisposableDependency), typeof(HasFactory)); + var hf = cc.GetExport(); + var hddx = hf.Factory.CreateExport(); + var hdd = hddx.Value; + hddx.Dispose(); + Assert.True(hdd.Dependency.IsDisposed); + } + } +} diff --git a/src/System.Composition/tests/ExportMetadataDiscoveryTests.cs b/src/System.Composition/tests/ExportMetadataDiscoveryTests.cs new file mode 100644 index 000000000000..733060866934 --- /dev/null +++ b/src/System.Composition/tests/ExportMetadataDiscoveryTests.cs @@ -0,0 +1,123 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ExportMetadataDiscoveryTests : ContainerTests + { + [MetadataAttribute] + public class ExportWithNameFooAttribute : ExportAttribute + { + public string Name { get { return "Foo"; } } + } + + [MetadataAttribute] + public class NameFooAttribute : Attribute + { + public string Name { get { return "Foo"; } } + } + + [ExportWithNameFoo] + public class SingleNamedExport { } + + [Export, NameFoo] + public class NamedWithCustomMetadata { } + + [ExportWithNameFoo, ExportMetadata("Priority", 10)] + public class NamedAndPrioritized { } + + [ExportWithNameFoo, Export, ExportMetadata("Priority", 10)] + public class MultipleExportsOneNamedAndBothPrioritized { } + + public class Named {[DefaultValue(null)] public string Name { get; set; } } + + public class MultiValuedName { public string[] Name { get; set; } } + + public class Prioritized {[DefaultValue(0)] public int Priority { get; set; } } + + [Export, + ExportMetadata("Name", "A"), + ExportMetadata("Name", "B"), + ExportMetadata("Name", "B")] + public class MultipleNames { } + + [Fact] + public void DiscoversMetadataSpecifiedUsingMetadataAttributeOnExportAttribute() + { + var cc = CreateContainer(typeof(SingleNamedExport)); + var ne = cc.GetExport>(); + Assert.Equal("Foo", ne.Metadata.Name); + } + + [Fact] + public void IfMetadataIsSpecifiedOnAnExportAttributeOtherExportsDoNotHaveIt() + { + var cc = CreateContainer(typeof(MultipleExportsOneNamedAndBothPrioritized)); + var ne = cc.GetExports>(); + Assert.Equal(2, ne.Count()); + Assert.True(ne.Where(e => e.Metadata.Name != null).Count() == 1); + } + + [Fact] + public void DiscoversStandaloneExportMetadata() + { + var cc = CreateContainer(typeof(NamedAndPrioritized)); + var ne = cc.GetExport>(); + Assert.Equal(10, ne.Metadata.Priority); + } + + [Fact] + public void DiscoversStandaloneExportMetadataUsingMetadataAttributes() + { + var cc = CreateContainer(typeof(NamedWithCustomMetadata)); + var ne = cc.GetExport>(); + Assert.Equal("Foo", ne.Metadata.Name); + } + + [Fact] + public void StandaloneExportMetadataAppliesToAllExportsOnAMember() + { + var cc = CreateContainer(typeof(MultipleExportsOneNamedAndBothPrioritized)); + var ne = cc.GetExports>(); + Assert.Equal(2, ne.Count()); + Assert.True(ne.All(e => e.Metadata.Priority == 10)); + } + + [Fact] + public void MultiplePiecesOfMetadataAreCombinedIntoAnArray() + { + var cc = CreateContainer(typeof(MultipleNames)); + + var withNames = cc.GetExport>(); + + AssertX.Equivalent(new[] { "A", "B", "B" }, withNames.Metadata.Name); + } + + [Export] + public class ConstructorImported { } + + [Export("A"), Export("B")] + public class MultipleExportsNonDefaultConstructor + { + [ImportingConstructor] + public MultipleExportsNonDefaultConstructor(ConstructorImported c) { } + } + + [Fact] + public void MultipleExportsCanBeRetrievedWhenANonDefaultConstructorExists() + { + var c = CreateContainer(typeof(ConstructorImported), typeof(MultipleExportsNonDefaultConstructor)); + c.GetExport("A"); + c.GetExport("B"); + } + } +} diff --git a/src/System.Composition/tests/ImportManyTests.cs b/src/System.Composition/tests/ImportManyTests.cs new file mode 100644 index 000000000000..a101f257f882 --- /dev/null +++ b/src/System.Composition/tests/ImportManyTests.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ImportManyTests : ContainerTests + { + public interface IA { } + + [Export(typeof(IA))] + public class A : IA { } + + [Export(typeof(IA))] + public class A2 : IA { } + + [Export] + public class ImportManyIA + { + public IEnumerable Items; + + [ImportingConstructor] + public ImportManyIA([ImportMany] IEnumerable items) + { + Items = items; + } + } + [Export] + public class ImportManyPropsOfA + { + [ImportMany] + public IEnumerable AllA { get; set; } + public ImportManyPropsOfA() + { + } + } + [Fact] + public void ImportsMany() + { + var cc = CreateContainer(typeof(A), typeof(A2), typeof(ImportManyIA)); + var im = cc.GetExport(); + Assert.Equal(2, im.Items.Count()); + } + + [Fact] + public void ImportsManyProperties() + { + var cc = CreateContainer(typeof(A), typeof(A2), typeof(ImportManyPropsOfA)); + var im = cc.GetExport(); + Assert.Equal(2, im.AllA.Count()); + } + } +} diff --git a/src/System.Composition/tests/ImportOrderingTests.cs b/src/System.Composition/tests/ImportOrderingTests.cs new file mode 100644 index 000000000000..5fa7f62e293c --- /dev/null +++ b/src/System.Composition/tests/ImportOrderingTests.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Composition.Demos.ExtendedCollectionImports; +using Microsoft.Composition.Demos.ExtendedCollectionImports.OrderedCollections; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ImportOrderingTests + { + public interface IItem + { + } + + [Shared, Export(typeof(IItem)), ExportMetadata("Order", 1)] + public class Item1 : IItem { } + + [Shared, Export(typeof(IItem)), ExportMetadata("Order", 4)] + public class Item4 : IItem { } + + [Shared, Export(typeof(IItem)), ExportMetadata("Order", 2)] + public class Item2 : IItem { } + + [Shared, Export(typeof(IItem)), ExportMetadata("Order", 3)] + public class Item3 : IItem { } + + [Export(typeof(IItem))] + public class ItemWithoutOrder : IItem { } + + [Export] + public class HasImportedItems + { + [OrderedImportMany("Order")] + public IItem[] OrderedItems { get; set; } + + [ImportMany] + public IItem[] UnorderedItems { get; set; } + } + + [Fact] + public void CollectionsImportedWithAnOrderingAttributeComeInOrder() + { + var container = CreateExtendedContainer(typeof(HasImportedItems), typeof(Item1), typeof(Item4), typeof(Item2), typeof(Item3)); + + var hasImportedItems = container.GetExport(); + + var ordered = hasImportedItems.UnorderedItems.OrderBy(i => i.GetType().Name).ToArray(); + + Assert.Equal(ordered, hasImportedItems.OrderedItems); + Assert.NotEqual(ordered, hasImportedItems.UnorderedItems); + } + + [Fact] + public void IfAnItemIsMissingMetadataAnInformativeExceptionIsThrown() + { + var container = CreateExtendedContainer(typeof(HasImportedItems), typeof(Item1), typeof(ItemWithoutOrder)); + var x = AssertX.Throws(() => container.GetExport()); + Assert.Equal("The metadata 'Order' cannot be used for ordering because it is missing from exports on part(s) 'ItemWithoutOrder'.", x.Message); + } + + private CompositionContext CreateExtendedContainer(params Type[] partTypes) + { + return new ContainerConfiguration() + .WithParts(partTypes) + .WithProvider(new OrderedImportManyExportDescriptorProvider()) + .CreateContainer(); + } + } +} diff --git a/src/System.Composition/tests/InheritanceTests.cs b/src/System.Composition/tests/InheritanceTests.cs new file mode 100644 index 000000000000..107ff9e41f97 --- /dev/null +++ b/src/System.Composition/tests/InheritanceTests.cs @@ -0,0 +1,214 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.UnitTests; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.Lightweight.UnitTests +{ + public class InheritanceTests : ContainerTests + { + [Export] + public class Base + { + public Base() { Property = "foo"; } + + [Export] + public string Property { get; set; } + } + + public class Derived : Base { } + + [Fact] + public void ClassExportsAreNotInherited() + { + var cc = CreateContainer(typeof(Derived)); + Base export; + Assert.False(cc.TryGetExport(out export)); + } + + [Fact] + public void PropertyExportsAreNotInherited() + { + var cc = CreateContainer(typeof(Derived)); + string export; + Assert.False(cc.TryGetExport(out export)); + } + + [Export] + public class ExportingDerived : Base { } + + [Fact] + public void ExportsAtTheClassLevelAreAppliedIgnoringBaseExports() + { + var cc = CreateContainer(typeof(ExportingDerived)); + Base baseExport; + Assert.False(cc.TryGetExport(out baseExport)); + ExportingDerived derivedExport; + Assert.True(cc.TryGetExport(out derivedExport)); + } + + public class Exporter + { + public Exporter() + { + A = "a"; B = "b"; + } + + [Export("a")] + public string A { get; set; } + + [Export("b")] + public string B { get; set; } + } + + public class BaseImporter + { + [Import("a")] + public virtual string Imported { get; set; } + } + + [Export] + public class OverridingImporter : BaseImporter + { + [Import("b")] + public override string Imported { get; set; } + } + + [Export] + public class NonOverridingImporter : BaseImporter { } + + [Fact] + public void ImportsOnOverriddenPropertiesOverrideImportsOnTheBase() + { + var c = CreateContainer(typeof(Exporter), typeof(OverridingImporter), typeof(NonOverridingImporter)); + var bi = c.GetExport(); + var di = c.GetExport(); + Assert.Equal("a", bi.Imported); + Assert.Equal("b", di.Imported); + } + + [Fact] + public void LooseImportsOnDerivedPropertiesOverrideImportsOnTheBase() + { + var c = CreateContainer(typeof(Exporter)); + var bi = new BaseImporter(); + c.SatisfyImports(bi); + var di = new OverridingImporter(); + c.SatisfyImports(di); + Assert.Equal("a", bi.Imported); + Assert.Equal("b", di.Imported); + } + + [Fact] + public void ImportsOnBaseAreInherited() + { + var c = CreateContainer(typeof(Exporter), typeof(NonOverridingImporter)); + var di = c.GetExport(); + c.SatisfyImports(di); + Assert.Equal("a", di.Imported); + } + + [Fact] + public void LooseImportsOnBaseAreInherited() + { + var c = CreateContainer(typeof(Exporter)); + var di = new NonOverridingImporter(); + c.SatisfyImports(di); + Assert.Equal("a", di.Imported); + } + + [Export, PartNotDiscoverable] + public class NotDiscoverableBase { } + + [Export] + public class DiscoverableDerived : NotDiscoverableBase { } + + [Fact] + public void PartNotDiscoverableAttributeIsNotInherited() + { + var c = CreateContainer(typeof(DiscoverableDerived)); + DiscoverableDerived derived; + Assert.True(c.TryGetExport(out derived)); + } + + [Shared] + public class SharedBase { } + + [Export] + public class SharedDerived : SharedBase { } + + [Fact] + public void PartMetadataIsNotInherited() + { + var c = CreateContainer(typeof(SharedDerived)); + var ns = c.GetExport(); + var ns2 = c.GetExport(); + Assert.NotSame(ns, ns2); + } + + public class HasImportsSatisfied + { + public bool ImportsSatisfied { get; set; } + + [OnImportsSatisfied] + public void Done() { ImportsSatisfied = true; } + } + + [Export] + public class InheritsImportsSatisfied : HasImportsSatisfied { } + + [Fact] + public void OnImportsSatisfiedAttributeIsInherited() + { + var c = CreateContainer(typeof(InheritsImportsSatisfied)); + var x = c.GetExport(); + Assert.True(x.ImportsSatisfied); + } + + public interface IHandler { } + + public class HandlerMetadata { public string HandledMessage { get; set; } } + + [Export(typeof(IHandler)), ExportMetadata("HandledMessage", "A")] + public class AHandler : IHandler { } + + [Export(typeof(IHandler)), ExportMetadata("HandledMessage", "B")] + public class ABHandler : AHandler { } + + [Fact] + public void MetadataIsOnlyDrawnFromTheTypeToWhichItIsApplied() + { + var c = CreateContainer(typeof(ABHandler)); + var handlers = c.GetExports>().ToArray(); + Assert.Equal(1, handlers.Length); + Assert.True(handlers.Any(h => h.Metadata.HandledMessage == "B")); + } + + public class BaseVirtualExporter + { + [Export("a")] + public virtual string Exported { get; set; } + } + + public class DerivedOverrideExporter : BaseVirtualExporter + { + [Export("b")] + public override string Exported { get; set; } + } + + [Fact] + public void ExportsOnOverridePropertiesOverrideExportsOnTheBase() + { + var c = CreateContainer(typeof(DerivedOverrideExporter)); + string value; + Assert.False(c.TryGetExport("a", out value)); + Assert.True(c.TryGetExport("b", out value)); + } + } +} diff --git a/src/System.Composition/tests/LazyTests.cs b/src/System.Composition/tests/LazyTests.cs new file mode 100644 index 000000000000..79430678ecee --- /dev/null +++ b/src/System.Composition/tests/LazyTests.cs @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class LazyTests : ContainerTests + { + public interface IA { } + + [Export(typeof(IA))] + public class A : IA { } + + [Export] + public class BLazy + { + public Lazy A; + + [ImportingConstructor] + public BLazy(Lazy ia) + { + A = ia; + } + } + + [Export, ExportMetadata("Name", "Fred")] + public class NamedFred { } + + public class Named { public string Name { get; set; } } + + [Fact] + public void ComposesLazily() + { + var cc = CreateContainer(typeof(A), typeof(BLazy)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(A), x.A.Value); + } + + [Fact] + public void SupportsExportMetadata() + { + var cc = CreateContainer(typeof(NamedFred)); + var fred = cc.GetExport>(); + Assert.Equal("Fred", fred.Metadata.Name); + } + + [Fact] + public void ReturnsExportMetadataAsADictionary() + { + var cc = CreateContainer(typeof(NamedFred)); + var fred = cc.GetExport>>(); + Assert.Equal("Fred", fred.Metadata["Name"]); + } + + [Export("Special", typeof(IA))] + public class A1 : IA { } + + [Export("Special", typeof(IA))] + public class A2 : IA { } + + [Export] + public class AConsumer + { + [ImportMany("Special")] + public Lazy[] ALazies { get; set; } + } + + [Fact] + public void LazyCanBeComposedWithImportManyAndNames() + { + var cc = CreateContainer(typeof(AConsumer), typeof(A1), typeof(A2)); + var cons = cc.GetExport(); + Assert.Equal(2, cons.ALazies.Length); + } + } +} diff --git a/src/System.Composition/tests/LightContainerTests.cs b/src/System.Composition/tests/LightContainerTests.cs new file mode 100644 index 000000000000..fff137022022 --- /dev/null +++ b/src/System.Composition/tests/LightContainerTests.cs @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Linq; +using System.Text; +using System.Collections.Generic; +using System.Diagnostics; +using System.Composition; +using System.Composition.Hosting; +using System.Composition.Convention; +using System.Reflection; +using TestLibrary; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class LightContainerTests : ContainerTests + { + public interface IA { } + + [Export(typeof(IA))] + public class A : IA, IDisposable + { + public bool IsDisposed; + + public void Dispose() + { + IsDisposed = true; + } + } + + [Export(typeof(IA))] + public class A2 : IA { } + + [Export] + public class B + { + public IA A; + + [ImportingConstructor] + public B(IA ia) + { + A = ia; + } + } + + public class BarePart { } + + public class HasPropertyA + { + public IA A { get; set; } + } + + [Fact] + public void CreatesInstanceWithNoDependencies() + { + var cc = CreateContainer(typeof(A)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(A), x); + } + + [Fact] + public void DefaultLifetimeIsNonShared() + { + var cc = CreateContainer(typeof(A)); + var x = cc.GetExport(); + var y = cc.GetExport(); + Assert.NotSame(x, y); + } + + [Fact] + public void Composes() + { + var cc = CreateContainer(typeof(A), typeof(B)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(A), x.A); + } + + [Fact] + public void CanSpecifyExportsWithConventionBuilder() + { + var rb = new ConventionBuilder(); + rb.ForType().Export(); + var cc = CreateContainer(rb, typeof(BarePart)); + var x = cc.GetExport(); + Assert.NotNull(x); + } + + [Fact] + public void CanSpecifyLifetimeWithConventionBuilder() + { + var rb = new ConventionBuilder(); + rb.ForType().Export().Shared(); + var cc = CreateContainer(rb, typeof(BarePart)); + var x = cc.GetExport(); + var y = cc.GetExport(); + Assert.Same(x, y); + } + + [Fact] + public void InjectsPropertyImports() + { + var rb = new ConventionBuilder(); + rb.ForType().ImportProperty(a => a.A).Export(); + var cc = CreateContainer(rb, typeof(HasPropertyA), typeof(A)); + var x = cc.GetExport(); + Assert.IsAssignableFrom(typeof(A), x.A); + } + + [Fact] + public void VerifyAssemblyNameCanBeUsedWithContainer() + { + var test = new ContainerConfiguration() + .WithAssembly(typeof(ClassWithDependecy).GetTypeInfo().Assembly) + .CreateContainer(); + var b = test.GetExport(); + Assert.NotNull(b); + Assert.NotNull(b._dep); + } + + [Fact] + public void VerifyAssemblyWithTwoBaseTypeWithOnlyOneExportedWorks() + { + var test = new ContainerConfiguration() + .WithAssembly(typeof(ClassWithDependecy).GetTypeInfo().Assembly) + .CreateContainer(); + var b = test.GetExport(); + Assert.NotNull(b); + Assert.NotNull(b._dep); + Assert.Equal(b._dep.GetType(), typeof(TestDependency)); + } + } +} diff --git a/src/System.Composition/tests/LooseImportsTests.cs b/src/System.Composition/tests/LooseImportsTests.cs new file mode 100644 index 000000000000..5e9947618664 --- /dev/null +++ b/src/System.Composition/tests/LooseImportsTests.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.UnitTests; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.Lightweight.UnitTests +{ + public class LooseImportsTests : ContainerTests + { + [Export] + public class Transaction { } + + public class SaveChangesAttribute + { + [Import] + public Transaction Transaction { get; set; } + } + + [Fact] + public void SatisfyImportsSetsLooseImportsOnAttributedPart() + { + var container = CreateContainer(typeof(Transaction)); + var hasLoose = new SaveChangesAttribute(); + container.SatisfyImports(hasLoose); + Assert.NotNull(hasLoose.Transaction); + } + } +} diff --git a/src/System.Composition/tests/MetadataConstraintTests.cs b/src/System.Composition/tests/MetadataConstraintTests.cs new file mode 100644 index 000000000000..5996904dc0db --- /dev/null +++ b/src/System.Composition/tests/MetadataConstraintTests.cs @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting.Core; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class MetadataConstraintTests : ContainerTests + { + [Export, ExportMetadata("SettingName", "TheName")] + public class SomeSetting { } + + [Export] + public class SomeSettingUser + { + [Import, ImportMetadataConstraint("SettingName", "TheName")] + public SomeSetting Setting { get; set; } + } + + [Export] + public class ManySettingUser + { + [ImportMany, ImportMetadataConstraint("SettingName", "TheName")] + public IEnumerable Settings { get; set; } + } + + [Fact] + public void AnImportMetadataConstraintMatchesMetadataOnTheExport() + { + var cc = CreateContainer(typeof(SomeSetting), typeof(SomeSettingUser)); + var ssu = cc.GetExport(); + Assert.NotNull(ssu.Setting); + } + + [Fact] + public void AnImportMetadataConstraintMatchesMetadataOnTheExportEvenIfDiscoveryHasCompletedForTheExport() + { + var cc = CreateContainer(typeof(SomeSetting), typeof(SomeSettingUser)); + cc.GetExport(); + var ssu = cc.GetExport(); + Assert.NotNull(ssu.Setting); + } + + [Fact] + public void ImportMetadataConstraintsComposeWithOtherRelationshipTypes() + { + var cc = CreateContainer(typeof(SomeSetting), typeof(ManySettingUser)); + var ssu = cc.GetExport(); + Assert.Equal(1, ssu.Settings.Count()); + } + + [Export, ExportMetadata("SettingName", "TheName")] + public class SomeSetting { } + + [Fact] + public void ConstraintsCanBeAppliedToGenerics() + { + var contract = new CompositionContract(typeof(SomeSetting), null, new Dictionary + { + { "SettingName", "TheName" } + }); + + var c = CreateContainer(typeof(SomeSetting<>)); + object s; + Assert.True(c.TryGetExport(contract, out s)); + } + + [Export, ExportMetadata("Items", new[] { 1, 2, 3 })] + public class Presenter { } + + [Export] + public class Controller + { + [Import, ImportMetadataConstraint("Items", new[] { 1, 2, 3 })] + public Presenter Presenter { get; set; } + } + + [Fact] + public void ItemEqualityIsUsedWhenMatchingMetadataValuesThatAreArrays() + { + var c = CreateContainer(typeof(Presenter), typeof(Controller)); + var ctrl = c.GetExport(); + Assert.IsAssignableFrom(typeof(Presenter), ctrl.Presenter); + } + } +} diff --git a/src/System.Composition/tests/MetadataTests.cs b/src/System.Composition/tests/MetadataTests.cs new file mode 100644 index 000000000000..76ce7c3e0adc --- /dev/null +++ b/src/System.Composition/tests/MetadataTests.cs @@ -0,0 +1,143 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.ComponentModel; +using Xunit; +using System.Composition.UnitTests.Util; + +namespace System.Composition.UnitTests +{ + public class MetadataTests : ContainerTests + { + public class CircularM { public string Name { get; set; } } + + [Export, ExportMetadata("Name", "A")] + public class MetadataCircularityA + { + [Import] + public Lazy B { get; set; } + } + + [Export, ExportMetadata("Name", "B"), Shared] + public class MetadataCircularityB + { + [Import] + public Lazy A { get; set; } + } + + [Fact] + public void HandlesMetadataCircularity() + { + var cc = CreateContainer(typeof(MetadataCircularityA), typeof(MetadataCircularityB)); + var a = cc.GetExport(); + + Assert.Equal(a.B.Metadata.Name, "B"); + Assert.Equal(a.B.Value.A.Metadata.Name, "A"); + } + + + [MetadataAttribute] + public class ExportWithNameFooAttribute : ExportAttribute + { + public string Name { get { return "Foo"; } } + } + + [ExportWithNameFoo] + public class SingleNamedExport { } + + public class Named {[DefaultValue(null)] public string Name { get; set; } } + + [ExportWithNameFoo, Export, ExportMetadata("Priority", 10)] + public class MultipleExportsOneNamedAndBothPrioritized { } + + [ExportWithNameFoo, ExportMetadata("Priority", 10)] + public class NamedAndPrioritized { } + + [MetadataAttribute] + public class NameFooAttribute : Attribute + { + public string Name { get { return "Foo"; } } + } + + [Export, + ExportMetadata("Name", "A"), + ExportMetadata("Name", "B"), + ExportMetadata("Name", "B")] + public class MultipleNames { } + + [Export, NameFoo] + public class NamedWithCustomMetadata { } + + public class MultiValuedName { public string[] Name { get; set; } } + + public class Prioritized {[DefaultValue(0)] public int Priority { get; set; } } + + [Fact] + public void DiscoversMetadataSpecifiedUsingMetadataAttributeOnExportAttribute() + { + var cc = CreateContainer(typeof(SingleNamedExport)); + var ne = cc.GetExport>(); + Assert.Equal("Foo", ne.Metadata.Name); + } + + [Fact] + public void IfMetadataIsSpecifiedOnAnExportAttributeOtherExportsDoNotHaveIt() + { + var cc = CreateContainer(typeof(MultipleExportsOneNamedAndBothPrioritized)); + var ne = cc.GetExports>(); + Assert.Equal(2, ne.Count()); + Assert.True(ne.Where(e => e.Metadata.Name != null).Count() == 1); + } + + [Fact] + public void DiscoversStandaloneExportMetadata() + { + var cc = CreateContainer(typeof(NamedAndPrioritized)); + var ne = cc.GetExport>(); + Assert.Equal(10, ne.Metadata.Priority); + } + + [Fact] + public void DiscoversStandaloneExportMetadataUsingMetadataAttributes() + { + var cc = CreateContainer(typeof(NamedWithCustomMetadata)); + var ne = cc.GetExport>(); + Assert.Equal("Foo", ne.Metadata.Name); + } + + [Fact] + public void StandaloneExportMetadataAppliesToAllExportsOnAMember() + { + var cc = CreateContainer(typeof(MultipleExportsOneNamedAndBothPrioritized)); + var ne = cc.GetExports>(); + Assert.Equal(2, ne.Count()); + Assert.True(ne.All(e => e.Metadata.Priority == 10)); + } + + [Fact] + public void MultiplePiecesOfMetadataAreCombinedIntoAnArray() + { + var cc = CreateContainer(typeof(MultipleNames)); + + var withNames = cc.GetExport>(); + + AssertX.Equivalent(new[] { "A", "B", "B" }, withNames.Metadata.Name); + } + + [Export, ExportMetadata("Name", "Fred")] + public class NamedFred { } + + [Fact] + public void SupportsExportMetadata() + { + var cc = CreateContainer(typeof(NamedFred)); + var fred = cc.GetExport>(); + Assert.Equal("Fred", fred.Metadata.Name); + } + } +} diff --git a/src/System.Composition/tests/MetadataViewGenerationTests.cs b/src/System.Composition/tests/MetadataViewGenerationTests.cs new file mode 100644 index 000000000000..b366a521ef54 --- /dev/null +++ b/src/System.Composition/tests/MetadataViewGenerationTests.cs @@ -0,0 +1,131 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Composition.Hosting; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.Lightweight.UnitTests +{ + public class MetadataViewGenerationTests + { + [Export, ExportMetadata("Name", "A")] + public class HasNameA { } + + public class Named { public string Name { get; set; } } + + [Fact] + public void AConcreteTypeWithWritablePropertiesIsAMetadataView() + { + var cc = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var hn = cc.GetExport>(); + + Assert.Equal("A", hn.Metadata.Name); + } + + [Export] + public class HasNoName { } + + public class OptionallyNamed {[DefaultValue("B")] public string Name { get; set; } } + + [Fact] + public void MetadataViewsCanCarryDefaultValues() + { + var cc = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var hn = cc.GetExport>(); + + Assert.Equal("B", hn.Metadata.Name); + } + + public class DictionaryName + { + public DictionaryName(IDictionary metadata) + { + RetrievedName = (string)metadata["Name"]; + } + + public string RetrievedName { get; set; } + } + + [Fact] + public void AConcreteTypeWithDictionaryConstructorIsAMetadataView() + { + var cc = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var hn = cc.GetExport>(); + + Assert.Equal("A", hn.Metadata.RetrievedName); + } + + public class InvalidConcreteView + { + public InvalidConcreteView(string unsupported) { } + } + + [Fact] + public void AConcreteTypeWithUnsupportedConstructorsCannotBeUsedAsAMetadataView() + { + var cc = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var x = AssertX.Throws(() => cc.GetExport>()); + + Assert.Equal("The type 'InvalidConcreteView' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.", x.Message); + } + + [Export, ExportMetadata("Name", "A")] + public class ExportsWithMetadata { } + + public interface INamed { string Name { get; } } + + [Export] + public class ImportsWithMetadataInterface + { + [Import] + public Lazy Imported { get; set; } + } + + [Fact] + public void UnsupportedMetadataViewMessageIsInformative() + { + var cc = new ContainerConfiguration().WithParts(typeof(ImportsWithMetadataInterface), typeof(ExportsWithMetadata)).CreateContainer(); + var x = AssertX.Throws(() => cc.GetExport()); + Assert.Equal("The type 'INamed' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.", x.Message); + } + + public class ReadonlyNameOrderMetadata + { + public int Order { get; set; } + public string Name { get { return "Name"; } } + } + + [Export, ExportMetadata("Order", 1)] + public class HasOrder { } + + [Fact] + public void ReadOnlyPropertiesOnMetadataViewsAreIgnored() + { + var c = new ContainerConfiguration() + .WithPart() + .CreateContainer(); + + var l = c.GetExport>(); + Assert.Equal(1, l.Metadata.Order); + } + } +} diff --git a/src/System.Composition/tests/OpenGenericsTests.cs b/src/System.Composition/tests/OpenGenericsTests.cs new file mode 100644 index 000000000000..075683320b07 --- /dev/null +++ b/src/System.Composition/tests/OpenGenericsTests.cs @@ -0,0 +1,155 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Hosting.Core; +using System.Composition.Runtime; +using System.Composition.UnitTests.Util; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class OpenGenericsTests : ContainerTests + { + private interface IRepository { } + + [Export(typeof(IRepository<>))] + private class BasicRepository : IRepository { } + + private class RepositoryProperty + { + private readonly IRepository _repository = new BasicRepository(); + + [Export(typeof(IRepository<>))] + public IRepository Repository { get { return _repository; } } + } + + [Shared] + private class TwoGenericExports + { + private readonly BasicRepository _repository = new BasicRepository(); + + [Export(typeof(IRepository<>))] + public IRepository Repository { get { return _repository; } } + + [Export(typeof(BasicRepository<>))] + public BasicRepository Repository2 { get { return _repository; } } + } + + private interface IFirst { } + private interface ISecond { } + + [Export(typeof(IFirst<>)), Export(typeof(ISecond<>))] + private class FirstAndSecond : IFirst, ISecond { } + + [Export(typeof(IRepository<>))] + private class RepositoryWithKey : IRepository { } + + private interface IRepository { } + + [Export(typeof(IRepository))] + private class RepositoryWithNonGenericExport : IRepository { } + + [Export] + private class ExportSelf { } + + private class SomeGenericType { } + + [Export(typeof(SomeGenericType<>))] + private class ExportsBase : SomeGenericType { } + + [Fact] + public void CanExportBasicOpenGeneric() + { + var cc = CreateContainer(typeof(BasicRepository<>)); + var r = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(BasicRepository), r); + } + + [Fact] + public void OpenGenericProvidesMultipleInstantiations() + { + var cc = CreateContainer(typeof(BasicRepository<>)); + var r = cc.GetExport>(); + var r2 = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(BasicRepository), r2); + } + + [Fact] + public void CanExportOpenGenericProperty() + { + var cc = CreateContainer(typeof(RepositoryProperty<>)); + var r = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(BasicRepository), r); + } + + [Fact] + public void ASharedOpenGenericWithTwoExportsIsProvidedByASingleInstance() + { + var cc = CreateContainer(typeof(TwoGenericExports<>)); + var r = cc.GetExport>(); + var r2 = cc.GetExport>(); + + Assert.NotNull(r); + Assert.Same(r, r2); + } + + [Fact] + public void APartWithMultipleGenericExportsIsOnlyDiscoveredOnce() + { + var cc = CreateContainer(typeof(BasicRepository<>), typeof(TwoGenericExports<>)); + + // Provided by TwoGenericExports + var r1 = cc.GetExport>(); + + // Provided by both + var others = cc.GetExports>(); + Assert.Equal(2, others.Count()); + } + + [Fact] + public void MultipleGenericExportsCanBeSpecifiedAtTheClassLevel() + { + var cc = CreateContainer(typeof(FirstAndSecond<>)); + var first = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(FirstAndSecond), first); + } + + // In future, the set of allowable generic type mappings will be expanded (see + // ignored tests above). + [Fact] + public void TypesWithMismatchedGenericParameterListsAreDetectedDuringDiscovery() + { + var x = AssertX.Throws(() => CreateContainer(typeof(RepositoryWithKey<,>))); + Assert.Equal("Exported contract 'IRepository`1' of open generic part 'RepositoryWithKey`2' does not match the generic arguments of the class.", x.Message); + } + + [Fact] + public void TypesWithNonGenericExportsAreDetectedDuringDiscovery() + { + var x = AssertX.Throws(() => CreateContainer(typeof(RepositoryWithNonGenericExport<>))); + Assert.Equal("Open generic part 'RepositoryWithNonGenericExport`1' cannot export non-generic contract 'IRepository'.", x.Message); + } + + [Fact] + public void OpenGenericsCanExportSelf() + { + var cc = CreateContainer(typeof(ExportSelf<>)); + var es = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(ExportSelf), es); + } + + [Fact] + public void OpenGenericsCanExportBase() + { + var cc = CreateContainer(typeof(ExportsBase<>)); + var es = cc.GetExport>(); + Assert.IsAssignableFrom(typeof(ExportsBase), es); + } + } +} diff --git a/src/System.Composition/tests/OptionalImportTests.cs b/src/System.Composition/tests/OptionalImportTests.cs new file mode 100644 index 000000000000..0bec74293243 --- /dev/null +++ b/src/System.Composition/tests/OptionalImportTests.cs @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class OptionalImportTests : ContainerTests + { + private class Missing { } + + [Export] + private class Supplied { } + + [Export] + private class HasOptionalConstructorParameter + { + public Missing Missing { get; set; } + public Supplied Supplied { get; set; } + + [ImportingConstructor] + public HasOptionalConstructorParameter([Import(AllowDefault = true)] Missing missing, Supplied supplied) + { + Missing = missing; + Supplied = supplied; + } + } + + [Export] + private class HasOptionalProperty + { + private Missing _missing; + + public bool WasMissingSetterCalled { get; set; } + + [Import(AllowDefault = true)] + public Missing Missing + { + get { return _missing; } + set + { + WasMissingSetterCalled = true; + _missing = value; + } + } + + [Import] + public Supplied Supplied { get; set; } + } + + [Fact] + public void MissingOptionalConstructorParametersAreSuppliedTheirDefaultValue() + { + var cc = CreateContainer(typeof(Supplied), typeof(HasOptionalConstructorParameter)); + var ocp = cc.GetExport(); + Assert.Null(ocp.Missing); + Assert.NotNull(ocp.Supplied); + } + + [Fact] + public void MissingOptionalPropertyImportsAreIgnored() + { + var cc = CreateContainer(typeof(Supplied), typeof(HasOptionalProperty)); + var op = cc.GetExport(); + Assert.NotNull(op.Supplied); + Assert.Null(op.Missing); + Assert.False(op.WasMissingSetterCalled); + } + } +} diff --git a/src/System.Composition/tests/Properties/AssemblyInfo.cs b/src/System.Composition/tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..34e6861dc112 --- /dev/null +++ b/src/System.Composition/tests/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + diff --git a/src/System.Composition/tests/PropertyExportTests.cs b/src/System.Composition/tests/PropertyExportTests.cs new file mode 100644 index 000000000000..a9dcb43fc9f3 --- /dev/null +++ b/src/System.Composition/tests/PropertyExportTests.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class PropertyExportTests : ContainerTests + { + public class Messenger + { + [Export] + public string Message { get { return "Helo!"; } } + } + + [Fact] + public void CanExportProperty() + { + var cc = CreateContainer(typeof(Messenger)); + + var x = cc.GetExport(); + + Assert.Equal("Helo!", x); + } + + [Export, Shared] + public class SelfObsessed + { + [Export] + public SelfObsessed Self { get { return this; } } + } + + [Export] + public class Selfless + { + [ImportMany] + public IList Values { get; set; } + } + + [Fact] + public void ExportedPropertiesShareTheSameSharedPartInstance() + { + var cc = CreateContainer(typeof(SelfObsessed), typeof(Selfless)); + var sl = cc.GetExport(); + Assert.Same(sl.Values[0], sl.Values[1]); + } + } +} diff --git a/src/System.Composition/tests/RegistrationBuilderCompatibilityTests.cs b/src/System.Composition/tests/RegistrationBuilderCompatibilityTests.cs new file mode 100644 index 000000000000..11852382fc24 --- /dev/null +++ b/src/System.Composition/tests/RegistrationBuilderCompatibilityTests.cs @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition.Hosting; +using System.Composition.Convention; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using System.Composition.UnitTests.Util; +using Xunit; + +namespace System.Composition.UnitTests +{ + public class ConventionBuilderCompatibilityTests + { + public class Base + { + public object Prop { get; set; } + } + + [Export] + public class Derived : Base + { + new public string Prop { get; set; } + } + + [Fact] + public void WhenConventionsAreInUseDuplicatePropertyNamesDoNotBreakDiscovery() + { + var rb = new ConventionBuilder(); + var c = new ContainerConfiguration() + .WithPart(typeof(Derived), rb) + .CreateContainer(); + } + + public interface IRepository { } + + public class EFRepository : IRepository { } + + + [Fact] + public void ConventionBuilderExportsOpenGenerics() + { + var rb = new ConventionBuilder(); + + rb.ForTypesDerivedFrom(typeof(IRepository<>)) + .Export(eb => eb.AsContractType(typeof(IRepository<>))); + + var c = new ContainerConfiguration() + .WithPart(typeof(EFRepository<>), rb) + .CreateContainer(); + + var r = c.GetExport>(); + } + + public class Imported { } + + public class BaseWithImport + { + public virtual Imported Imported { get; set; } + } + + public class DerivedFromBaseWithImport : BaseWithImport + { + } + + [Fact] + public void ConventionsCanApplyImportsToInheritedProperties() + { + var conventions = new ConventionBuilder(); + conventions.ForType().Export(); + conventions.ForType() + .ImportProperty(b => b.Imported) + .Export(); + + var container = new ContainerConfiguration() + .WithDefaultConventions(conventions) + .WithParts(typeof(Imported), typeof(DerivedFromBaseWithImport)) + .CreateContainer(); + + var dfb = container.GetExport(); + Assert.IsAssignableFrom(typeof(Imported), dfb.Imported); + } + + public class BaseWithExport + { + public string Exported { get { return "A"; } } + } + + public class DerivedFromBaseWithExport : BaseWithExport + { + } + + [Fact] + public void ConventionsCanApplyExportsToInheritedProperties() + { + var conventions = new ConventionBuilder(); + conventions.ForType() + .ExportProperty(b => b.Exported); + + var container = new ContainerConfiguration() + .WithDefaultConventions(conventions) + .WithParts(typeof(DerivedFromBaseWithExport)) + .CreateContainer(); + + var s = container.GetExport(); + Assert.Equal("A", s); + } + + public class BaseWithExport2 + { + [Export] + public virtual string Exported { get { return "A"; } } + } + + public class DerivedFromBaseWithExport2 : BaseWithExport + { + } + + [Fact] + public void ConventionsCanApplyExportsToInheritedPropertiesWithoutInterferingWithBase() + { + var conventions = new ConventionBuilder(); + conventions.ForType() + .ExportProperty(b => b.Exported); + + var container = new ContainerConfiguration() + .WithDefaultConventions(conventions) + .WithParts(typeof(BaseWithExport2)) + .WithParts(typeof(DerivedFromBaseWithExport2)) + .CreateContainer(); + + var s = container.GetExports(); + Assert.Equal(2, s.Count()); + } + + [Export] + public class BaseWithDeclaredExports + { + public BaseWithDeclaredExports() { Property = "foo"; } + + [Export] + public string Property { get; set; } + } + + public class DerivedFromBaseWithDeclaredExports : BaseWithDeclaredExports { } + + [Fact] + public void InThePresenceOfConventionsClassExportsAreNotInherited() + { + var cc = new ContainerConfiguration() + .WithPart(new ConventionBuilder()) + .CreateContainer(); + + BaseWithDeclaredExports export; + Assert.False(cc.TryGetExport(out export)); + } + + [Fact] + public void InThePresenceOfConventionsPropertyExportsAreNotInherited() + { + var cc = new ContainerConfiguration() + .WithPart(new ConventionBuilder()) + .CreateContainer(); + + string export; + Assert.False(cc.TryGetExport(out export)); + } + + public class CustomExport : ExportAttribute { } + + [CustomExport] + public class BaseWithCustomExport { } + + public class DerivedFromBaseWithCustomExport : BaseWithCustomExport { } + + [Fact] + public void CustomAttributesDoNotBecomeInheritedInThePresenceOfConventions() + { + var cc = new ContainerConfiguration() + .WithPart(new ConventionBuilder()) + .CreateContainer(); + + BaseWithCustomExport bce; + Assert.False(cc.TryGetExport(out bce)); + } + } +} diff --git a/src/System.Composition/tests/SharingTests.cs b/src/System.Composition/tests/SharingTests.cs new file mode 100644 index 000000000000..d7a53e6f2c8f --- /dev/null +++ b/src/System.Composition/tests/SharingTests.cs @@ -0,0 +1,496 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Text; +using System.Collections.Generic; +using System.Composition; +using System.Composition.Hosting; +using System.Composition.Hosting.Providers; +using System.Linq; +using Xunit; + +namespace System.Composition.UnitTests +{ + public interface ISharedTestingClass + { + void Method(); + } + + [Export(typeof(ISharedTestingClass))] + public class NonSharedClass : ISharedTestingClass + { + [ImportingConstructor] + public NonSharedClass() + { + } + + public void Method() { } + } + + + [Export(typeof(ISharedTestingClass))] + [Shared] + public class SharedClass : ISharedTestingClass + { + [ImportingConstructor] + public SharedClass() + { + } + + public void Method() + { + } + } + + [Export] + [Shared] + public class ClassWithExportFactoryShared + { + private readonly ExportFactory _fact; + [ImportingConstructor] + public ClassWithExportFactoryShared(ExportFactory factory) + { + _fact = factory; + } + + public ISharedTestingClass Method() + { + using (var b = _fact.CreateExport()) + { + return b.Value; + } + } + } + + [Export] + public class ClassWithExportFactoryNonShared + { + private readonly ExportFactory _fact; + [ImportingConstructor] + public ClassWithExportFactoryNonShared(ExportFactory factory) + { + _fact = factory; + } + + public ISharedTestingClass Method() + { + using (var b = _fact.CreateExport()) + { + return b.Value; + } + } + } + + + [Export] + public class ClassWithExportFactoryAsAProperty + { + [Import] + public ExportFactory _fact { get; set; } + public ClassWithExportFactoryAsAProperty() + { + } + + public ISharedTestingClass Method() + { + using (var b = _fact.CreateExport()) + { + return b.Value; + } + } + } + + internal interface IX { } + internal interface IY { } + + [Export] + + [Shared("Boundary")] + public class A + { + public int SharedState { get; set; } + } + + [Export] + public class B + { + public A InstanceA { get; set; } + public D InstanceD { get; set; } + [ImportingConstructor] + public B(A a, D d) + { + InstanceA = a; + InstanceD = d; + } + } + + [Export] + public class D + { + public A InstanceA; + [ImportingConstructor] + public D(A a) + { + InstanceA = a; + } + } + + + [Export] + public class C + { + private readonly ExportFactory _fact; + [ImportingConstructor] + public C([SharingBoundary("Boundary")]ExportFactory fact) + { + _fact = fact; + } + + public B CreateInstance() + { + using (var b = _fact.CreateExport()) + { + return b.Value; + } + } + } + + [Export] + public class CPrime + { + private readonly ExportFactory _fact; + [ImportingConstructor] + public CPrime(ExportFactory fact) + { + _fact = fact; + } + + public B CreateInstance() + { + using (var b = _fact.CreateExport()) + { + return b.Value; + } + } + } + + [Export] + [Shared("Boundary")] + public class CirC + { + public CirA DepA { get; private set; } + [ImportingConstructor] + public CirC(CirA a) + { + DepA = a; + } + } + + + [Export] + [Shared] + public class CirA + { + public int SharedState; + private readonly ExportFactory _fact; + [ImportingConstructor] + public CirA([SharingBoundary("Boundary")]ExportFactory b) + { + _fact = b; + } + + public CirB CreateInstance() + { + using (var ins = _fact.CreateExport()) + { + return ins.Value; + } + } + } + + [Export] + public class CirB + { + public CirC DepC { get; private set; } + [ImportingConstructor] + public CirB(CirC c) + { + DepC = c; + } + } + + public interface IProj { } + + + [Export] + public class SolA + { + private readonly IEnumerable> _fact; + public List Projects { get; private set; } + [ImportingConstructor] + public SolA([ImportMany][SharingBoundary("B1", "B2")] IEnumerable> c) + { + Projects = new List(); + _fact = c; + } + + public void SetupProject() + { + foreach (var fact in _fact) + { + using (var instance = fact.CreateExport()) + { + Projects.Add(instance.Value); + } + } + } + } + + + [Export(typeof(IProj))] + public class ProjA : IProj + { + [ImportingConstructor] + public ProjA(DocA docA, ColA colA) + { + } + } + + [Export(typeof(IProj))] + public class ProjB : IProj + { + [ImportingConstructor] + public ProjB(DocB docA, ColB colA) + { + } + } + + [Export] + public class DocA + { + [ImportingConstructor] + public DocA(ColA colA) + { + } + } + + + + [Export] + public class DocB + { + [ImportingConstructor] + public DocB(ColB colB) + { + } + } + + [Export] + [Shared("B1")] + + public class ColA + { + public ColA() + { } + } + + [Export] + [Shared("B2")] + public class ColB + { + public ColB() + { } + } + + + public interface ICol { } + + + [Export(typeof(IX)), Export(typeof(IY)), Shared] + public class XY : IX, IY { } + public class SharingTest : ContainerTests + { + /// + /// Two issues here One is that the message could be improved + /// "The component (unknown) cannot be created outside the Boundary sharing boundary." + /// Second is we don`t fail when we getExport for CPrime + /// we fail only when we create instance of B.. is that correct. + /// + [Fact] + public void BoundaryExposedBoundaryButNoneImported() + { + try + { + var cc = CreateContainer(typeof(A), typeof(B), typeof(CPrime), typeof(D)); + var cInstance = cc.GetExport(); + var bIn1 = cInstance.CreateInstance(); + } + catch (Exception ex) + { + Assert.True(ex.Message.Contains("The component (unknown) cannot be created outside the Boundary sharing boundary")); + } + } + + /// + /// Need a partcreationpolicy currently. + /// Needs to be fixed so that specifying boundary would automatically create the shared + /// + [Fact] + public void BoundarySharingTest() + { + var cc = CreateContainer(typeof(A), typeof(B), typeof(C), typeof(D)); + var cInstance = cc.GetExport(); + var bIn1 = cInstance.CreateInstance(); + var bIn2 = cInstance.CreateInstance(); + bIn1.InstanceA.SharedState = 1; + var val1 = bIn1.InstanceD.InstanceA; + + bIn2.InstanceA.SharedState = 5; + var val2 = bIn2.InstanceD.InstanceA; + + Assert.True(val1.SharedState == 1); + Assert.True(val2.SharedState == 5); + } + + + /// + /// CirA root of the composition has to be shared explcitly. + /// + [Fact] + public void CircularBoundarySharingTest() + { + var cc = CreateContainer(typeof(CirA), typeof(CirB), typeof(CirC)); + var cInstance = cc.GetExport(); + cInstance.SharedState = 1; + var bInstance1 = cInstance.CreateInstance(); + Assert.Equal(bInstance1.DepC.DepA.SharedState, 1); + bInstance1.DepC.DepA.SharedState = 10; + cInstance.CreateInstance(); + Assert.Equal(bInstance1.DepC.DepA.SharedState, 10); + } + + /// + /// Something is badly busted here.. I am getting a null ref exception + /// + [Fact] + public void MultipleBoundarySpecified() + { + var cc = CreateContainer(typeof(ProjA), typeof(ProjB), typeof(SolA), typeof(DocA), typeof(DocB), typeof(ColA), typeof(ColB)); + var solInstance = cc.GetExport(); + solInstance.SetupProject(); + } + + + [Fact] + public void SharedPartExportingMultipleContractsSharesAnInstance() + { + var cc = CreateContainer(typeof(XY)); + var x = cc.GetExport(); + var y = cc.GetExport(); + Assert.Same(x, y); + } + + [Fact] + public void GetExportsCreatesInstancedObjectByDefault() + { + var cc = CreateContainer(typeof(NonSharedClass)); + var val1 = cc.GetExport(); + var val2 = cc.GetExport(); + Assert.NotSame(val1, val2); + } + + [Fact] + public void GetExportsCreatesSharedObjectsWhenSpecified() + { + var cc = CreateContainer(typeof(SharedClass)); + var val1 = cc.GetExport(); + var val2 = cc.GetExport(); + Assert.Same(val1, val2); + } + + /// + /// Class with export factory that, which is shared that has a part that is non shared + /// verify that GetExport returns only one instance regardless of times it is called + /// verify that On Method call different instances are returned. + /// + [Fact] + public void ExportFactoryCreatesNewInstances() + { + var cc = CreateContainer(typeof(ClassWithExportFactoryShared), typeof(NonSharedClass)); + var b1 = cc.GetExport(); + var b2 = cc.GetExport(); + var inst1 = b1.Method(); + var inst2 = b1.Method(); + Assert.Same(b1, b2); + Assert.NotSame(inst1, inst2); + } + + /// + /// ExportFactory should be importable as a property + /// + [Fact] + public void ClassWithExportFactoryAsAProperty() + { + var cc = CreateContainer(typeof(ClassWithExportFactoryAsAProperty), typeof(NonSharedClass)); + var b1 = cc.GetExport(); + var inst1 = b1.Method(); + var inst2 = b1.Method(); + Assert.NotNull(b1._fact); + Assert.NotSame(inst1, inst2); + } + + /// + /// ExportFactory class is itself shared and + /// will still respect the CreationPolicyAttribute on a part. If the export factory + /// is creating a part which is shared, it will return back the same instance of the part. + /// + [Fact] + public void ClassWithExportFactoryAndSharedExport() + { + var cc = CreateContainer(typeof(ClassWithExportFactoryShared), typeof(SharedClass)); + var b1 = cc.GetExport(); + var b2 = cc.GetExport(); + var inst1 = b1.Method(); + var inst2 = b2.Method(); + Assert.Same(b1, b2); + Assert.Same(inst1, inst2); + } + + /// + /// Class which is nonShared has an exportFactory in it for a shared part. + /// Two instances of the root class are created , the part created using export factory should not be shared + /// + [Fact] + public void ClassWithNonSharedExportFactoryCreatesSharedInstances() + { + var cc = CreateContainer(typeof(ClassWithExportFactoryNonShared), typeof(SharedClass)); + var b1 = cc.GetExport(); + var b2 = cc.GetExport(); + var inst1 = b1.Method(); + var inst2 = b2.Method(); + Assert.NotSame(b1, b2); + Assert.Same(inst1, inst2); + } + + [Shared, Export] + public class ASharedPart { } + + [Fact] + public void ConsistentResultsAreReturneWhenResolvingLargeNumbersOfSharedParts() + { + var config = new ContainerConfiguration(); + + // Chosen to cause overflows in SmallSparseInitOnlyArray + for (var i = 0; i < 1000; ++i) + config.WithPart(); + + Assert.NotEqual(new ASharedPart(), new ASharedPart()); + + var container = config.CreateContainer(); + var first = container.GetExports().ToList(); + var second = container.GetExports().ToList(); + Assert.Equal(first, second); + } + } +} diff --git a/src/System.Composition/tests/System.Composition.Tests.csproj b/src/System.Composition/tests/System.Composition.Tests.csproj new file mode 100644 index 000000000000..406c0f51dff0 --- /dev/null +++ b/src/System.Composition/tests/System.Composition.Tests.csproj @@ -0,0 +1,102 @@ + + + + + + + 2.0 + {4852A19F-C05C-478D-BFA0-59FD03DE0E3F} + Library + Properties + System.Composition.Lightweight.UnitTests + System.Composition.Tests + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + false + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + {44c7e52c-3873-4c64-875c-8a23a8376d60} + Microsoft.Composition.Demos.ExtendedCollectionImports + + + {c6257381-c624-494a-a9d9-5586e60856ea} + System.Composition.AttributedModel + + + {e6592fad-10b5-4b56-9287-d72dd136992f} + System.Composition.Convention + + + {2b8fecc6-34a1-48fe-ba75-99572d2d6db2} + System.Composition.Hosting + + + {2711dfd2-8541-4628-bc53-eb784a14cdcf} + System.Composition.Runtime + + + {b4b5e15c-e6b9-48ea-94c2-f067484d4d3e} + System.Composition.TypedParts + + + {da6841a5-0344-4cc7-98b0-89cbee18dee3} + TestLibrary + + + + + + + + \ No newline at end of file diff --git a/src/System.Composition/tests/Util/AssertX.cs b/src/System.Composition/tests/Util/AssertX.cs new file mode 100644 index 0000000000000000000000000000000000000000..2806f00794e0018fe3ae67ccde0a3ca7e00e988e GIT binary patch literal 8024 zcmeHM-)|d55Z-4b{)cOx9D%Oz3Z*D2DMAz~VFy*JcyMedF?DR?vzu6yf4$}VW<0vx zyS+VM61PG^(Pi&$=Vs^UH?!*x?;pFzE_2V^!Y$p_t=!aIx+}NFyPg}lV~oGx-3T)a zSKzw9T#mOVZic_i`=XGi38*G``xgJlp#0o@h84KR3*j?ybDPm0g7kt)cuM#r+B^qBDXXXeOZjR`hL}&Be~No64kIi#vXmyC1=4 zj*DI!wQ`~T=kBjox&b)eLZ3EW2JqMlv_tq%ZIQ!sL)hXCuKL%n#NX2>=W;HGJ;&gn z-_zD}@Vv%41tN3^JsAVO&DE;cm}P{Lzj^Bn-}0Fn(L)71cqa2R@zdY(KLbDhQ3rZ) zB`Y$v`Hgyigr^bwM(r5qCo+jWx8V zRYSWmTK3T~)Jo&RxZC)TXd9C*W%;+T?-bFd_($&#B?<~ymcD0RX^v0ep(Qk-eTi#* z@uyGoCAj#{=8X+_&Ol#st5f<&!&%1p3fDC_W{~mR8H&Ajf8Y&gFEJPQaoQhK;2N=A zty-5ZbKl`FgWiUX@7z0Cle*XGbD*)J_^o>h-aXi-%~q@`PjG$Jpn-Wct%*^ER#&7b zpx-4Vp*Epka`zk-HC*onC{Np$wv9)ct!g9dmgXsKHbK6IQLY)Pc4I#IQB=>beXOTa z#=XJ0&;opOgj!ivKCQY(PG{)74Aq)Zx`F&h@JU*8%{9~C#`|XADJqj%iD*Y`V;4}3 zCCbeAe)RHP7y}H&1nJ}-=a z_Gd&@_B>;WIX`2D5`FYC>$+e6Ztx8$%YKgap9o9@n+i8}klJllqdry%Ok*3vm~?@+GVIeyGq6xI+*G!uO6N%zU>Ud@~RyP+nuxGx@P zhD>)I2=iu*OyLfH0qMh?avUX^X#LEp>RrV`#e3^{Nqxv3{0G#pa;L_QbBli1M>|TO z`_ZSktKtT2!!C|HT9uq90c-T%Q+YtJLevJqmVa+(mtlt1sEDJJo7FhZSG- zv%RD4@sFaJ#<*f!atAesTs#k)NKYEtGsk`*jkXq1e%E)1eNxqTd=9lQ?Q1b+vQ@|K zI~<-Aa1X`Pf$I6rIqXL)V_!^*c8S)mdDs@+UHLU-P zgUucpK(DQwORwGUVnKEtJ<&9GKjVHYJqYU;F(uBa4QoxFbi5grjcMsE+US$qlRa&F z<85O%iR`PpMV@_aV;r??*2ev)CcD^=Ww~*(v765K(={!9doG5n^X!K48IS&EZv17b z8SlGdY+LWv)ZdPzs)QYKJX+HpGBg_Rx>D?|9=7fnQE5+ literal 0 HcmV?d00001 diff --git a/src/System.Composition/tests/project.json b/src/System.Composition/tests/project.json new file mode 100644 index 000000000000..cf62fcc05e24 --- /dev/null +++ b/src/System.Composition/tests/project.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "System.Linq.Expressions": "4.0.10", + "System.Reflection.Emit.ILGeneration": "4.0.0", + "System.Reflection.Emit.Lightweight": "4.0.0", + "System.Runtime": "4.0.20", + "xunit": "2.1.0-beta3-*", + "xunit.netcore.extensions": "1.0.0-prerelease-*" + }, + "frameworks": { + "dnxcore50": { } + } +} \ No newline at end of file diff --git a/src/System.Composition/tests/project.lock.json b/src/System.Composition/tests/project.lock.json new file mode 100644 index 000000000000..c5d8c5bffb72 --- /dev/null +++ b/src/System.Composition/tests/project.lock.json @@ -0,0 +1,1261 @@ +{ + "locked": true, + "version": -9996, + "targets": { + "DNXCore,Version=v5.0": { + "System.Collections/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Collections.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Collections.dll": {} + } + }, + "System.Diagnostics.Debug/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Diagnostics.Debug.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Diagnostics.Debug.dll": {} + } + }, + "System.Globalization/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Globalization.dll": {} + } + }, + "System.IO/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Text.Encoding": "4.0.0", + "System.Threading.Tasks": "4.0.0" + }, + "compile": { + "ref/dotnet/System.IO.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.IO.dll": {} + } + }, + "System.Linq/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Collections": "4.0.10", + "System.Resources.ResourceManager": "4.0.0", + "System.Diagnostics.Debug": "4.0.10", + "System.Runtime.Extensions": "4.0.10" + }, + "compile": { + "ref/dotnet/System.Linq.dll": {} + }, + "runtime": { + "lib/dotnet/System.Linq.dll": {} + } + }, + "System.Linq.Expressions/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Resources.ResourceManager": "4.0.0", + "System.Collections": "4.0.0", + "System.Diagnostics.Debug": "4.0.0", + "System.Reflection": "4.0.0", + "System.IO": "4.0.0", + "System.Reflection.TypeExtensions": "4.0.0", + "System.Reflection.Primitives": "4.0.0", + "System.Reflection.Emit": "4.0.0", + "System.ObjectModel": "4.0.0", + "System.Threading": "4.0.0", + "System.Runtime.Extensions": "4.0.0", + "System.Linq": "4.0.0", + "System.Globalization": "4.0.0", + "System.Reflection.Extensions": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Linq.Expressions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Linq.Expressions.dll": {} + } + }, + "System.ObjectModel/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.ObjectModel.dll": {} + } + }, + "System.Private.Uri/4.0.0": { + "runtime": { + "lib/DNXCore50/System.Private.Uri.dll": {} + } + }, + "System.Reflection/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.IO": "4.0.0", + "System.Reflection.Primitives": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.dll": {} + } + }, + "System.Reflection.Emit/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Reflection.Emit.ILGeneration": "4.0.0", + "System.IO": "4.0.0", + "System.Reflection.Primitives": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.dll": {} + } + }, + "System.Reflection.Emit.ILGeneration/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Reflection.Primitives": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.ILGeneration.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.ILGeneration.dll": {} + } + }, + "System.Reflection.Emit.Lightweight/4.0.0": { + "dependencies": { + "System.Reflection": "4.0.0", + "System.Reflection.Primitives": "4.0.0", + "System.Runtime": "4.0.0", + "System.Reflection.Emit.ILGeneration": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Emit.Lightweight.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Emit.Lightweight.dll": {} + } + }, + "System.Reflection.Extensions/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Extensions.dll": {} + } + }, + "System.Reflection.Primitives/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.Primitives.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.Primitives.dll": {} + } + }, + "System.Reflection.TypeExtensions/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Reflection.TypeExtensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Reflection.TypeExtensions.dll": {} + } + }, + "System.Resources.ResourceManager/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Globalization": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Resources.ResourceManager.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Resources.ResourceManager.dll": {} + } + }, + "System.Runtime/4.0.20": { + "dependencies": { + "System.Private.Uri": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.dll": {} + } + }, + "System.Runtime.Extensions/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.20" + }, + "compile": { + "ref/dotnet/System.Runtime.Extensions.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Extensions.dll": {} + } + }, + "System.Runtime.Handles/4.0.0": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.Handles.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.Handles.dll": {} + } + }, + "System.Runtime.InteropServices/4.0.20": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Reflection": "4.0.0", + "System.Reflection.Primitives": "4.0.0", + "System.Runtime.Handles": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.InteropServices.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Runtime.InteropServices.dll": {} + } + }, + "System.Runtime.InteropServices.RuntimeInformation/4.0.0-beta-23213": { + "dependencies": { + "System.Runtime": "4.0.20", + "System.Resources.ResourceManager": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll": {} + }, + "runtime": { + "lib/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll": {} + } + }, + "System.Text.Encoding/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Text.Encoding.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Text.Encoding.dll": {} + } + }, + "System.Threading/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0", + "System.Threading.Tasks": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.dll": {} + } + }, + "System.Threading.Tasks/4.0.10": { + "dependencies": { + "System.Runtime": "4.0.0" + }, + "compile": { + "ref/dotnet/System.Threading.Tasks.dll": {} + }, + "runtime": { + "lib/DNXCore50/System.Threading.Tasks.dll": {} + } + }, + "xunit/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.core": "[2.1.0-beta3-build3029]", + "xunit.assert": "[2.1.0-beta3-build3029]" + } + }, + "xunit.abstractions/2.0.0": { + "compile": { + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll": {} + }, + "runtime": { + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll": {} + } + }, + "xunit.assert/2.1.0-beta3-build3029": { + "compile": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll": {} + }, + "runtime": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll": {} + } + }, + "xunit.core/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.extensibility.core": "[2.1.0-beta3-build3029]", + "xunit.extensibility.execution": "[2.1.0-beta3-build3029]" + } + }, + "xunit.extensibility.core/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.abstractions": "[2.0.0]" + }, + "compile": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll": {} + }, + "runtime": { + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll": {} + } + }, + "xunit.extensibility.execution/2.1.0-beta3-build3029": { + "dependencies": { + "xunit.extensibility.core": "[2.1.0-beta3-build3029]" + }, + "compile": { + "lib/dnxcore50/xunit.execution.dnx.dll": {} + }, + "runtime": { + "lib/dnxcore50/xunit.execution.dnx.dll": {} + } + }, + "xunit.netcore.extensions/1.0.0-prerelease-00079": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10", + "System.IO": "4.0.10", + "System.Linq": "4.0.0", + "System.Reflection": "4.0.10", + "System.Reflection.Primitives": "4.0.0", + "System.Runtime": "4.0.20", + "System.Runtime.Extensions": "4.0.10", + "System.Runtime.Handles": "4.0.0", + "System.Runtime.InteropServices": "4.0.20", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0-beta-23213", + "System.Text.Encoding": "4.0.10", + "System.Threading": "4.0.10", + "System.Threading.Tasks": "4.0.10", + "xunit": "2.1.0-beta3-build3029" + }, + "compile": { + "lib/dotnet/Xunit.NetCore.Extensions.dll": {} + }, + "runtime": { + "lib/dotnet/Xunit.NetCore.Extensions.dll": {} + } + } + } + }, + "libraries": { + "System.Collections/4.0.10": { + "serviceable": true, + "sha512": "ux6ilcZZjV/Gp7JEZpe+2V1eTueq6NuoGRM3eZCFuPM25hLVVgCRuea6STW8hvqreIOE59irJk5/ovpA5xQipw==", + "files": [ + "System.Collections.4.0.10.nupkg", + "System.Collections.4.0.10.nupkg.sha512", + "System.Collections.nuspec", + "lib/DNXCore50/System.Collections.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Collections.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Collections.dll", + "ref/dotnet/System.Collections.xml", + "ref/dotnet/de/System.Collections.xml", + "ref/dotnet/es/System.Collections.xml", + "ref/dotnet/fr/System.Collections.xml", + "ref/dotnet/it/System.Collections.xml", + "ref/dotnet/ja/System.Collections.xml", + "ref/dotnet/ko/System.Collections.xml", + "ref/dotnet/ru/System.Collections.xml", + "ref/dotnet/zh-hans/System.Collections.xml", + "ref/dotnet/zh-hant/System.Collections.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Collections.dll" + ] + }, + "System.Diagnostics.Debug/4.0.10": { + "serviceable": true, + "sha512": "pi2KthuvI2LWV2c2V+fwReDsDiKpNl040h6DcwFOb59SafsPT/V1fCy0z66OKwysurJkBMmp5j5CBe3Um+ub0g==", + "files": [ + "System.Diagnostics.Debug.4.0.10.nupkg", + "System.Diagnostics.Debug.4.0.10.nupkg.sha512", + "System.Diagnostics.Debug.nuspec", + "lib/DNXCore50/System.Diagnostics.Debug.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Diagnostics.Debug.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Diagnostics.Debug.dll", + "ref/dotnet/System.Diagnostics.Debug.xml", + "ref/dotnet/de/System.Diagnostics.Debug.xml", + "ref/dotnet/es/System.Diagnostics.Debug.xml", + "ref/dotnet/fr/System.Diagnostics.Debug.xml", + "ref/dotnet/it/System.Diagnostics.Debug.xml", + "ref/dotnet/ja/System.Diagnostics.Debug.xml", + "ref/dotnet/ko/System.Diagnostics.Debug.xml", + "ref/dotnet/ru/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hans/System.Diagnostics.Debug.xml", + "ref/dotnet/zh-hant/System.Diagnostics.Debug.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Diagnostics.Debug.dll" + ] + }, + "System.Globalization/4.0.0": { + "sha512": "IBJyTo1y7ZtzzoJUA60T1XPvNTyw/wfFmjFoBFtlYfkekIOtD/AzDDIg0YdUa7eNtFEfliED2R7HdppTdU4t5A==", + "files": [ + "License.rtf", + "System.Globalization.4.0.0.nupkg", + "System.Globalization.4.0.0.nupkg.sha512", + "System.Globalization.nuspec", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Globalization.dll", + "ref/dotnet/System.Globalization.xml", + "ref/dotnet/de/System.Globalization.xml", + "ref/dotnet/es/System.Globalization.xml", + "ref/dotnet/fr/System.Globalization.xml", + "ref/dotnet/it/System.Globalization.xml", + "ref/dotnet/ja/System.Globalization.xml", + "ref/dotnet/ko/System.Globalization.xml", + "ref/dotnet/ru/System.Globalization.xml", + "ref/dotnet/zh-hans/System.Globalization.xml", + "ref/dotnet/zh-hant/System.Globalization.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.Globalization.dll", + "ref/netcore50/System.Globalization.xml", + "ref/netcore50/de/System.Globalization.xml", + "ref/netcore50/es/System.Globalization.xml", + "ref/netcore50/fr/System.Globalization.xml", + "ref/netcore50/it/System.Globalization.xml", + "ref/netcore50/ja/System.Globalization.xml", + "ref/netcore50/ko/System.Globalization.xml", + "ref/netcore50/ru/System.Globalization.xml", + "ref/netcore50/zh-hans/System.Globalization.xml", + "ref/netcore50/zh-hant/System.Globalization.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.IO/4.0.10": { + "serviceable": true, + "sha512": "kghf1CeYT+W2lw8a50/GxFz5HR9t6RkL4BvjxtTp1NxtEFWywnMA9W8FH/KYXiDNThcw9u/GOViDON4iJFGXIQ==", + "files": [ + "System.IO.4.0.10.nupkg", + "System.IO.4.0.10.nupkg.sha512", + "System.IO.nuspec", + "lib/DNXCore50/System.IO.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.IO.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.IO.dll", + "ref/dotnet/System.IO.xml", + "ref/dotnet/de/System.IO.xml", + "ref/dotnet/es/System.IO.xml", + "ref/dotnet/fr/System.IO.xml", + "ref/dotnet/it/System.IO.xml", + "ref/dotnet/ja/System.IO.xml", + "ref/dotnet/ko/System.IO.xml", + "ref/dotnet/ru/System.IO.xml", + "ref/dotnet/zh-hans/System.IO.xml", + "ref/dotnet/zh-hant/System.IO.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.IO.dll" + ] + }, + "System.Linq/4.0.0": { + "serviceable": true, + "sha512": "r6Hlc+ytE6m/9UBr+nNRRdoJEWjoeQiT3L3lXYFDHoXk3VYsRBCDNXrawcexw7KPLaH0zamQLiAb6avhZ50cGg==", + "files": [ + "System.Linq.4.0.0.nupkg", + "System.Linq.4.0.0.nupkg.sha512", + "System.Linq.nuspec", + "lib/dotnet/System.Linq.dll", + "lib/net45/_._", + "lib/netcore50/System.Linq.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Linq.dll", + "ref/dotnet/System.Linq.xml", + "ref/dotnet/de/System.Linq.xml", + "ref/dotnet/es/System.Linq.xml", + "ref/dotnet/fr/System.Linq.xml", + "ref/dotnet/it/System.Linq.xml", + "ref/dotnet/ja/System.Linq.xml", + "ref/dotnet/ko/System.Linq.xml", + "ref/dotnet/ru/System.Linq.xml", + "ref/dotnet/zh-hans/System.Linq.xml", + "ref/dotnet/zh-hant/System.Linq.xml", + "ref/net45/_._", + "ref/netcore50/System.Linq.dll", + "ref/netcore50/System.Linq.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._" + ] + }, + "System.Linq.Expressions/4.0.10": { + "serviceable": true, + "sha512": "qhFkPqRsTfXBaacjQhxwwwUoU7TEtwlBIULj7nG7i4qAkvivil31VvOvDKppCSui5yGw0/325ZeNaMYRvTotXw==", + "files": [ + "runtime.json", + "System.Linq.Expressions.4.0.10.nupkg", + "System.Linq.Expressions.4.0.10.nupkg.sha512", + "System.Linq.Expressions.nuspec", + "lib/DNXCore50/System.Linq.Expressions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Linq.Expressions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Linq.Expressions.dll", + "ref/dotnet/System.Linq.Expressions.xml", + "ref/dotnet/de/System.Linq.Expressions.xml", + "ref/dotnet/es/System.Linq.Expressions.xml", + "ref/dotnet/fr/System.Linq.Expressions.xml", + "ref/dotnet/it/System.Linq.Expressions.xml", + "ref/dotnet/ja/System.Linq.Expressions.xml", + "ref/dotnet/ko/System.Linq.Expressions.xml", + "ref/dotnet/ru/System.Linq.Expressions.xml", + "ref/dotnet/zh-hans/System.Linq.Expressions.xml", + "ref/dotnet/zh-hant/System.Linq.Expressions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Linq.Expressions.dll" + ] + }, + "System.ObjectModel/4.0.0": { + "sha512": "+3j/n+5SlF7PKb0/s5kdord+5RyW3uUscB+0WPuYvfAvEgyx6yPdPXU9tXdDZImRohMuWnQTAG2rFojFPfoGbA==", + "files": [ + "License.rtf", + "System.ObjectModel.4.0.0.nupkg", + "System.ObjectModel.4.0.0.nupkg.sha512", + "System.ObjectModel.nuspec", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net45/_._", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.ObjectModel.dll", + "ref/dotnet/System.ObjectModel.xml", + "ref/dotnet/de/System.ObjectModel.xml", + "ref/dotnet/es/System.ObjectModel.xml", + "ref/dotnet/fr/System.ObjectModel.xml", + "ref/dotnet/it/System.ObjectModel.xml", + "ref/dotnet/ja/System.ObjectModel.xml", + "ref/dotnet/ko/System.ObjectModel.xml", + "ref/dotnet/ru/System.ObjectModel.xml", + "ref/dotnet/zh-hans/System.ObjectModel.xml", + "ref/dotnet/zh-hant/System.ObjectModel.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net45/_._", + "ref/netcore50/System.ObjectModel.dll", + "ref/netcore50/System.ObjectModel.xml", + "ref/netcore50/de/System.ObjectModel.xml", + "ref/netcore50/es/System.ObjectModel.xml", + "ref/netcore50/fr/System.ObjectModel.xml", + "ref/netcore50/it/System.ObjectModel.xml", + "ref/netcore50/ja/System.ObjectModel.xml", + "ref/netcore50/ko/System.ObjectModel.xml", + "ref/netcore50/ru/System.ObjectModel.xml", + "ref/netcore50/zh-hans/System.ObjectModel.xml", + "ref/netcore50/zh-hant/System.ObjectModel.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Private.Uri/4.0.0": { + "serviceable": true, + "sha512": "CtuxaCKcRIvPcsqquVl3mPp79EDZPMr2UogfiFCxCs+t2z1VjbpQsKNs1GHZ8VQetqbk1mr0V1yAfMe6y8CHDA==", + "files": [ + "System.Private.Uri.4.0.0.nupkg", + "System.Private.Uri.4.0.0.nupkg.sha512", + "System.Private.Uri.nuspec", + "lib/DNXCore50/System.Private.Uri.dll", + "lib/netcore50/System.Private.Uri.dll", + "ref/dnxcore50/_._", + "ref/netcore50/_._", + "runtimes/win8-aot/lib/netcore50/System.Private.Uri.dll" + ] + }, + "System.Reflection/4.0.10": { + "sha512": "WZ+4lEE4gqGx6mrqLhSiW4oi6QLPWwdNjzhhTONmhELOrW8Cw9phlO9tltgvRUuQUqYtBiliFwhO5S5fCJElVw==", + "files": [ + "System.Reflection.4.0.10.nupkg", + "System.Reflection.4.0.10.nupkg.sha512", + "System.Reflection.nuspec", + "lib/DNXCore50/System.Reflection.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Reflection.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.dll", + "ref/dotnet/System.Reflection.xml", + "ref/dotnet/de/System.Reflection.xml", + "ref/dotnet/es/System.Reflection.xml", + "ref/dotnet/fr/System.Reflection.xml", + "ref/dotnet/it/System.Reflection.xml", + "ref/dotnet/ja/System.Reflection.xml", + "ref/dotnet/ko/System.Reflection.xml", + "ref/dotnet/ru/System.Reflection.xml", + "ref/dotnet/zh-hans/System.Reflection.xml", + "ref/dotnet/zh-hant/System.Reflection.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.dll" + ] + }, + "System.Reflection.Emit/4.0.0": { + "sha512": "CqnQz5LbNbiSxN10cv3Ehnw3j1UZOBCxnE0OO0q/keGQ5ENjyFM6rIG4gm/i0dX6EjdpYkAgKcI/mhZZCaBq4A==", + "files": [ + "System.Reflection.Emit.4.0.0.nupkg", + "System.Reflection.Emit.4.0.0.nupkg.sha512", + "System.Reflection.Emit.nuspec", + "lib/DNXCore50/System.Reflection.Emit.dll", + "lib/MonoAndroid10/_._", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.dll", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.Emit.dll", + "ref/dotnet/System.Reflection.Emit.xml", + "ref/dotnet/de/System.Reflection.Emit.xml", + "ref/dotnet/es/System.Reflection.Emit.xml", + "ref/dotnet/fr/System.Reflection.Emit.xml", + "ref/dotnet/it/System.Reflection.Emit.xml", + "ref/dotnet/ja/System.Reflection.Emit.xml", + "ref/dotnet/ko/System.Reflection.Emit.xml", + "ref/dotnet/ru/System.Reflection.Emit.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.xml", + "ref/MonoAndroid10/_._", + "ref/net45/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Reflection.Emit.ILGeneration/4.0.0": { + "sha512": "02okuusJ0GZiHZSD2IOLIN41GIn6qOr7i5+86C98BPuhlwWqVABwebiGNvhDiXP1f9a6CxEigC7foQD42klcDg==", + "files": [ + "System.Reflection.Emit.ILGeneration.4.0.0.nupkg", + "System.Reflection.Emit.ILGeneration.4.0.0.nupkg.sha512", + "System.Reflection.Emit.ILGeneration.nuspec", + "lib/DNXCore50/System.Reflection.Emit.ILGeneration.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", + "lib/wp80/_._", + "ref/dotnet/System.Reflection.Emit.ILGeneration.dll", + "ref/dotnet/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/de/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/es/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/fr/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/it/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ja/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ko/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/ru/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.ILGeneration.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.ILGeneration.xml", + "ref/net45/_._", + "ref/wp80/_._" + ] + }, + "System.Reflection.Emit.Lightweight/4.0.0": { + "sha512": "DJZhHiOdkN08xJgsJfDjkuOreLLmMcU8qkEEqEHqyhkPUZMMQs0lE8R+6+68BAFWgcdzxtNu0YmIOtEug8j00w==", + "files": [ + "System.Reflection.Emit.Lightweight.4.0.0.nupkg", + "System.Reflection.Emit.Lightweight.4.0.0.nupkg.sha512", + "System.Reflection.Emit.Lightweight.nuspec", + "lib/DNXCore50/System.Reflection.Emit.Lightweight.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Emit.Lightweight.dll", + "lib/wp80/_._", + "ref/dotnet/System.Reflection.Emit.Lightweight.dll", + "ref/dotnet/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/de/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/es/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/fr/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/it/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ja/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ko/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/ru/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/zh-hans/System.Reflection.Emit.Lightweight.xml", + "ref/dotnet/zh-hant/System.Reflection.Emit.Lightweight.xml", + "ref/net45/_._", + "ref/wp80/_._" + ] + }, + "System.Reflection.Extensions/4.0.0": { + "serviceable": true, + "sha512": "dbYaZWCyFAu1TGYUqR2n+Q+1casSHPR2vVW0WVNkXpZbrd2BXcZ7cpvpu9C98CTHtNmyfMWCLpCclDqly23t6A==", + "files": [ + "System.Reflection.Extensions.4.0.0.nupkg", + "System.Reflection.Extensions.4.0.0.nupkg.sha512", + "System.Reflection.Extensions.nuspec", + "lib/DNXCore50/System.Reflection.Extensions.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Extensions.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Reflection.Extensions.dll", + "ref/dotnet/System.Reflection.Extensions.xml", + "ref/dotnet/de/System.Reflection.Extensions.xml", + "ref/dotnet/es/System.Reflection.Extensions.xml", + "ref/dotnet/fr/System.Reflection.Extensions.xml", + "ref/dotnet/it/System.Reflection.Extensions.xml", + "ref/dotnet/ja/System.Reflection.Extensions.xml", + "ref/dotnet/ko/System.Reflection.Extensions.xml", + "ref/dotnet/ru/System.Reflection.Extensions.xml", + "ref/dotnet/zh-hans/System.Reflection.Extensions.xml", + "ref/dotnet/zh-hant/System.Reflection.Extensions.xml", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Extensions.dll", + "ref/netcore50/System.Reflection.Extensions.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.Extensions.dll" + ] + }, + "System.Reflection.Primitives/4.0.0": { + "serviceable": true, + "sha512": "n9S0XpKv2ruc17FSnaiX6nV47VfHTZ1wLjKZlAirUZCvDQCH71mVp+Ohabn0xXLh5pK2PKp45HCxkqu5Fxn/lA==", + "files": [ + "System.Reflection.Primitives.4.0.0.nupkg", + "System.Reflection.Primitives.4.0.0.nupkg.sha512", + "System.Reflection.Primitives.nuspec", + "lib/DNXCore50/System.Reflection.Primitives.dll", + "lib/net45/_._", + "lib/netcore50/System.Reflection.Primitives.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Reflection.Primitives.dll", + "ref/dotnet/System.Reflection.Primitives.xml", + "ref/dotnet/de/System.Reflection.Primitives.xml", + "ref/dotnet/es/System.Reflection.Primitives.xml", + "ref/dotnet/fr/System.Reflection.Primitives.xml", + "ref/dotnet/it/System.Reflection.Primitives.xml", + "ref/dotnet/ja/System.Reflection.Primitives.xml", + "ref/dotnet/ko/System.Reflection.Primitives.xml", + "ref/dotnet/ru/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hans/System.Reflection.Primitives.xml", + "ref/dotnet/zh-hant/System.Reflection.Primitives.xml", + "ref/net45/_._", + "ref/netcore50/System.Reflection.Primitives.dll", + "ref/netcore50/System.Reflection.Primitives.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.Primitives.dll" + ] + }, + "System.Reflection.TypeExtensions/4.0.0": { + "serviceable": true, + "sha512": "YRM/msNAM86hdxPyXcuZSzmTO0RQFh7YMEPBLTY8cqXvFPYIx2x99bOyPkuU81wRYQem1c1HTkImQ2DjbOBfew==", + "files": [ + "System.Reflection.TypeExtensions.4.0.0.nupkg", + "System.Reflection.TypeExtensions.4.0.0.nupkg.sha512", + "System.Reflection.TypeExtensions.nuspec", + "lib/DNXCore50/System.Reflection.TypeExtensions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/System.Reflection.TypeExtensions.dll", + "lib/netcore50/System.Reflection.TypeExtensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Reflection.TypeExtensions.dll", + "ref/dotnet/System.Reflection.TypeExtensions.xml", + "ref/dotnet/de/System.Reflection.TypeExtensions.xml", + "ref/dotnet/es/System.Reflection.TypeExtensions.xml", + "ref/dotnet/fr/System.Reflection.TypeExtensions.xml", + "ref/dotnet/it/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ja/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ko/System.Reflection.TypeExtensions.xml", + "ref/dotnet/ru/System.Reflection.TypeExtensions.xml", + "ref/dotnet/zh-hans/System.Reflection.TypeExtensions.xml", + "ref/dotnet/zh-hant/System.Reflection.TypeExtensions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/System.Reflection.TypeExtensions.dll", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Reflection.TypeExtensions.dll" + ] + }, + "System.Resources.ResourceManager/4.0.0": { + "serviceable": true, + "sha512": "qmqeZ4BJgjfU+G2JbrZt4Dk1LsMxO4t+f/9HarNY6w8pBgweO6jT+cknUH7c3qIrGvyUqraBhU45Eo6UtA0fAw==", + "files": [ + "System.Resources.ResourceManager.4.0.0.nupkg", + "System.Resources.ResourceManager.4.0.0.nupkg.sha512", + "System.Resources.ResourceManager.nuspec", + "lib/DNXCore50/System.Resources.ResourceManager.dll", + "lib/net45/_._", + "lib/netcore50/System.Resources.ResourceManager.dll", + "lib/win8/_._", + "lib/wp80/_._", + "lib/wpa81/_._", + "ref/dotnet/System.Resources.ResourceManager.dll", + "ref/dotnet/System.Resources.ResourceManager.xml", + "ref/dotnet/de/System.Resources.ResourceManager.xml", + "ref/dotnet/es/System.Resources.ResourceManager.xml", + "ref/dotnet/fr/System.Resources.ResourceManager.xml", + "ref/dotnet/it/System.Resources.ResourceManager.xml", + "ref/dotnet/ja/System.Resources.ResourceManager.xml", + "ref/dotnet/ko/System.Resources.ResourceManager.xml", + "ref/dotnet/ru/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hans/System.Resources.ResourceManager.xml", + "ref/dotnet/zh-hant/System.Resources.ResourceManager.xml", + "ref/net45/_._", + "ref/netcore50/System.Resources.ResourceManager.dll", + "ref/netcore50/System.Resources.ResourceManager.xml", + "ref/win8/_._", + "ref/wp80/_._", + "ref/wpa81/_._", + "runtimes/win8-aot/lib/netcore50/System.Resources.ResourceManager.dll" + ] + }, + "System.Runtime/4.0.20": { + "serviceable": true, + "sha512": "X7N/9Bz7jVPorqdVFO86ns1sX6MlQM+WTxELtx+Z4VG45x9+LKmWH0GRqjgKprUnVuwmfB9EJ9DQng14Z7/zwg==", + "files": [ + "System.Runtime.4.0.20.nupkg", + "System.Runtime.4.0.20.nupkg.sha512", + "System.Runtime.nuspec", + "lib/DNXCore50/System.Runtime.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.dll", + "ref/dotnet/System.Runtime.xml", + "ref/dotnet/de/System.Runtime.xml", + "ref/dotnet/es/System.Runtime.xml", + "ref/dotnet/fr/System.Runtime.xml", + "ref/dotnet/it/System.Runtime.xml", + "ref/dotnet/ja/System.Runtime.xml", + "ref/dotnet/ko/System.Runtime.xml", + "ref/dotnet/ru/System.Runtime.xml", + "ref/dotnet/zh-hans/System.Runtime.xml", + "ref/dotnet/zh-hant/System.Runtime.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.dll" + ] + }, + "System.Runtime.Extensions/4.0.10": { + "serviceable": true, + "sha512": "5dsEwf3Iml7d5OZeT20iyOjT+r+okWpN7xI2v+R4cgd3WSj4DeRPTvPFjDpacbVW4skCAZ8B9hxXJYgkCFKJ1A==", + "files": [ + "System.Runtime.Extensions.4.0.10.nupkg", + "System.Runtime.Extensions.4.0.10.nupkg.sha512", + "System.Runtime.Extensions.nuspec", + "lib/DNXCore50/System.Runtime.Extensions.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Extensions.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Extensions.dll", + "ref/dotnet/System.Runtime.Extensions.xml", + "ref/dotnet/de/System.Runtime.Extensions.xml", + "ref/dotnet/es/System.Runtime.Extensions.xml", + "ref/dotnet/fr/System.Runtime.Extensions.xml", + "ref/dotnet/it/System.Runtime.Extensions.xml", + "ref/dotnet/ja/System.Runtime.Extensions.xml", + "ref/dotnet/ko/System.Runtime.Extensions.xml", + "ref/dotnet/ru/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hans/System.Runtime.Extensions.xml", + "ref/dotnet/zh-hant/System.Runtime.Extensions.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Extensions.dll" + ] + }, + "System.Runtime.Handles/4.0.0": { + "serviceable": true, + "sha512": "638VhpRq63tVcQ6HDb3um3R/J2BtR1Sa96toHo6PcJGPXEPEsleCuqhBgX2gFCz0y0qkutANwW6VPPY5wQu1XQ==", + "files": [ + "System.Runtime.Handles.4.0.0.nupkg", + "System.Runtime.Handles.4.0.0.nupkg.sha512", + "System.Runtime.Handles.nuspec", + "lib/DNXCore50/System.Runtime.Handles.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.Handles.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.Handles.dll", + "ref/dotnet/System.Runtime.Handles.xml", + "ref/dotnet/de/System.Runtime.Handles.xml", + "ref/dotnet/es/System.Runtime.Handles.xml", + "ref/dotnet/fr/System.Runtime.Handles.xml", + "ref/dotnet/it/System.Runtime.Handles.xml", + "ref/dotnet/ja/System.Runtime.Handles.xml", + "ref/dotnet/ko/System.Runtime.Handles.xml", + "ref/dotnet/ru/System.Runtime.Handles.xml", + "ref/dotnet/zh-hans/System.Runtime.Handles.xml", + "ref/dotnet/zh-hant/System.Runtime.Handles.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.Handles.dll" + ] + }, + "System.Runtime.InteropServices/4.0.20": { + "serviceable": true, + "sha512": "ZgDyBYfEnjWoz/viS6VOswA6XOkDSH2DzgbpczbW50RywhnCgTl+w3JEvtAiOGyIh8cyx1NJq80jsNBSUr8Pig==", + "files": [ + "System.Runtime.InteropServices.4.0.20.nupkg", + "System.Runtime.InteropServices.4.0.20.nupkg.sha512", + "System.Runtime.InteropServices.nuspec", + "lib/DNXCore50/System.Runtime.InteropServices.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Runtime.InteropServices.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.InteropServices.dll", + "ref/dotnet/System.Runtime.InteropServices.xml", + "ref/dotnet/de/System.Runtime.InteropServices.xml", + "ref/dotnet/es/System.Runtime.InteropServices.xml", + "ref/dotnet/fr/System.Runtime.InteropServices.xml", + "ref/dotnet/it/System.Runtime.InteropServices.xml", + "ref/dotnet/ja/System.Runtime.InteropServices.xml", + "ref/dotnet/ko/System.Runtime.InteropServices.xml", + "ref/dotnet/ru/System.Runtime.InteropServices.xml", + "ref/dotnet/zh-hans/System.Runtime.InteropServices.xml", + "ref/dotnet/zh-hant/System.Runtime.InteropServices.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Runtime.InteropServices.dll" + ] + }, + "System.Runtime.InteropServices.RuntimeInformation/4.0.0-beta-23213": { + "serviceable": true, + "sha512": "yzVJM7dF6XqnGTkv2IRufKs8AiqDpfdfBvMT5sVgY2fCtUXdkcjxiIWzaVIau8IYrJUlQDmSpeQ8NV6l1vz0Lg==", + "files": [ + "System.Runtime.InteropServices.RuntimeInformation.4.0.0-beta-23213.nupkg", + "System.Runtime.InteropServices.RuntimeInformation.4.0.0-beta-23213.nupkg.sha512", + "System.Runtime.InteropServices.RuntimeInformation.nuspec", + "lib/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Runtime.InteropServices.RuntimeInformation.dll", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._" + ] + }, + "System.Text.Encoding/4.0.10": { + "sha512": "fNlSFgy4OuDlJrP9SFFxMlaLazq6ipv15sU5TiEgg9UCVnA/OgoVUfymFp4AOk1jOkW5SVxWbeeIUptcM+m/Vw==", + "files": [ + "System.Text.Encoding.4.0.10.nupkg", + "System.Text.Encoding.4.0.10.nupkg.sha512", + "System.Text.Encoding.nuspec", + "lib/DNXCore50/System.Text.Encoding.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Text.Encoding.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Text.Encoding.dll", + "ref/dotnet/System.Text.Encoding.xml", + "ref/dotnet/de/System.Text.Encoding.xml", + "ref/dotnet/es/System.Text.Encoding.xml", + "ref/dotnet/fr/System.Text.Encoding.xml", + "ref/dotnet/it/System.Text.Encoding.xml", + "ref/dotnet/ja/System.Text.Encoding.xml", + "ref/dotnet/ko/System.Text.Encoding.xml", + "ref/dotnet/ru/System.Text.Encoding.xml", + "ref/dotnet/zh-hans/System.Text.Encoding.xml", + "ref/dotnet/zh-hant/System.Text.Encoding.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Text.Encoding.dll" + ] + }, + "System.Threading/4.0.10": { + "serviceable": true, + "sha512": "0w6pRxIEE7wuiOJeKabkDgeIKmqf4ER1VNrs6qFwHnooEE78yHwi/bKkg5Jo8/pzGLm0xQJw0nEmPXt1QBAIUA==", + "files": [ + "System.Threading.4.0.10.nupkg", + "System.Threading.4.0.10.nupkg.sha512", + "System.Threading.nuspec", + "lib/DNXCore50/System.Threading.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.dll", + "ref/dotnet/System.Threading.xml", + "ref/dotnet/de/System.Threading.xml", + "ref/dotnet/es/System.Threading.xml", + "ref/dotnet/fr/System.Threading.xml", + "ref/dotnet/it/System.Threading.xml", + "ref/dotnet/ja/System.Threading.xml", + "ref/dotnet/ko/System.Threading.xml", + "ref/dotnet/ru/System.Threading.xml", + "ref/dotnet/zh-hans/System.Threading.xml", + "ref/dotnet/zh-hant/System.Threading.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.dll" + ] + }, + "System.Threading.Tasks/4.0.10": { + "serviceable": true, + "sha512": "NOwJGDfk79jR0bnzosbXLVD/PdI8KzBeESoa3CofEM5v9R5EBfcI0Jyf18stx+0IYV9okmDIDxVtxq9TbnR9bQ==", + "files": [ + "System.Threading.Tasks.4.0.10.nupkg", + "System.Threading.Tasks.4.0.10.nupkg.sha512", + "System.Threading.Tasks.nuspec", + "lib/DNXCore50/System.Threading.Tasks.dll", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net46/_._", + "lib/netcore50/System.Threading.Tasks.dll", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "ref/dotnet/System.Threading.Tasks.dll", + "ref/dotnet/System.Threading.Tasks.xml", + "ref/dotnet/de/System.Threading.Tasks.xml", + "ref/dotnet/es/System.Threading.Tasks.xml", + "ref/dotnet/fr/System.Threading.Tasks.xml", + "ref/dotnet/it/System.Threading.Tasks.xml", + "ref/dotnet/ja/System.Threading.Tasks.xml", + "ref/dotnet/ko/System.Threading.Tasks.xml", + "ref/dotnet/ru/System.Threading.Tasks.xml", + "ref/dotnet/zh-hans/System.Threading.Tasks.xml", + "ref/dotnet/zh-hant/System.Threading.Tasks.xml", + "ref/MonoAndroid10/_._", + "ref/MonoTouch10/_._", + "ref/net46/_._", + "ref/xamarinios10/_._", + "ref/xamarinmac20/_._", + "runtimes/win8-aot/lib/netcore50/System.Threading.Tasks.dll" + ] + }, + "xunit/2.1.0-beta3-build3029": { + "sha512": "NMFXV0ePe/GrfhMSPGAlWmiUZCzjaatpdAGcavf2B6vYTRyMTpyJT01LI6jemMV/VSDXLrtHp0Ov9xZyR1cLLg==", + "files": [ + "xunit.2.1.0-beta3-build3029.nupkg", + "xunit.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.nuspec" + ] + }, + "xunit.abstractions/2.0.0": { + "sha512": "NAdxKQRzuLnCZ0g++x6i87/8rMBpQoRiRlRNLAqfODm2zJPbteHRoSER3DXfxnqrHXyBJT8rFaZ8uveBeQyaMA==", + "files": [ + "xunit.abstractions.2.0.0.nupkg", + "xunit.abstractions.2.0.0.nupkg.sha512", + "xunit.abstractions.nuspec", + "lib/net35/xunit.abstractions.dll", + "lib/net35/xunit.abstractions.xml", + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.dll", + "lib/portable-net45+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.abstractions.xml" + ] + }, + "xunit.assert/2.1.0-beta3-build3029": { + "sha512": "AMS7Fv77DayXVRCBMmVEDwOXPcbxk8dCBA/iACsve+6+UQqopMtNyAynyIcXPFRK/peeitUKID4ChOXWisJmUw==", + "files": [ + "xunit.assert.2.1.0-beta3-build3029.nupkg", + "xunit.assert.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.assert.nuspec", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.pdb", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.assert.xml" + ] + }, + "xunit.core/2.1.0-beta3-build3029": { + "sha512": "uDUBbwZSRx226BMwj6VylzXQPVpEIelNIulT+LxbSEH52y2a4btR9d5ptQmkSVjmJXP5/hGCc4cu1DSCu0pgUA==", + "files": [ + "xunit.core.2.1.0-beta3-build3029.nupkg", + "xunit.core.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.core.nuspec", + "build/monoandroid/xunit.core.props", + "build/monoandroid/xunit.execution.MonoAndroid.dll", + "build/monotouch/xunit.core.props", + "build/monotouch/xunit.execution.MonoTouch.dll", + "build/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.props", + "build/portable-win81+wpa81/xunit.core.props", + "build/portable-win81+wpa81/xunit.core.targets", + "build/portable-win81+wpa81/xunit.execution.universal.dll", + "build/portable-win81+wpa81/xunit.execution.universal.pri", + "build/wp8/xunit.core.props", + "build/wp8/xunit.core.targets", + "build/wp8/xunit.execution.wp8.dll", + "build/Xamarin.iOS/xunit.core.props", + "build/Xamarin.iOS/xunit.execution.iOS-Universal.dll", + "build/_Desktop/xunit.execution.desktop.dll" + ] + }, + "xunit.extensibility.core/2.1.0-beta3-build3029": { + "sha512": "lsPro5U3NLasHI/RwqjKzXiRlh9N0IOlR3cluwXYVtihXbGtySeSnU/Fh5MTcWYxh+MVpoNop5zDD0/A2nrHsA==", + "files": [ + "xunit.extensibility.core.2.1.0-beta3-build3029.nupkg", + "xunit.extensibility.core.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.extensibility.core.nuspec", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.dll.tdnet", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.pdb", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.core.xml", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.runner.tdnet.dll", + "lib/portable-net45+dnxcore50+win+wpa81+wp80+monotouch+monoandroid+Xamarin.iOS/xunit.runner.utility.desktop.dll" + ] + }, + "xunit.extensibility.execution/2.1.0-beta3-build3029": { + "sha512": "WuUYamK4RHrHxihvNuX7NkryMhQrpH1+ziJ/mPIQbm18zevSgre8BwUuVZvmLZa8uVob3xS4dvAah2+HCgLiXg==", + "files": [ + "xunit.extensibility.execution.2.1.0-beta3-build3029.nupkg", + "xunit.extensibility.execution.2.1.0-beta3-build3029.nupkg.sha512", + "xunit.extensibility.execution.nuspec", + "lib/dnx451/xunit.execution.dnx.dll", + "lib/dnx451/xunit.execution.dnx.pdb", + "lib/dnx451/xunit.execution.dnx.xml", + "lib/dnxcore50/xunit.execution.dnx.dll", + "lib/dnxcore50/xunit.execution.dnx.pdb", + "lib/dnxcore50/xunit.execution.dnx.xml", + "lib/monoandroid/xunit.execution.MonoAndroid.dll", + "lib/monoandroid/xunit.execution.MonoAndroid.pdb", + "lib/monoandroid/xunit.execution.MonoAndroid.xml", + "lib/monotouch/xunit.execution.MonoTouch.dll", + "lib/monotouch/xunit.execution.MonoTouch.pdb", + "lib/monotouch/xunit.execution.MonoTouch.xml", + "lib/net45/xunit.execution.desktop.dll", + "lib/net45/xunit.execution.desktop.pdb", + "lib/net45/xunit.execution.desktop.xml", + "lib/portable-wpa81+win81/xunit.execution.universal.dll", + "lib/portable-wpa81+win81/xunit.execution.universal.pdb", + "lib/portable-wpa81+win81/xunit.execution.universal.pri", + "lib/portable-wpa81+win81/xunit.execution.universal.xml", + "lib/wp8/xunit.execution.wp8.dll", + "lib/wp8/xunit.execution.wp8.pdb", + "lib/wp8/xunit.execution.wp8.xml", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.dll", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.pdb", + "lib/Xamarin.iOS/xunit.execution.iOS-Universal.xml" + ] + }, + "xunit.netcore.extensions/1.0.0-prerelease-00079": { + "serviceable": true, + "sha512": "YtqpdxTUJ776HVnP1JwpauW+ZXBNiLhoAFW2aG+hYyQDvZjrriakrMsFy/OA4aSYCCNCIU6de1iaoxtzLIbgqg==", + "files": [ + "xunit.netcore.extensions.1.0.0-prerelease-00079.nupkg", + "xunit.netcore.extensions.1.0.0-prerelease-00079.nupkg.sha512", + "xunit.netcore.extensions.nuspec", + "lib/dotnet/Xunit.NetCore.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "": [ + "System.Linq.Expressions >= 4.0.10", + "System.Reflection.Emit.ILGeneration >= 4.0.0", + "System.Reflection.Emit.Lightweight >= 4.0.0", + "System.Runtime >= 4.0.20", + "xunit >= 2.1.0-beta3-*", + "xunit.netcore.extensions >= 1.0.0-prerelease-*" + ], + "DNXCore,Version=v5.0": [] + } +} \ No newline at end of file From e40d701d012d911419fe0037f0ec3b76a15b489a Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Fri, 21 Aug 2015 07:49:36 -0700 Subject: [PATCH 2/2] Apply code review feedback for System.Composition * Use ReaderWriterLockSlim * Move duplicated code into common folder * Use EmptyArray instead of new T[0] * Fix CLS Compliance error in System.Composition test library (See dotnet/roslyn#4293: CLS Compliance warning CS3016 is reported on non-public members) * Rename SilverlightTraceWriter.cs to DebuggerTraceWriter.cs * Use CommonPath build property to include common files * Remove unnecessary AssemblyInfo.cs files * Remove unused private constant in System.Composition.AttributedModel --- .../Assumes.InternalErrorException.cs | 2 +- .../src/Microsoft/Internal/Assumes.cs | 1 - .../Internal/CommonStrings.Designer.cs | 82 ++++++++++++ .../src/Microsoft/Internal/CommonStrings.resx | 126 ++++++++++++++++++ .../src/Microsoft/Internal/EmptyArray.cs | 18 +++ .../src/Microsoft/Internal/Requires.cs | 2 +- .../src/Properties/AssemblyInfo.cs | 18 --- .../System.Composition.AttributedModel.csproj | 2 +- .../Composition/SharingBoundaryAttribute.cs | 2 - ...tTraceWriter.cs => DebuggerTraceWriter.cs} | 0 .../src/Microsoft/Internal/Lock.cs | 35 ----- .../src/Properties/AssemblyInfo.cs | 18 --- .../src/Strings.resx | 6 - .../src/System.Composition.Convention.csproj | 34 ++++- .../Convention/PartConventionBuilder.cs | 2 +- .../tests/Properties/AssemblyInfo.cs | 18 --- ...System.Composition.Convention.Tests.csproj | 6 +- .../Assumes.InternalErrorException.cs | 23 ---- .../src/Microsoft/Internal/Assumes.cs | 115 ---------------- .../src/Microsoft/Internal/Requires.cs | 20 --- .../src/Microsoft/Internal/ThrowHelper.cs | 7 - .../src/Properties/AssemblyInfo.cs | 18 --- .../src/Properties/Resources.Designer.cs | 13 +- .../src/Properties/Resources.resx | 3 - .../src/System.Composition.Hosting.csproj | 30 ++++- .../Composition/Hosting/CompositionHost.cs | 6 +- .../Hosting/Core/CompositionDependency.cs | 16 +-- .../Hosting/Core/CompositionOperation.cs | 6 +- .../Core/CycleBreakingExportDescriptor.cs | 1 + .../Hosting/Core/DirectExportDescriptor.cs | 4 +- .../Core/ExportDescriptorRegistryUpdate.cs | 2 +- .../Composition/Hosting/Core/UpdateResult.cs | 2 +- .../ExportFactoryExportDescriptorProvider.cs | 5 +- ...oryWithMetadataExportDescriptorProvider.cs | 5 +- .../src/Properties/AssemblyInfo.cs | 18 --- .../src/System.Composition.Runtime.csproj | 1 - .../src/Properties/AssemblyInfo.cs | 18 --- .../src/System.Composition.TypedParts.csproj | 4 +- .../ActivationFeatures/ActivationFeature.cs | 3 +- .../TypedParts/Util/DirectAttributeContext.cs | 3 +- ...ion.Demos.ExtendedCollectionImports.csproj | 4 +- .../Properties/AssemblyInfo.cs | 15 --- ...osoft.Composition.ThroughputHarness.csproj | 4 +- .../perftests/Properties/AssemblyInfo.cs | 19 --- .../perftests/WebBenchmarks.cs | 2 + .../TestLibrary/Properties/AssemblyInfo.cs | 13 -- .../scenarios/TestLibrary/TestClass.cs | 2 + .../scenarios/TestLibrary/TestLibrary.csproj | 2 +- .../tests/Properties/AssemblyInfo.cs | 19 --- .../tests/System.Composition.Tests.csproj | 6 +- 50 files changed, 333 insertions(+), 448 deletions(-) rename src/{System.Composition.Convention => Common}/src/Microsoft/Internal/Assumes.InternalErrorException.cs (92%) rename src/{System.Composition.Convention => Common}/src/Microsoft/Internal/Assumes.cs (99%) create mode 100644 src/Common/src/Microsoft/Internal/CommonStrings.Designer.cs create mode 100644 src/Common/src/Microsoft/Internal/CommonStrings.resx create mode 100644 src/Common/src/Microsoft/Internal/EmptyArray.cs rename src/{System.Composition.Convention => Common}/src/Microsoft/Internal/Requires.cs (92%) delete mode 100644 src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs rename src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/{SilverlightTraceWriter.cs => DebuggerTraceWriter.cs} (100%) delete mode 100644 src/System.Composition.Convention/src/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.InternalErrorException.cs delete mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Assumes.cs delete mode 100644 src/System.Composition.Hosting/src/Microsoft/Internal/Requires.cs delete mode 100644 src/System.Composition.Hosting/src/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition.Runtime/src/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition.TypedParts/src/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition/demos/Microsoft.Composition.Demos.ExtendedCollectionImports/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition/perftests/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition/scenarios/TestLibrary/Properties/AssemblyInfo.cs delete mode 100644 src/System.Composition/tests/Properties/AssemblyInfo.cs diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs b/src/Common/src/Microsoft/Internal/Assumes.InternalErrorException.cs similarity index 92% rename from src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs rename to src/Common/src/Microsoft/Internal/Assumes.InternalErrorException.cs index 31b3da0fe8c5..f1e2cbc3676d 100644 --- a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.InternalErrorException.cs +++ b/src/Common/src/Microsoft/Internal/Assumes.InternalErrorException.cs @@ -15,7 +15,7 @@ internal partial class Assumes private sealed class InternalErrorException : Exception { public InternalErrorException(string message) - : base(string.Format(CultureInfo.CurrentCulture, Strings.InternalExceptionMessage, message)) + : base(string.Format(CultureInfo.CurrentCulture, CommonStrings.Diagnostic_InternalExceptionMessage, message)) { } } diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs b/src/Common/src/Microsoft/Internal/Assumes.cs similarity index 99% rename from src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs rename to src/Common/src/Microsoft/Internal/Assumes.cs index afbb070e8d2a..ec53baf6303c 100644 --- a/src/System.Composition.Convention/src/Microsoft/Internal/Assumes.cs +++ b/src/Common/src/Microsoft/Internal/Assumes.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; -using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; diff --git a/src/Common/src/Microsoft/Internal/CommonStrings.Designer.cs b/src/Common/src/Microsoft/Internal/CommonStrings.Designer.cs new file mode 100644 index 000000000000..38afaaabce38 --- /dev/null +++ b/src/Common/src/Microsoft/Internal/CommonStrings.Designer.cs @@ -0,0 +1,82 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Internal { + using System; + using System.Reflection; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class CommonStrings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal CommonStrings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Internal.CommonStrings", typeof(CommonStrings).GetTypeInfo().Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to '{0}' cannot be an empty string ("").. + /// + internal static string ArgumentException_EmptyString { + get { + return ResourceManager.GetString("ArgumentException_EmptyString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internal error occurred. Additional information: '{0}'.. + /// + internal static string Diagnostic_InternalExceptionMessage { + get { + return ResourceManager.GetString("Diagnostic_InternalExceptionMessage", resourceCulture); + } + } + } +} diff --git a/src/Common/src/Microsoft/Internal/CommonStrings.resx b/src/Common/src/Microsoft/Internal/CommonStrings.resx new file mode 100644 index 000000000000..357d2e238cc6 --- /dev/null +++ b/src/Common/src/Microsoft/Internal/CommonStrings.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + '{0}' cannot be an empty string (""). + + + Internal error occurred. Additional information: '{0}'. + + \ No newline at end of file diff --git a/src/Common/src/Microsoft/Internal/EmptyArray.cs b/src/Common/src/Microsoft/Internal/EmptyArray.cs new file mode 100644 index 000000000000..7ce470d021db --- /dev/null +++ b/src/Common/src/Microsoft/Internal/EmptyArray.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Composition; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Reflection; + +namespace Microsoft.Internal +{ + internal static class EmptyArray + { + public static readonly T[] Value = new T[0]; + } +} diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs b/src/Common/src/Microsoft/Internal/Requires.cs similarity index 92% rename from src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs rename to src/Common/src/Microsoft/Internal/Requires.cs index 02234b7f0377..3858677835af 100644 --- a/src/System.Composition.Convention/src/Microsoft/Internal/Requires.cs +++ b/src/Common/src/Microsoft/Internal/Requires.cs @@ -33,7 +33,7 @@ public static void NotNullOrEmpty(string value, string parameterName) if (value.Length == 0) { - throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.ArgumentException_EmptyString, parameterName), parameterName); + throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, CommonStrings.ArgumentException_EmptyString, parameterName), parameterName); } Contract.EndContractBlock(); } diff --git a/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs b/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs deleted file mode 100644 index db6cbba2c52d..000000000000 --- a/src/System.Composition.AttributedModel/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Resources; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Security; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en")] - -[assembly: ComVisible(false)] -[assembly: SecurityTransparent] diff --git a/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj b/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj index 7a4f0f3c97f4..b8be9189c591 100644 --- a/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj +++ b/src/System.Composition.AttributedModel/src/System.Composition.AttributedModel.csproj @@ -20,7 +20,7 @@ - + diff --git a/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs index 04455b7cb191..605c22bf03c0 100644 --- a/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs +++ b/src/System.Composition.AttributedModel/src/System/Composition/SharingBoundaryAttribute.cs @@ -24,8 +24,6 @@ public sealed class SharingBoundaryAttribute : Attribute { private readonly string[] _sharingBoundaryNames; - private const string SharingBoundaryImportMetadataConstraintName = "SharingBoundaryNames"; - /// /// Construct a for the specified boundary names. /// diff --git a/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs b/src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/DebuggerTraceWriter.cs similarity index 100% rename from src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/SilverlightTraceWriter.cs rename to src/System.Composition.Convention/src/Microsoft/Composition/Diagnostics/DebuggerTraceWriter.cs diff --git a/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs index 584eec84af10..bb1148b39b47 100644 --- a/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs +++ b/src/System.Composition.Convention/src/Microsoft/Internal/Lock.cs @@ -11,7 +11,6 @@ namespace Microsoft.Internal { internal sealed class Lock : IDisposable { -#if FEATURE_SLIMLOCK private readonly ReaderWriterLockSlim _thisLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); private int _isDisposed = 0; public void EnterReadLock() @@ -41,39 +40,5 @@ public void Dispose() _thisLock.Dispose(); } } - -#else - // ReaderWriterLockSlim is not yet implemented on SilverLight - // Satisfies our requirements until it is implemented - private readonly object _thisLock = new object(); - - public Lock() - { - } - - public void EnterReadLock() - { - Monitor.Enter(_thisLock); - } - - public void EnterWriteLock() - { - Monitor.Enter(_thisLock); - } - - public void ExitReadLock() - { - Monitor.Exit(_thisLock); - } - - public void ExitWriteLock() - { - Monitor.Exit(_thisLock); - } - - public void Dispose() - { - } -#endif //FEATURE_SLIMLOCK } } diff --git a/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs b/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs deleted file mode 100644 index db6cbba2c52d..000000000000 --- a/src/System.Composition.Convention/src/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Resources; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Security; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en")] - -[assembly: ComVisible(false)] -[assembly: SecurityTransparent] diff --git a/src/System.Composition.Convention/src/Strings.resx b/src/System.Composition.Convention/src/Strings.resx index 5c1bf1eac188..f8975c38ef0a 100644 --- a/src/System.Composition.Convention/src/Strings.resx +++ b/src/System.Composition.Convention/src/Strings.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - '{0}' cannot be an empty string (""). - The value of argument '{0}' ({1}) is not supported. Allowed values are : '{2}'. @@ -129,9 +126,6 @@ The value of argument '{0}' is not supported. The expression must be a property member expression. - - Internal error occurred. Additional information: '{0}'. - A constructor selection convention that would apply to Type '{0}' has been overridden by attributes applied in the source file or by a prior convention. diff --git a/src/System.Composition.Convention/src/System.Composition.Convention.csproj b/src/System.Composition.Convention/src/System.Composition.Convention.csproj index f6a42f610d8b..2e3114513c41 100644 --- a/src/System.Composition.Convention/src/System.Composition.Convention.csproj +++ b/src/System.Composition.Convention/src/System.Composition.Convention.csproj @@ -6,7 +6,6 @@ {E6592FAD-10B5-4B56-9287-D72DD136992F} Library Properties - System.Composition.Convention System.Composition.Convention v4.5 Profile259 @@ -21,21 +20,35 @@ + + Microsoft\Internal\Assumes.cs + + + Microsoft\Internal\Assumes.InternalErrorException.cs + + + Microsoft\Internal\CommonStrings.Designer.cs + True + True + CommonStrings.resx + + + Microsoft\Internal\EmptyArray.cs + + + Microsoft\Internal\Requires.cs + - + - - - - @@ -46,6 +59,12 @@ + + Microsoft\Internal\CommonStrings.resx + ResXFileCodeGenerator + CommonStrings.Designer.cs + Microsoft.Internal + @@ -56,6 +75,7 @@ + - + \ No newline at end of file diff --git a/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs index 23186a1e8d4f..c73cf82deb39 100644 --- a/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs +++ b/src/System.Composition.Convention/src/System/Composition/Convention/PartConventionBuilder.cs @@ -19,7 +19,7 @@ namespace System.Composition.Convention /// public class PartConventionBuilder { - private readonly Type[] _emptyTypeArray = new Type[0]; + private readonly Type[] _emptyTypeArray = EmptyArray.Value; private static List s_onImportsSatisfiedAttributeList; private readonly static List s_importingConstructorList = new List() { new ImportingConstructorAttribute() }; private readonly static Type s_exportAttributeType = typeof(ExportAttribute); diff --git a/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs b/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 79d944e86638..000000000000 --- a/src/System.Composition.Convention/tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] diff --git a/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj index 24ff86521c55..85f8252b2e9b 100644 --- a/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj +++ b/src/System.Composition.Convention/tests/System.Composition.Convention.Tests.csproj @@ -37,9 +37,6 @@ - - false - @@ -70,6 +67,9 @@ + + +