msbuild: MSBuild throws thousands of first-chance exceptions evaluating projects with certain types of property functions

MSBuild is throwing thousands of exceptions opening certain solutions which this makes debugging VS extremely painful and might affect the loading time of these solutions.

Opening Roslyn.sln, MSBuild threw over > 21,000 first chance exceptions with stacks similar to:

MissingMethodException: Attempted to access a missing member.
mscorlib.dll!System.DefaultBinder.BindToMethod(System.Reflection.BindingFlags bindingAttr, System.Reflection.MethodBase[] match, ref object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo cultureInfo, string[] names, out object state)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.Function<Microsoft.Build.Evaluation.ProjectProperty>.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.Function<Microsoft.Build.Evaluation.ProjectProperty>.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertiesLeaveTypedAndEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.Function<Microsoft.Build.Evaluation.ProjectProperty>.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertiesLeaveTypedAndEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.PropertyExpander<Microsoft.Build.Evaluation.ProjectProperty>.ExpandPropertiesLeaveEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider<Microsoft.Build.Evaluation.ProjectProperty> properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem>.ExpandIntoStringLeaveEscaped(string expression, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.EvaluatePropertyElement(Microsoft.Build.Construction.ProjectPropertyElement propertyElement)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.EvaluatePropertyGroupElement(Microsoft.Build.Construction.ProjectPropertyGroupElement propertyGroupElement)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.Evaluate()	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition>.Evaluate(Microsoft.Build.Evaluation.IEvaluatorData<Microsoft.Build.Evaluation.ProjectProperty, Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectMetadata, Microsoft.Build.Evaluation.ProjectItemDefinition> data, Microsoft.Build.Construction.ProjectRootElement root, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings, int maxNodeCount, Microsoft.Build.Collections.PropertyDictionary<Microsoft.Build.Execution.ProjectPropertyInstance> environmentProperties, Microsoft.Build.BackEnd.Logging.ILoggingService loggingService, Microsoft.Build.Evaluation.IItemFactory<Microsoft.Build.Evaluation.ProjectItem, Microsoft.Build.Evaluation.ProjectItem> itemFactory, Microsoft.Build.Evaluation.IToolsetProvider toolsetProvider, Microsoft.Build.Evaluation.ProjectRootElementCache projectRootElementCache, Microsoft.Build.Framework.BuildEventContext buildEventContext, Microsoft.Build.Execution.ProjectInstance projectInstanceIfAnyForDebuggerOnly, Microsoft.Build.BackEnd.SdkResolution sdkResolution)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Reevaluate(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Initialize(System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Project(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings)	Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Project(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary<string, string> globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings)	Unknown
InvalidCastException: Invalid cast from 'System.String' to 'System.Int32[]'
Microsoft.Build.dll!Function`1.CoerceArguments(object[] args = {unknown}, System.Reflection.ParameterInfo[] parameters = {unknown})	C#
Microsoft.Build.dll!Function`1.LateBindExecute(System.Exception ex = {unknown}, System.Reflection.BindingFlags bindingFlags = {unknown}, object objectInstance = {unknown}, object[] args = {unknown}, bool isConstructor = {unknown})	C#
Microsoft.Build.dll!Function`1.Execute(object objectInstance = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown})	C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertyBody(string propertyBody = {unknown}, object propertyValue = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown})	C#
Microsoft.Build.dll!Function`1.Execute(object objectInstance = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown})	C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertyBody(string propertyBody = {unknown}, object propertyValue = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown})	C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertiesLeaveTypedAndEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown})	C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertiesLeaveEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander`2.ExpandIntoStringLeaveEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluatePropertyElement(Microsoft.Build.Construction.ProjectPropertyElement propertyElement = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluatePropertyGroupElement(Microsoft.Build.Construction.ProjectPropertyGroupElement propertyGroupElement = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.Evaluate()	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.Evaluate(Microsoft.Build.Evaluation.IEvaluatorData data = {unknown}, Microsoft.Build.Construction.ProjectRootElement root = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}, int maxNodeCount = {unknown}, Microsoft.Build.Collections.PropertyDictionary<Microsoft.Build.Execution.ProjectPropertyInstance> environmentProperties = {unknown}, Microsoft.Build.BackEnd.Logging.ILoggingService loggingService = {unknown}, Microsoft.Build.Evaluation.IItemFactory itemFactory = {unknown}, Microsoft.Build.Evaluation.IToolsetProvider toolsetProvider = {unknown}, Microsoft.Build.Evaluation.ProjectRootElementCache projectRootElementCache = {unknown}, Microsoft.Build.Framework.BuildEventContext buildEventContext = {unknown}, Microsoft.Build.Execution.ProjectInstance projectInstanceIfAnyForDebuggerOnly = {unknown}, Microsoft.Build.BackEnd.SdkResolution sdkResolution = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Reevaluate(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Initialize(System.Collections.Generic.IDictionary<string,string> globalProperties = {unknown}, string toolsVersion = {unknown}, string subToolsetVersion = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project..ctor(Microsoft.Build.Construction.ProjectRootElement xml = {unknown}, System.Collections.Generic.IDictionary<string,string> globalProperties = {unknown}, string toolsVersion = {unknown}, string subToolsetVersion = {unknown}, Microsoft.Build.Evaluation.ProjectCollection projectCollection = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown})	C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project..ctor(Microsoft.Build.Construction.ProjectRootElement xml = {unknown}, System.Collections.Generic.IDictionary<string,string> globalProperties = {unknown}, string toolsVersion = {unknown}, Microsoft.Build.Evaluation.ProjectCollection projectCollection = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown})	C#

The following shows the timeline of loading the Roslyn solution:

image

Almost all of thrown exceptions above originate from and get handled in MSBuild.

The expressions that seem be causing these exceptions live in https://github.com/dotnet/roslyn/blob/master/build/Targets/Versions.props:

    <BuildNumberFiveDigitDateStamp>$([MSBuild]::Subtract($(BuildNumber.Split('.')[0].Substring(3).Trim()), 8800))</BuildNumberFiveDigitDateStamp>
    <BuildNumberBuildOfTheDayPadded>$(BuildNumber.Split('.')[1].PadLeft(2,'0'))</BuildNumberBuildOfTheDayPadded>**

Can we please implement a way to avoid these exceptional paths?

About this issue

  • Original URL
  • State: open
  • Created 7 years ago
  • Reactions: 4
  • Comments: 18 (14 by maintainers)

Most upvoted comments

I took a stab at a tactical fix that gets most common exceptions out of the way: https://github.com/Microsoft/msbuild/pull/2833

From my initial testing this completely removes first-chance exceptions when evaluating Roslyn and several other large codebases. It’s super simple to add more methods here as we encounter them. We can take this fix as a stopgap while we wait for a proper solution. It removes the pain and shows ~30x perf improvement compared to binding with exceptions (~1.5ms vs. ~0.05 ms).