尝试以旧版模式运行Microsoft reportviwer时,应用程序域的共享域

时间:2019-07-18 10:07:43

标签: c# reportviewer appdomain

我的目标是让带有.net 3.5的.net 4.x上具有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等都设置为   互联网服务管理器中的一个应用程序,您将拥有   asp.net进程中的以下应用程序域(appdomains)

     

系统域
  共享域
  默认域
  根
  HrWeb
  员工服务
  FinanceWeb
  SalesWeb

here说:

  

CLR可以将任何程序集加载到共享域或   触发程序集负载的域取决于   加载程序集的CLR实例的配置。

我的第一个问题是“共享域”,它与共享托管有关吗?

This link通过带有争议的插图来说明“共享域”:

  

将程序集加载到(默认)AppDomain中时,将加载   仅适用于您当前的AppDomain。那里定义的类型没有   在任何地方共享。但是有一个例外:在中定义的类型   mscorlib始终在所有AppDomain之间共享。 mscorlib   程序集被加载到所谓的共享域中。这不是真实的   AppDomain,只是所有程序集所在的占位符域   已加载,可以在AppDomain之间共享。装配体装入   共享域已加载,因此AppDomain是中立的。装配体   加载的AppDomain中性具有一种特殊行为:

enter image description here

因此,我的理解是,共享域位于appdomain之上。但是,它与共享主机有什么关系? w3wp.exe进程是否具有appdomains和共享域?

另一方面,如果我玩AppDomainSetup.LoaderOptimization属性,也会因为以下原因而受困:

Here,据说iis不能更改LoaderOptimization属性

但是要验证我都尝试过

        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域吗?

1 个答案:

答案 0 :(得分:0)

我希望我能很好地记录我的问题,以供更多读者阅读。

我找到了答案here

AppDomain cad = AppDomain.CurrentDomain;
AppDomainSetup cads = cad.SetupInformation;
var setup = new AppDomainSetup
{
    ApplicationName = cads.ApplicationName,
    ApplicationBase = cads.ApplicationBase,
    DynamicBase = cads.DynamicBase,
    CachePath = cads.CachePath,
    PrivateBinPath = cads.PrivateBinPath,
    ShadowCopyDirectories = cads.ShadowCopyDirectories,
    ShadowCopyFiles = cads.ShadowCopyFiles,
    ApplicationTrust = cads.ApplicationTrust,
    LoaderOptimization = LoaderOptimization.SingleDomain
};
setup.SetCompatibilitySwitches(new[] { "NetFx40_LegacySecurityPolicy" });
AppDomain _casPolicyEnabledDomain = AppDomain.CreateDomain("Dummy", cad.Evidence,setup
);

在回答之前,我一直缺少which would inherit all setup properties from the current one but LoaderOptimization。那意味着我只是在做:

AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory, LoaderOptimization = LoaderOptimization.SingleDomain }; 
AppDomain _casPolicyEnabledDomain = AppDomain.CreateDomain("Full Trust", null, setup);