【发布时间】:2019-05-30 16:11:54
【问题描述】:
我有一个项目,我在其中使用具有非常受限的 PermissionSet 的 AppDomain。
问题在于,如果 AppDomain 内部发生异常,则 Exception 对象的 StackTrace 属性包含堆栈跟踪中的方法名称,但不包含行号,尽管 PDB 数据已加载进入 AppDomain 中的程序集。
在调试过程中,我发现如果我对我的权限集进行以下更改,那么行号开始出现在堆栈跟踪中:
PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted); // Was PermissionState.None
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
AppDomain newDomain = AppDomain.CreateDomain("Sandbox", null, new AppDomainSetup {......}, permSet);
显然,将权限集设置为不受限制的不利之处在于,在此 AppDomain 中运行的代码现在可以为所欲为,因此尽管这让我可以看到堆栈跟踪中的行号,但这不是一个可接受的解决方案。我认为必须有一个特定的权限需要添加到权限集中 - 但我一生都无法弄清楚这是什么权限。
谁能在这里指出我正确的方向,或者更好的是,告诉我我需要添加什么权限?谢谢!
【问题讨论】:
-
嗯,不确定是否有帮助,但是查看 StackTrace 类的源代码(我希望以相同的方式获得异常中的堆栈跟踪)表明它似乎需要 ReflectionPermission 和非托管代码的成员访问和 SecurityPermission (referencesource.microsoft.com/mscorlib/R/4e7f1f734a435f15.html) 尝试将这些权限添加到您的 PermissionSet 中,看看会发生什么(如果它碰巧起作用,您可能会自行回答您的问题 ;-))
-
恐怕不高兴,但感谢您的回答。我已经单独尝试了每一个,但没有一起尝试,所以我很有希望 - 但只是尝试过,它不起作用。
-
但是...您已将我指向源代码,我现在正在查看 Exception 类的代码:referencesource.microsoft.com/#mscorlib/system/… - 它在那里说它需要 FileIOPermission(PathDiscovery) ,这似乎让我走上了正确的道路。 (我所说的“沿着正确的路线”是指设置所有 FileIOPermissions 有效!但如果我只设置 PathDiscovery 选项,我需要指定一个文件,并且我正在处理它。我的 PDB 是一个字节数组,而不是一个文件。但我现在很接近了,所以谢谢你!)
-
有一个不需要路径的 FileIOPermission 构造函数:docs.microsoft.com/en-us/dotnet/api/…。除非你想限制文件 IO 权限。在这种情况下,可能创建一个单独的(临时)文件夹,其中包含 PDB 文件的副本(来自 PDB 字节数组),并仅授予该路径的文件 IO 权限。 (但不确定这对您的用例是否可行......)
-
所有排序。确实有这样一个构造函数——你不能使用它来设置 PathDiscovery,但是一旦你有了 FileIOPermission 对象,你就可以将 PathDiscover 添加到它的 AllFiles 属性中。但是,我发现当我传递当前正在执行的程序集的路径时,主构造函数起作用了——我不知道为什么,但它起作用了,我没有抱怨。感谢您的帮助!
标签: c#