gpt4 book ai didi

c# - AppDomain.CurrentDomain.Evidence 抛出 SerializationException

转载 作者:太空狗 更新时间:2023-10-30 00:24:12 28 4
gpt4 key购买 nike

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

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

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

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

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:\Work\Git\Framework\Src\Library\Framework\Utilities\AppDomainLauncher.cs:line 40
at CSG.Framework.UnitTest.AppDomainLauncherTests.LaunchClassFromCallingAssembly() in d:\Work\Git\Framework\Src\Library\Framework.UnitTest\Utilities\AppDomainLauncherTests.cs:line 52
InnerException:

即使当前 AppDomain 似乎在 BaseDirectory 上具有正确的路径,可以在其中找到包含该类型的程序集,但根据 Fusion 日志,CLR 似乎仍在使用 ReSharper bin 路径来探测程序集。如果我将程序集复制到 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:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable C:\Program Files (x86)\JetBrains\ReSharper\v8.2.Qiwabic\Bin\JetBrains.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)\JetBrains\ReSharper\v8.2.Qiwabic\Bin\JetBrains.ReSharper.TaskRunner.CLR45.x64.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.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.

最佳答案

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

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

  • 它寻找当前应用域的证据。
  • 它尝试计算当前应用域的证据基于当前域。
  • 为当前域获取证据的调用触发了从当前app域到default的跨app域调用应用域。
  • 作为 .NET Framework 中跨应用域契约的一部分,逻辑调用上下文的内容也必须被编码应用域边界。

由于逻辑调用上下文中的类型(ActivityStack)无法在默认应用域中解析,因此抛出异常。

关于c# - AppDomain.CurrentDomain.Evidence 抛出 SerializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116552/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com