Azure DevOps上TransientLifetimeManager中的Unity容器验证异常



我们在Azure DevOps上构建的持续集成刚刚开始在运行MSTest单元测试时遇到这个问题。没有更新任何此代码。Unity.Container.dll版本5.11.11.0和5.11.8.0在旧项目上发生。无法在visual studio中本地复制。有什么想法吗??使用.net Framework 4.8测试c#类库。这是TestInitialize:中的代码

var container = new UnityContainer();

初始化方法MyTestClass.ATestInitialize引发异常。System.TypeInitializationException:的类型初始值设定项"Unity.Lifetime.TransientLifetimeManager"引发异常--->System.Security.VerificationException:操作可能会破坏运行时。。

中Unity.Lifetime.TransientLifetimeManager.cctor((处的堆栈跟踪C: \projects\abstracts\src\Lifetime\Managers\TransientLifetimeManager.cs:line26

这是使用运行Windows 2019的Azure Pipelines代理池。

当应用程序代码试图执行当前安全上下文中不允许的操作时,可能会引用System.Security.VerificationException: Operation could destabilize the runtime。尽管你没有更改代码,但它很可能是环境性质的。很可能您的应用程序代码中有某种安全需求,而受测试的对象正在做一些需要在其他机器上不可用的东西的事情。这种情况发生在生成代理上的事实在某种程度上是无关紧要的,因为这个问题可能会发生在没有相同需求的机器上的其他人身上。

例如,CAS策略在您的计算机上被禁用,或者应用程序需要未安装在远程上的证书或签名密钥。可能是应用程序代码正在动态地发出IL指令,而您的应用程序要求对代码进行签名,但不再进行签名。

如果你使用的是微软提供的云托管构建代理,他们也有可能运行更新的安全补丁版本的运行时,而你的机器不会遇到同样的问题。

VerificationException的描述状态:

当安全策略要求代码是类型安全的并且验证过程无法验证代码是类型可靠的时抛出的异常

这里也发布了类似的问题。一些证据表明:

  • 添加一个属性以跳过验证;或
  • 添加或删除AllowPartiallyTrustedCallers属性

问题:很久以前,至少6个月前,我正在修复一个错误,并从Visual studio 的IDE文件夹中删除了一个程序集

发现Unity的问题:突然,我的单元测试开始失败,我正在四处寻找解决方案。(这个问题正是这里提到的,但不是在Azure上,它只是在我的本地机器上(

解决方案:尽管我们更新了VS IDE并没有解决这个问题,但我所要做的就是从我的Visual studio IDE位置Common7/IDE中删除公共和引用程序集文件夹,并删除这些文件夹(进行备份(,然后打开VS安装程序并修复Visual studio。

这解决了我的问题,但有一个例外。

最新更新