Autofac无法';无法解决对TeamCity的依赖

本文关键字:解决 TeamCity 依赖 无法 Autofac | 更新日期: 2023-09-27 17:59:19

我有这样的代码(它是nunit控制台执行的单元测试的一部分):

class MyClass
{
    [DI(Type = typeof(MyClass))]
    public IMyClass MyClassProperty {get;set;}
}

通过反射,我正在扫描这样的类,然后在Autofac:中注册

// Register MyClass as IMyClass
autofacBuilder.RegisterType(diAttribute.Type).As(propertyInfo.PropertyType);

之后,我需要以同样的方式解决这个属性-通过反射:

autofacContainer.Resolve(propertyInfo.PropertyType) // it contains IMyClass

当我在本地启动此代码时,它运行良好。但对TeamCity不起作用。失败并出现错误:

Error: 'Autofac.Core.DependencyResolutionException: An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Common Language Runtime detected an invalid program. (See inner exception for details.) ---> System.InvalidProgramException: Common Language Runtime detected an invalid program.

Autofac无法';无法解决对TeamCity的依赖

StackOverflow上有很多关于此异常的问题。这不是Autofac的问题,而是JIT编译器的问题。在谷歌上快速搜索这个异常会得到很多信息。

  • InvalidProgramException/公共语言运行时检测到无效程序
  • 公共语言运行时检测到无效程序

你甚至可以看到像NewtonSoft.Json这样的项目遇到这个问题。

异常本身意味着"程序包含无效的Microsoft中间语言(MSIL)或元数据;通常这表明生成程序的编译器中存在错误。"

Microsoft有一篇关于解决此问题的知识库文章。每当人们解决了它,就我所见,它总是两个修复之一:

  • 对编译选项的更改。例如,一些运行加密/模糊处理工具的人发现关闭它们有帮助;其他人发现关闭编译器优化可以解决这个问题
  • 确保修补到最新版本。我自己也遇到过其他类似的情况,在我的机器上工作得很好,但在构建服务器上却不行;反之亦然。几乎无一例外的是,这是因为我的机器已经全部修补好了,但构建服务器一直没有修补;或者有人刚刚修补了构建服务器,而我还没有安装修补程序

我建议从补丁开始,因为这通常是最简单的修复方法。使用Windows Update确保您和生成服务器都具有最新的.NET更新。如果这还不能解决问题,请查看上面文章和问题中的一些疑难解答技巧。