我的目标是让带有.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中性具有一种特殊行为:
因此,我的理解是,共享域位于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域吗?
答案 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);