7

私は自分のプロジェクトの一連の定数に取り組んでおり、を使用してそれらのいくつかをソース コード レベルで検証したいと考えています。これを実現するために、次のスニペットを使用してソリューション全体をAppDomain とIsFullyTrusted == trueでロードしていますIsHomogenous == true。つまり、リモート処理はx86 プラットフォーム ターゲットで有効なっています。

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

Roslyn を使用した x86 プラットフォームの NCrunch および NUnit のテスト ランナー

しかし、テスト ランナーとしてプラットフォーム構成 x86 で 1.45 または 2.6.2を使用している間、私は常に次のようになりますnunit-console-x86.exeSystem.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)

NCrunch フォーラムで議論がありますが、次のすべてのオプションを試しましたが成功しませんでした:

  • [assembly: AllowPartiallyTrustedCallers]AssemblyInfo.csに追加
  • [assembly: SecurityRules(SecurityRuleSet.Level1)]AssemblyInfo.csに追加
  • <NetFx40_LegacySecurityPolicy enabled="true" />app.configに追加
  • VS2012 を管理者として実行する
  • 単体テストと実装の両方を装飾する[SecuritySafeCritical]
  • 更新:新規作成AppDomainして提供
    • PermissionState.UnrestrictedSecurityPermissionFlag.AllFlagsおよびDataProtectionPermissionFlags.AllFlags
    • ホストエビデンスを追加: SecurityZone.MyComputerSystem.Security.Policy.HashおよびSystem.Security.Policy.StrongName
    • fullTrustAssembliesの作成中にすべてのアセンブリ (私のものと Roslyn CTP の両方) を追加しますAppDomain

アップデート #2

この例外は、x86 構成でテストを実行しているときにのみ発生し、x64 プラットフォーム構成に切り替えた後、すべて正常に動作しているようです

質問

x86 構成での実行中に .NET Framework リモート処理で逆シリアル化を有効にするのに役立つ、app.configまたはへの他の属性または構成の変更はありますか?AppDomainSystem.Runtime.Remoting.ObjRef

一時的な解決策

unittest プロジェクト専用の x64 ビルド構成に切り替える

ソースコード

追加情報

また、気付きます...

  1. Roslyn.Services.dllすべてのテストが完了した後、多くのインスタンスがバックグラウンドでハングします。
  2. NCrunch のホスト証拠の欠如:System.Security.Policy.HashおよびSystem.Security.Policy.StrongNameテスト ランナー アセンブリ名を使用
  3. MSIL (内部は x64 である必要があります) と 2.6.2nunit-console.exeテスト ランナーは正常に動作しているため、Roslyn 構成/リモート処理/セキュリティ構成の問題のようです。
4

2 に答える 2