更新:正如评论中所指出的,下面的代码是指可移植的 pdb。便携式 pdb 与我的情况无关,但对于使用沙盒应用程序域和便携式 pdb 的人来说,这个问题可能仍然很有趣。
我在受限沙箱 (AppDomain) 中运行代码。从这个沙箱中抛出的异常没有附加行号。解除 CAS 限制,会出现行号,所以跟 CAS 有关系。StackFrameHelper.InitializeSourceInfo
似乎负责提供行号。那里有一个条件分支,它针对受限路径执行并在第二个Assert
离子(stacktrace.cs:135)上失败:
// need private reflection below + unmanaged code for the portable PDB access itself
// PERF: these demands are somewhat expensive so do the quick check first. We are aiming for
// ~50k traces/s at 5 frames/trace on decent 2017 era hardware to maintain rough performance
// parity with 4.7 implementation that didn't have Portable PDB support
if (!CodeAccessSecurityEngine.QuickCheckForAllDemands())
{
new ReflectionPermission(ReflectionPermissionFlag.MemberAccess).Assert();
new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
}
这给出了以下异常,但是这在第 205 行被吞没了,并且简单地跳过了加载 pdb:
在可以执行相同类型的另一个修改之前,必须还原堆栈遍历修饰符。
根据文档和另一个问题,每帧只能激活一个断言。所以上面的代码似乎无效,这是mscorlib(4.8)中的编程错误吗?
为了解决这个问题,我必须阻止进入那个分支。我似乎找不到CodeAccessSecurityEngine.QuickCheckForAllDemands
. 它似乎与完全信任有关,但是调用程序集已经完全信任。new PermissionSet(PermissionState.Unrestricted).Assert()
在调用之前断言不受限制的访问 ( )exception.ToString()
也没有任何效果。被配置为沙盒的 AppDomainIsFullyTrusted
返回false
.
如何解决这个可能的错误?