Azure DevOps 上的 TransientLifetimeManager 中的 Unity Container VerificationException

Unity Container VerificationException in TransientLifetimeManager on Azure DevOps

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

var container = new UnityContainer();

Initialization method MyTestClass.ATestInitialize threw exception. System.TypeInitializationException: The type initializer for 'Unity.Lifetime.TransientLifetimeManager' threw an exception. ---> System.Security.VerificationException: Operation could destabilize the runtime..

Stack trace at Unity.Lifetime.TransientLifetimeManager..cctor() in C:\projects\abstractions\src\Lifetime\Managers\TransientLifetimeManager.cs:line 26

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

当应用程序代码尝试执行某些 isn't allowed under the current security context 时,可能会出现对 System.Security.VerificationException: Operation could destabilize the runtime 的引用。尽管您没有更改代码,但它本质上可能是环境问题。您的应用程序代码中很可能有某种安全需求,而被测对象正在做一些需要在其他机器上不可用的事情。这发生在构建代理上的事实有点无关紧要,因为没有相同需求的机器上的其他人可能会发生此问题。

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

如果您使用的是 Microsoft 提供的云托管构建代理,它们也可能是 运行 运行时的较新安全补丁版本,您的机器不会遇到同样的问题。

VerificationException 的描述指出:

The exception that is thrown when the security policy requires code to be type safe and the verification process is unable to verify that the code is type safe

有一个similar question posted here。一些证据表明:

  • Adding an attribute to skip validation;或
  • Adding or removing the AllowPartiallyTrustedCallers attribute