我正在为我的项目处理一组常量,我想使用 在源代码级别验证其中一些。为了实现这一点,我正在使用以下代码段将整个解决方案加载到 AppDomain with IsFullyTrusted == true and IsHomogenous == true , i.e. remoting is enabled with x86 platform target 中:

// load workspace, i.e. solution from Visual Studio 
var workspace = Roslyn.Services.Workspace.LoadSolution(solutionFile); 

带有 Roslyn 的 x86 平台的 NCrunch 和 NUnit 测试运行器

但是 同时使用 1.45 或 2.6.2 nunit-console-x86.exe使用平台配置 x86 作为测试运行器,我不断关注 System.Security.SecurityException :
System.Security.SecurityException : Type System.Runtime.Remoting.ObjRef and the types derived from it (such as System.Runtime.Remoting.ObjRef) are not permitted to be deserialized at this security level. 
 
Server stack trace:  
   at System.Runtime.Serialization.FormatterServices.CheckTypeSecurity(Type t, TypeFilterLevel securityLevel) 
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.CheckSecurity(ParseRecord pr) 
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObject(ParseRecord pr) 
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord pr) 
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) 
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum) 
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 
   at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryRequestMessage(String objectUri, Stream inputStream, Boolean bStrictBinding, TypeFilterLevel securityLevel) 
   at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) 
 
Exception rethrown at [0]:  
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
   at Roslyn.Utilities.RemoteServices.Initialize(Int32 clientProcessId) 
   at Roslyn.Utilities.RemoteServices.StartRemoteServicesProcess() 
   at Roslyn.Utilities.RemoteServices.get_Instance() 
   at Roslyn.Utilities.RemoteServices.CreateInstance[T]() 
   at Roslyn.Services.Host.TemporaryStorageServiceFactory.CreateService(IWorkspaceServiceProvider workspaceServices) 
   at Roslyn.Services.Host.WorkspaceServiceProviderFactory.<>c__DisplayClass6.<OnImportsSatisfied>b__1(IWorkspaceServiceProvider wsp) 
   at Roslyn.Services.Host.WorkspaceServiceProvider.ConstructService(Type type) 
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) 
   at Roslyn.Services.Host.WorkspaceServiceProvider.GetService[TWorkspaceService]() 
   at Roslyn.Services.SolutionServices..ctor(IWorkspaceServiceProvider workspaceServices) 
   at Roslyn.Services.Solution..ctor(SolutionId id, String filePath, VersionStamp version, VersionStamp latestProjectVersion, IWorkspaceServiceProvider workspaceServices) 
   at Roslyn.Services.Host.SolutionFactoryServiceFactory.SolutionFactoryService.CreateSolution(SolutionId id) 
   at Roslyn.Services.Host.TrackingWorkspace.CreateNewSolution(ISolutionFactoryService solutionFactory, SolutionId id) 
   at Roslyn.Services.Host.TrackingWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider, Boolean enableBackgroundCompilation, Boolean enableInProgressSolutions) 
   at Roslyn.Services.Host.HostWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider, Boolean enableBackgroundCompilation, Boolean enableInProgressSolutions, Boolean enableFileTracking) 
   at Roslyn.Services.Host.LoadedWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider, IDictionary`2 globalProperties, Boolean enableBackgroundCompilation, Boolean enableFileTracking) 
   at Roslyn.Services.Host.LoadedWorkspace.LoadSolution(String solutionFileName, String configuration, String platform, Boolean enableFileTracking) 
   at Roslyn.Services.Workspace.LoadSolution(String solutionFileName, String configuration, String platform, Boolean enableFileTracking) 

a discussion on NCrunch forum ,但我尝试了以下所有选项都没有成功:
  • 添加 [assembly: AllowPartiallyTrustedCallers]到 AssemblyInfo.cs
  • 添加 [assembly: SecurityRules(SecurityRuleSet.Level1)]到 AssemblyInfo.cs
  • 添加 <NetFx40_LegacySecurityPolicy enabled="true" />到 app.config
  • 以管理员身份运行 VS2012
  • [SecuritySafeCritical] 装饰单元测试和实现
  • 更新 : 新建 AppDomain并提供
  • PermissionState.Unrestricted , SecurityPermissionFlag.AllFlagsDataProtectionPermissionFlags.AllFlags
  • 添加主机证据:SecurityZone.MyComputer , System.Security.Policy.HashSystem.Security.Policy.StrongName
  • 将所有程序集(我的和 Roslyn CTP)添加到 fullTrustAssemblies在创建 AppDomain

  • 更新 #2

    此异常仅在我在 x86 配置下运行测试时发生,在我切换到 x64 平台配置后,一切似乎都正常


    app.config 是否有任何其他属性或配置更改?或 AppDomain这可能有助于在 .NET Framework 远程处理中启用反序列化 System.Runtime.Remoting.ObjRef在 x86 配置下运行时?

    临时解决方案

    仅为单元测试项目切换到 x64 构建配置

    源代码
  • 整条source code is available at github :使用 NCrunch IntrospectionTests.Introspection_SearchForComplexityGt10_ApprovedList 在单元测试之后重现错误运行
  • Discussion at NCrunch forum

  • 附加信息

    我也注意到...
  • Roslyn.Services.dll的大量实例在所有测试完成后卡在后台。
  • NCrunch 缺乏宿主证据:System.Security.Policy.HashSystem.Security.Policy.StrongName带有测试运行程序组件名称
  • MSIL(内部应该是 x64)和 2.6.2 nunit-console.exe测试运行器工作正常,所以看起来像 Roslyn 配置/远程处理/安全配置问题 .
  • 请您参考如下方法:

    它看起来像 在部分信任中执行测试,而 Resharper 在完全信任中运行它们。

    Roslyn 尚未在部分信任方案中进行测试。可能会访问需要完全信任的 API。

    我没有使用过 ncrunch,但也许有一种方法可以将它配置为在完全信任中运行测试?


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!