.net Read给出了COMException“;“灾难性故障”;
我有一个实用程序类,其中包含一些与XML模式相关的方法。在没有任何代码更改或对环境进行任何已知更改的情况下,它突然开始系统性地失败 失败的方法是:.net Read给出了COMException“;“灾难性故障”;,.net,debugging,com,.net,Debugging,Com,我有一个实用程序类,其中包含一些与XML模式相关的方法。在没有任何代码更改或对环境进行任何已知更改的情况下,它突然开始系统性地失败 失败的方法是: public static XmlSchema GetSchema(string xsdFileName) { string path = MyConfiguration.XmlSchemaLocation; if (!path.EndsWith(@"\")) { path += @"\"; }
public static XmlSchema GetSchema(string xsdFileName)
{
string path = MyConfiguration.XmlSchemaLocation;
if (!path.EndsWith(@"\"))
{
path += @"\";
}
path += xsdFileName;
return XmlSchema.Read(File.OpenRead(path), null);
}
堆栈跟踪显示XmlSchema.Read在内部试图构造一个解析器对象,它的构造函数试图读取一些配置,这反过来导致一些策略证据被检查,然后它出现了一个带有错误代码的COMException,如果我理解正确,提供的信息仅限于意外错误
例外情况如下:
System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)
at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()
at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)
at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Xml.Schema.Parser..ctor(SchemaType schemaType, XmlNameTable nameTable, SchemaNames schemaNames, ValidationEventHandler eventHandler)
at System.Xml.Schema.XmlSchema.Read(XmlReader reader, ValidationEventHandler validationEventHandler)
at MyProj.Common.XSDValidator.GetSchema(String xsdFileName)
at ...
你知道如何进一步调查吗?是否有人知道是什么原因导致了这种情况的发生(例如,进程正在执行的身份的用户配置文件已损坏)
这是在生产环境中发生的,我真的不知道如何继续找出它的原因,或修复它
如果相关:代码托管在控制台应用程序中。请注意,代码在启动前不久已成功访问配置。(MyConfiguration类是另一个实用程序类,它基本上是一个薄层,封装了一组使用普通System.Configuration.ConfigurationManager类的appSettings键。)
Windows版本:
OS Name: Microsoft® Windows Server® 2008 Datacenter
OS Version: 6.0.6002 Service Pack 2 Build 6002
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Server
OS Build Type: Multiprocessor Free
程序正在通过任务调度器执行。失败的实例在最低权限下运行
我认为带有合理描述的SecurityException会更有意义,但一旦将计划任务配置为作为更私密的进程运行,问题就消失了。FYI:Path.Combine()可能会稍微清理一下代码这是一个环境问题,用于确定程序集存储位置的低级CLR调用失败。倾向于由过度渴望的反恶意软件或网络问题引起。SysInternals的工具是一种发现潜在问题的好方法,比如Process Monitor。您程序的.config文件是触发器,我们看不到它。@HansPassant它不能是配置文件的内容。该程序是从输入目录读取文件并通过Windows任务计划程序运行的批处理程序。有许多不同的输入文件夹以不同的计划处理,其中只有一个以这种方式系统性地失败。类似的不重复: