我正在为我的项目处理一组常量,我想使用 roslyn在源代码级别验证其中一些。为了实现这一点,我正在使用以下代码段将整个解决方案加载到 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 测试运行器
但是 同时使用 ncrunch 1.45 或 nunit 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 [SecuritySafeCritical]
装饰单元测试和实现AppDomain
并提供PermissionState.Unrestricted
, SecurityPermissionFlag.AllFlags
和 DataProtectionPermissionFlags.AllFlags
SecurityZone.MyComputer
, System.Security.Policy.Hash
和 System.Security.Policy.StrongName
fullTrustAssemblies
在创建 AppDomain
时更新 #2
此异常仅在我在 x86 配置下运行测试时发生,在我切换到 x64 平台配置后,一切似乎都正常
题
app.config
是否有任何其他属性或配置更改?或
AppDomain
这可能有助于在 .NET Framework 远程处理中启用反序列化
System.Runtime.Remoting.ObjRef
在 x86 配置下运行时?
临时解决方案
仅为单元测试项目切换到 x64 构建配置
源代码
IntrospectionTests.Introspection_SearchForComplexityGt10_ApprovedList
在单元测试之后重现错误运行附加信息
我也注意到...
Roslyn.Services.dll
的大量实例在所有测试完成后卡在后台。 System.Security.Policy.Hash
和 System.Security.Policy.StrongName
带有测试运行程序组件名称 nunit-console.exe
测试运行器工作正常,所以看起来像 Roslyn 配置/远程处理/安全配置问题 . 请您参考如下方法:
它看起来像 ncrunch在部分信任中执行测试,而 Resharper 在完全信任中运行它们。
Roslyn 尚未在部分信任方案中进行测试。可能会访问需要完全信任的 API。
我没有使用过 ncrunch,但也许有一种方法可以将它配置为在完全信任中运行测试?