Csharp/C#教程:AppDomain.CurrentDomain.Evidence会引发SerializationException分享


AppDomain.CurrentDomain.Evidence会引发SerializationException

使用ReSharper(8.2.2)和VS 2013运行我的测试用例时出现了一个奇怪的错误。

演示问题的简化测试用例仅包含两行代码:

CallContext.LogicalSetData("mydata", new ActivityStack()); var evidence = AppDomain.CurrentDomain.Evidence; 

其中ActivityStack是可序列化的自定义类型。 当测试用例通过ReSharper运行时,第二行会抛出exception:

 System.Runtime.Serialization.SerializationException was unhandled by user code HResult=-2146233076 Message=Type is not resolved for member 'CSG.Framework.Operations.ActivityStack,CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223'. Source=mscorlib StackTrace: at System.AppDomain.get_Evidence() at System.AppDomain.get_Evidence() at CSG.Framework.Utilities.AppDomainLauncher`1..ctor(String appDomainName) in d:WorkGitFrameworkSrcLibraryFrameworkUtilitiesAppDomainLauncher.cs:line 40 at CSG.Framework.UnitTest.AppDomainLauncherTests.LaunchClassFromCallingAssembly() in d:WorkGitFrameworkSrcLibraryFramework.UnitTestUtilitiesAppDomainLauncherTests.cs:line 52 InnerException: 

即使当前AppDomain在BaseDirectory上看起来具有正确的路径,其中可以找到包含该类型的程序集,CLR似乎仍然使用ReSharper bin路径根据Fusion日志探测程序集。 如果我将程序集复制到ReSharper bin文件夹,问题就会消失,但我不认为这是正确的解决方案。 我试图在当前的AppDomain上订阅AssemblyResolve事件,但是没有调用处理程序。

融合日志:

 *** Assembly Binder Log Entry (1/23/2015 @ 12:28:54 PM) *** The operation failed. Bind result: hr = 0x80070002. The system cannot find the file specified. Assembly manager loaded from: C:WindowsMicrosoft.NETFramework64v4.0.30319clr.dll Running under executable C:Program Files (x86)JetBrainsReSharperv8.2.QiwabicBinJetBrains.ReSharper.TaskRunner.CLR45.x64.exe --- A detailed error log follows. === Pre-bind state information === LOG: DisplayName = CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223 (Fully-specified) LOG: Appbase = file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = JetBrains.ReSharper.TaskRunner.CLR45.x64.exe Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: Using application configuration file: C:Program Files (x86)JetBrainsReSharperv8.2.QiwabicBinJetBrains.ReSharper.TaskRunner.CLR45.x64.exe.Config LOG: Using host configuration file: LOG: Using machine configuration file from C:WindowsMicrosoft.NETFramework64v4.0.30319configmachine.config. LOG: Post-policy reference: CSG.Framework, Version=15.2.0.0, Culture=neutral, PublicKeyToken=e7ab1d859f54b223 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework/CSG.Framework.DLL. LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework.EXE. LOG: Attempting download of new URL file:///C:/Program Files (x86)/JetBrains/ReSharper/v8.2.Qiwabic/Bin/CSG.Framework/CSG.Framework.EXE. LOG: All probing URLs attempted and failed. 

这个linke( https://msdn.microsoft.com/en-us/library/dn458353 ( v= vs.110).aspx)解释了根本原因。

涉及两个应用程序域:默认应用程序域(ReSharper runner)和当前应用程序域(测试用例)。 在当前应用程序域中执行AppDomain.Evidence时:

由于无法在默认应用程序域中解析逻辑调用上下文中的类型(ActivityStack),因此会引发exception。

我有类似的问题。 如果您将订单更改为:

 var evidence = AppDomain.CurrentDomain.Evidence; CallContext.LogicalSetData("mydata", new ActivityStack()); 

它会工作。 在我的项目中,我创建了一个Mocked Principal并在设置步骤分配给Thread.CurrentPrincipal。 当我在AppDomain.Evidence调用之后移动该赋值时(这是NHibernate的自动调用)。 它有效:)希望它有所帮助

上述就是C#学习教程:AppDomain.CurrentDomain.Evidence会引发SerializationException分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/949235.html

(0)
上一篇 2021年11月17日
下一篇 2021年11月17日

精彩推荐