【发布时间】:2019-07-18 10:07:43
【问题描述】:
我的目标是在 .net 4.x 和 .net 3.5 和 NetFx40_LegacySecurityPolicy 上使用 Microsoft 报告查看器,如 here 所述
完全信任我得到了
Loading this assembly would produce a different grant set from other instances.
当通过signing assemblies 尝试相关权限时:
PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissions.AddPermission(new FileIOPermission(PermissionState.None) { AllFiles = FileIOPermissionAccess.Read });
上面写着Local mode requires full trust.
提到Here共享域:
问题在于某些程序集(最明显的是互操作程序集) 不是特定于域的。他们使用共享域,因此他们可以 在一个进程中只加载一次。您需要确保所有 在这种情况下,域使用完全相同的程序集。或者使用完整的 信任,但它当然有它自己的蠕虫罐头:)
对于共享域,Here 有这样的列表:
...HrWeb、EmployeeServices 等每个子网站都设置为 Internet 服务管理器中的应用程序,您将拥有 在您的 asp.net 进程中跟踪应用程序域 (appdomains)
系统域
共享域
默认域
根
人力资源网
员工服务
财经网
销售网
和here 说:
CLR 可以将任何程序集加载到共享域或 触发程序集加载的域取决于 正在加载程序集的 CLR 实例的配置。
我的第一个问题,什么是“共享域”,它与共享主机有关吗?
This link用图解和论证来解释“共享域”:
当您将程序集加载到您的(默认)AppDomain 中时,您将加载 它仅适用于您当前的 AppDomain。那里定义的类型没有 在任何地方共享。但是有一个例外: mscorlib 始终在所有 AppDomain 之间共享。 mscorlib 程序集被加载到所谓的共享域中。这不是一个真实的 AppDomain 只是一个占位符域,所有程序集都在其中 已加载,可以在 AppDomain 之间共享。加载到的程序集 共享域已加载,因此 AppDomain 中立。组件 加载的 AppDomain 中立有一种特殊行为:
所以我的理解是,共享域位于 appdomain 之上。但是它与共享主机有什么关系呢?是w3wp.exe进程有appdomains和shared domain吗?
另一方面,如果我设置AppDomainSetup.LoaderOptimization 属性,我也会被卡住,因为:
Here,据说LoaderOptimization属性不能为iis改。
但是要验证我都尝试过
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory, LoaderOptimization = LoaderOptimization.SingleDomain };
和
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory, LoaderOptimization = LoaderOptimization.MultiDomain };
但结果总是:
Exception has been thrown by the target of an invocation.|[!] Exception has been thrown by the target of an invocation.
The type initializer for 'Microsoft.Reporting.WebForms.ReportViewer' threw an exception.
Loading this assembly would produce a different grant set from other instances. (Exception from HRESULT: 0x80131401)
第二个问题是:我可以在开发机器中生成报告,但是在测试机器中它会失败,并出现上面的错误消息,并带有完全信任问题。如何在我的开发机器上重现相同的错误?
那么最后我怎样才能在测试机器上正确生成我的报告?是否会导致在同一个域上使用多个应用程序?我需要专门的 iis 域吗?
【问题讨论】:
标签: c# reportviewer appdomain