【问题标题】:Shared domain for app domain while trying to run microsoft reportviwer in legacy mode尝试在旧模式下运行 microsoft reportviewer 时应用程序域的共享域
【发布时间】: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


    【解决方案1】:

    我希望我为更多读者详细记录了我的问题。

    我找到了答案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);
    

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2011-09-11
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多