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 コンパイラの問題です。例外をすばやく Google 検索すると、多くの情報が得られます。

NewtonSoft.Json のようなプロジェクトがこの問題に遭遇することさえあります。

例外自体は、「プログラムに無効な Microsoft Intermediate Language (MSIL) またはメタデータが含まれていることを意味します。通常、これは、プログラムを生成したコンパイラのバグを示しています。」

Microsoft には、問題のトラブルシューティングに関する KB 記事があります。人々がそれを解決したときはいつでも、私が見た限り、それは常に2つの修正のうちの1つです:

  • コンパイル オプションの変更。たとえば、暗号化/難読化の種類のツールを実行している一部の人々は、ツールをオフにすると役立つことがわかります。他の人は、コンパイラの最適化をオフにするとそれが修正されることに気づきます。(KB 記事にいくつかのヒントがあります。)
  • 最新バージョンにパッチが適用されていることを確認します。私は自分のマシンではうまく機能するが、ビルドサーバーでは機能しないという、他の同様の状況に遭遇しました。またはその逆。ほとんどの場合、マシンにはすべてパッチが適用されていますが、ビルド サーバーにはパッチが適用されていないためです。または、誰かがビルド サーバーにパッチを適用したばかりで、まだパッチをインストールしていません。

通常はパッチが最も簡単な修正であるため、パッチから始めることをお勧めします。Windows Update を使用して、ユーザーとビルド サーバーの両方に最新の .NET 更新プログラムがあることを確認します。それでも問題が解決しない場合は、上記の記事や質問にあるトラブルシューティングのヒントを確認してください。

于 2015-06-25T13:44:59.343 に答える