Visual Studio 2019中C#控制台应用调试异常:未设断点时报错,设断点则正常运行
针对非调试模式下AD查找抛出E_UNEXPECTED异常的解决方案
这种调试正常、非调试就报错的问题确实挺棘手的,从你给出的代码和异常堆栈来看,大概率和JIT优化时序、AD资源初始化节奏或者配置加载权限有关,以下是几个可以尝试的解决方向:
1. 先禁用JIT优化快速验证
调试模式下VS会自动关闭JIT优化,而非调试模式默认开启,某些情况下优化会打乱代码执行的时序,触发这类底层COM异常。你可以先通过以下方式验证:
- 右键项目 → 属性 → 生成 → 取消勾选「优化代码」(针对Release模式)
- 或者在报错的方法上添加特性强制禁用优化:
using System.Runtime.CompilerServices; [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] public void SynchADS<List<YourModelType>> mitarbeiter) { // 你的原有代码逻辑 PrincipalContext pc = SomeDllClass.GetADContext(); UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, myClass.SID); }
2. 给AD操作加重试机制
非调试模式下代码执行速度更快,可能AD上下文还没完全初始化完成就执行了查找操作,导致底层调用失败。可以加个简单的重试逻辑:
int maxRetry = 3; UserPrincipal adUser = null; while (maxRetry > 0) { try { using (PrincipalContext pc = SomeDllClass.GetADContext()) { adUser = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, myClass.SID); break; } } catch (PrincipalOperationException ex) { maxRetry--; if (maxRetry == 0) throw; System.Threading.Thread.Sleep(200); // 等待200ms后重试 } }
3. 检查配置文件加载问题
从异常堆栈能看到错误起源于System.Configuration.ClientConfigPaths.GetEvidenceInfo,说明非调试模式下配置文件的加载可能存在权限或路径问题:
- 确认非调试运行时,程序目录下的
App.config(或生成后的你的程序名.exe.config)存在且可读取 - 如果程序运行目录和配置文件路径不一致,尝试手动指定配置路径:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"D:\Git\IMSMitarbeiterSynch\IMSMitarbeiterSynch\IMSMitarbeiterSynch\App.config");
4. 显式释放AD上下文资源
虽然GetADContext没有修改,但可能底层的AD连接缓存导致了非调试下的异常,试试用using语句确保上下文被及时释放:
using (PrincipalContext pc = SomeDllClass.GetADContext()) { using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, myClass.SID)) { // 处理adUser的逻辑 } }
补充:完整异常信息参考
System.DirectoryServices.AccountManagement.PrincipalOperationException: 严重错误 (HRESULT异常: 0x8000FFFF (E_UNEXPECTED)) ---> System.Runtime.InteropServices.COMException: 严重错误 (HRESULT异常: 0x8000FFFF (E_UNEXPECTED)) bei System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl) bei System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence() bei System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType) bei System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType) bei System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate) bei System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type) bei System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed) bei System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType) bei System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate) bei System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type) bei System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext() bei System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext() bei System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName) bei System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath) bei System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig) bei System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig) bei System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record) bei System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) bei System.Configuration.BaseConfigurationRecord.GetSection(String configKey) bei System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName) bei System.Configuration.ConfigurationManager.GetSection(String sectionName) bei System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName) bei System.DirectoryServices.SearchResultCollection.ResultsEnumerator..ctor(SearchResultCollection results, String parentUserName, String parentPassword, AuthenticationTypes parentAuthenticationType) bei System.DirectoryServices.SearchResultCollection.get_InnerList() bei System.DirectoryServices.SearchResultCollection.get_Count() bei System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRefHelper(Type principalType, String urnScheme, String urnValue, DateTime referenceDate, Boolean useSidHistory) --- 内部异常堆栈跟踪结束 --- bei System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRefHelper(Type principalType, String urnScheme, String urnValue, DateTime referenceDate, Boolean useSidHistory) bei System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRef(Type principalType, String urnScheme, String urnValue, DateTime referenceDate) bei System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) bei System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) bei System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) bei IMSTools.Base.IMSStd.GetUserPrincipal(PrincipalContext context, IdentityType type, String value) bei IMSMitarbeiterSynch.Program.SynchADS(List`1 mitarbeiter) in D:\Git\IMSMitarbeiterSynch\IMSMitarbeiterSynch\IMSMitarbeiterSynch\Program.cs:Zeile 240. bei IMSMitarbeiterSynch.Program.SynchronizeData() in D:\Git\IMSMitarbeiterSynch\IMSMitarbeiterSynch\IMSMitarbeiterSynch\Program.cs:Zeile 88. bei IMSMitarbeiterSynch.Program.Main(String[] args) in D:\Git\IMSMitarbeiterSynch\IMSMitarbeiterSynch\IMSMitarbeiterSynch\Program.cs:Zeile 53.
内容的提问来源于stack exchange,提问作者Rico
相关产品推荐
相关产品推荐

