コード例 #1
0
        private void CheckTarget(CompositionDependency dependency, HashSet <ExportDescriptorPromise> @checked, Stack <CompositionDependency> checking)
        {
            if (dependency.IsError)
            {
                var message = new StringBuilder();
                dependency.DescribeError(message);
                message.AppendLine();
                message.Append(DescribeCompositionStack(dependency, checking));

                var ex = new CompositionFailedException(message.ToString());
                Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
                throw ex;
            }

            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();
        }
コード例 #2
0
        public void Ctor_Message(string message)
        {
            var exception = new CompositionFailedException(message);

            Assert.Equal(message, exception.Message);
            Assert.Null(exception.InnerException);
        }
コード例 #3
0
        public void ExceptionIsSerializable()
        {
            var discovery     = TestUtilities.V2Discovery;
            var catalog       = TestUtilities.EmptyCatalog.AddParts(new[] { discovery.CreatePart(typeof(Tree)) });
            var configuration = CompositionConfiguration.Create(catalog);

            CompositionFailedException exception = null;

            try
            {
                configuration.ThrowOnErrors();
                Assert.True(false, "Expected exception not thrown.");
            }
            catch (CompositionFailedException ex)
            {
                exception = ex;
            }

            var formatter = new BinaryFormatter();
            var ms        = new MemoryStream();

            formatter.Serialize(ms, exception);

            ms.Position = 0;
            var actual = (CompositionFailedException)formatter.Deserialize(ms);

            Assert.Equal(exception.Message, actual.Message);
            Assert.NotNull(actual.Errors);
            Assert.False(actual.Errors.IsEmpty);
            Assert.Equal(1, actual.Errors.Peek().Count);
            Assert.Equal(exception.Errors.Peek().Single().Message, actual.Errors.Peek().Single().Message);
        }
コード例 #4
0
        public void Ctor_Default()
        {
            var exception = new CompositionFailedException();

            Assert.NotEmpty(exception.Message);
            Assert.Null(exception.InnerException);
        }
コード例 #5
0
ファイル: ThrowHelper.cs プロジェクト: traktraktrugui/corefx
        static public CompositionFailedException CompositionException(string message)
        {
            var e = new CompositionFailedException(message);

            LogException(e);
            return(e);
        }
コード例 #6
0
ファイル: ThrowHelper.cs プロジェクト: traktraktrugui/corefx
        static public CompositionFailedException CardinalityMismatch_TooManyExports(string exportKey)
        {
            var e = new CompositionFailedException(string.Format(Resources.CardinalityMismatch_TooManyExports, exportKey));

            LogException(e);
            return(e);
        }
コード例 #7
0
        /// <summary>
        /// Find the broadest lifetime context within all of the specified sharing boundaries.
        /// </summary>
        /// <param name="sharingBoundary">The sharing boundary to find a lifetime context within.</param>
        /// <returns>The broadest lifetime context within all of the specified sharing boundaries.</returns>
        /// <remarks>Currently, the root cannot be a boundary.</remarks>
        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.
            string message = SR.Format(SR.Component_NotCreatableOutsideSharingBoundary, sharingBoundary);
            var    ex      = new CompositionFailedException(message);

            Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
            throw ex;
        }
コード例 #8
0
        public void Ctor_Message_InnerException(string message)
        {
            var innerException = new DivideByZeroException();
            var exception      = new CompositionFailedException(message, innerException);

            Assert.Equal(message, exception.Message);
            Assert.Same(innerException, exception.InnerException);
        }
コード例 #9
0
        private static TValue GetMetadataValue <TValue>(IDictionary <string, object> 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 = SR.Format(SR.MetadataViewProvider_MissingMetadata, name);
            var ex      = new CompositionFailedException(message);

            Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
            throw ex;
        }
コード例 #10
0
        private void CheckDependency(CompositionDependency dependency, HashSet <ExportDescriptorPromise> @checked, Stack <CompositionDependency> 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(SR.ExportDescriptor_UnsupportedCycle, dependency.Target.Origin);
                        message.AppendLine();
                        message.Append(DescribeCompositionStack(dependency, checking));

                        var ex = new CompositionFailedException(message.ToString());
                        Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
                        throw ex;
                    }

                    if (!step.IsPrerequisite)
                    {
                        nonPrereqSeen = true;
                    }
                }
            }

            CheckTarget(dependency, @checked, checking);
        }
コード例 #11
0
        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 <CompositionContract, ExportDescriptor[]>(_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)
            {
                var ex = new CompositionFailedException(SR.Format(SR.CardinalityMismatch_TooManyExports, exportKey.ToString()));
                Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString());
                throw ex;
            }

            defaultForExport = allForExport[0];
            return(true);
        }