0

我有一个这样的代码(它是由 nunit-console 执行的单元测试的一部分):

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.
4

1 回答 1

1

StackOverflow 上有很多关于这个异常的问题。这不是 Autofac 问题,而是 JIT 编译器问题。对异常的快速谷歌搜索会产生大量信息。

您甚至会看到像 NewtonSoft.Json 这样的项目遇到了问题

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

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

  • 对编译选项的更改。例如,一些运行加密/混淆工具的人发现关闭它们会有所帮助;其他人发现关闭编译器优化可以修复它。(知识库文章有一些提示。)
  • 确保将内容修补到最新版本。我自己也遇到过其他类似的情况,在我的机器上运行良好,但在构建服务器上却不行。或相反亦然。几乎总是因为我的机器都打好了补丁,但是构建服务器一直没有打补丁;或者有人刚刚修补了构建服务器,而我还没有安装我的补丁。

我建议从补丁开始,因为这通常是最简单的修复。使用 Windows Update 确保您和构建服务器都具有最新的 .NET 更新。如果这不能解决问题,请查看上述文章和问题中的一些故障排除提示。

于 2015-06-25T13:44:59.343 回答