Multithreading 加载MsBuild项目文件时出现无效的静态方法调用语法异常

Multithreading 加载MsBuild项目文件时出现无效的静态方法调用语法异常,multithreading,msbuild,msbuild-4.0,Multithreading,Msbuild,Msbuild 4.0,我为MsBuild创建了合并解决方案任务。它用于将多个解决方案合并到一个解决方案文件中。我使用PLINQ来并行解析和处理所有解决方案。我正在使用 我的DisposableProject类访问每个解决方案中的项目文件,以获取一些特定于项目的值。创建DisposableProject类是为了修复争用条件问题,因为一些项目文件包含在多个解决方案中,还用于修复合并过程中的巨大内存消耗 // ///将一次性功能添加到Microsof.Build.BuildEngine.Project类。 ///每个项目文

我为MsBuild创建了合并解决方案任务。它用于将多个解决方案合并到一个解决方案文件中。我使用PLINQ来并行解析和处理所有解决方案。我正在使用 我的DisposableProject类访问每个解决方案中的项目文件,以获取一些特定于项目的值。创建DisposableProject类是为了修复争用条件问题,因为一些项目文件包含在多个解决方案中,还用于修复合并过程中的巨大内存消耗

//
///将一次性功能添加到Microsof.Build.BuildEngine.Project类。
///每个项目文件在处理过程中都会被锁定,以消除巨大的内存消耗和竞争条件问题。
///从生成引擎中卸载项目文件以节省内存。
/// 
公共类可处置项目:项目,IDisposable
{
//构建引擎-真的需要它吗?
私有静态引擎buildEngine=新引擎();
//用于创建线程安全互斥体的事件
静态自动恢复事件加载事件=新自动恢复事件(true);
//项目文件名
私有字符串文件名{get;set;}
//具有互斥体名称的字典-互斥体
静态ConcurrentDictionary mutexLocks=新ConcurrentDictionary();
/// 
///DisposableProject构造函数。加载项目文件并创建名为Mutex的互斥锁,以按文件名锁定文件。
/// 
///MsBuild项目文件名
公共可处置项目(字符串projectFileName)
:base(buildEngine)
{
//使用文件名作为互斥体名称
FileName=GetMutexName(projectFileName);
//在处理过程中锁定文件
//锁定互斥体创建,因为多个线程可以创建重复的互斥体,从而导致同步异常
loadingEvent.WaitOne();
//检查互斥对象是否已存在
如果(!mutexLocks.ContainsKey(文件名))
mutexLocks[FileName]=新的互斥(false,FileName);
//解锁互斥创建
loadingEvent.Set();
//等待文件
mutexLocks[FileName].WaitOne();
//加载项目文件
this.Load(projectFileName,ProjectLoadSettings.ignoremissinginimports);
}
/// 
///从内存中卸载MsBuild项目文件并释放互斥锁(文件锁)。
/// 
公共空间处置()
{
//从生成引擎卸载以节省内存
this.ParentEngine.UnloadProject(this);
//解锁文件
互斥锁[FileName]。释放互斥锁();
}
/// 
///从文件名创建互斥体名称。
/// 
///文件名
///互斥体名称
私有字符串GetMutexName(字符串路径名)
{
//用下划线替换目录分隔符字符
返回pathName.Replace(Path.directoryseportorchar,'.'');
}
}
有时,在加载第一个项目文件期间,我的MergeSolutions任务失败,出现以下异常:

InvalidProjectFileException: Invalid static method invocation syntax: "$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries($(TargetFrameworkIdentifier), $(TargetFrameworkVersion), $(TargetFrameworkProfile)))". Static method invocation should be of the form: $([FullTypeName]::Method()), e.g. $([System.IO.Path]::Combine(`a`, `b`))\r
 at Microsoft.Build.BuildEngine.Shared.ProjectErrorUtilities.VerifyThrowInvalidProject(Boolean condition, String errorSubCategoryResourceName, XmlNode xmlNode, String resourceName, Object arg0)\r
 at Microsoft.Build.BuildEngine.Expander.Function.ExtractPropertyFunction(String expressionFunction, Object propertyValue)\r
 at Microsoft.Build.BuildEngine.Expander.ExpandPropertyBody(String propertyBody, Object propertyValue, BuildPropertyGroup properties, ExpanderOptions options)\r
 at Microsoft.Build.BuildEngine.Expander.ExpandPropertiesLeaveTypedAndEscaped(String expression, XmlNode expressionNode)\r
 at Microsoft.Build.BuildEngine.Expander.ExpandAllIntoStringLeaveEscaped(String expression, XmlNode expressionNode)\r
 at Microsoft.Build.BuildEngine.BuildPropertyGroup.Evaluate(BuildPropertyGroup evaluatedPropertyBag, Hashtable conditionedPropertiesTable, ProcessingPass pass)\r
 at Microsoft.Build.BuildEngine.Project.ProcessProjectChildren(XmlElement projectElement, String projectDirectoryLocation, Boolean importedProject)\r
 at Microsoft.Build.BuildEngine.Project.ProcessImportElement(XmlElement importElement, String projectDirectoryLocation, Boolean importedProject)\r
 at Microsoft.Build.BuildEngine.Project.ProcessProjectChildren(XmlElement projectElement, String projectDirectoryLocation, Boolean importedProject)\r
 at Microsoft.Build.BuildEngine.Project.ProcessImportElement(XmlElement importElement, String projectDirectoryLocation, Boolean importedProject)\r
 at Microsoft.Build.BuildEngine.Project.ProcessProjectChildren(XmlElement projectElement, String projectDirectoryLocation, Boolean importedProject)\r
 at Microsoft.Build.BuildEngine.Project.ProcessMainProjectElement()\r
 at Microsoft.Build.BuildEngine.Project.InternalLoadFromXmlDocument(XmlDocument projectXml, ProjectLoadSettings projectLoadSettings)\r
 at Microsoft.Build.BuildEngine.Project.Load(String projectFileName, BuildEventContext buildEventContext, ProjectLoadSettings projectLoadSettings)\r
 at XXX.Build.Common.Types.DisposableProject..ctor(String projectFileName) in D:\XXX\DisposableProject.cs:line 35\r
MergeSolution任务总是在合并过程开始时抛出此异常,并且它只是偶尔发生。我想这是构建引擎初始化的问题。BuildEngine构造函数可能不是线程安全的。我正在使用默认的MSBuild构造函数。
有什么办法可以解决吗?

如何更改代码块内容,以便在DisposableProject类代码段上突出显示C#文件?