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