私は自分のプロジェクトの一連の定数に取り組んでおり、roslynを使用してそれらのいくつかをソース コード レベルで検証したいと考えています。これを実現するために、次のスニペットを使用してソリューション全体を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 でncrunch 1.45 またはnunit 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.Unrestricted、SecurityPermissionFlag.AllFlagsおよびDataProtectionPermissionFlags.AllFlagsホストエビデンスを追加:SecurityZone.MyComputer、System.Security.Policy.HashおよびSystem.Security.Policy.StrongNamefullTrustAssembliesの作成中にすべてのアセンブリ (私のものと Roslyn CTP の両方) を追加しますAppDomain
アップデート #2
この例外は、x86 構成でテストを実行しているときにのみ発生し、x64 プラットフォーム構成に切り替えた後、すべて正常に動作しているようです
質問
x86 構成での実行中に .NET Framework リモート処理で逆シリアル化を有効にするのに役立つ、app.configまたはへの他の属性または構成の変更はありますか?AppDomainSystem.Runtime.Remoting.ObjRef
一時的な解決策
unittest プロジェクト専用の x64 ビルド構成に切り替える
ソースコード
- ソースコード全体は github で入手できます: エラーを再現するには、NCrunch を使用して unittest を実行します
IntrospectionTests.Introspection_SearchForComplexityGt10_ApprovedList - NCrunch フォーラムでのディスカッション
追加情報
また、気付きます...