3

Autofac 3.0.1 を Mono で動作させようとしてきましたが、今のところ成功していません。Mono 3.0.5 で Autofac 3.0.1 を参照するアプリケーションを実行しようとすると、次の例外が発生します。

Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/mono/4.5/mscorlib.dll'.
Mono: Image addref mscorlib[0x14ce2c70] -> /opt/mono-3.0.5/lib/mono/4.5/mscorlib.dll[0x14ce1ec0]: 2
Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/mono/4.5/mscorlib.dll'.
Mono: Assembly Loader loaded assembly from location: '/opt/mono-3.0.5/lib/mono/4.5/mscorlib.dll'.
Mono: Assembly mscorlib[0x14ce2c70] added to domain ConsoleApplication1.exe, ref_count=1
Mono: Assembly Loader probing location: 'ConsoleApplication1.exe'.
Mono: Image addref ConsoleApplication1[0x14d20230] -> /var/www/sites/erik/monoconsole/ConsoleApplication1.exe[0x14d1f4a0]: 2
Mono: Assembly ConsoleApplication1[0x14d20230] added to domain ConsoleApplication1.exe, ref_count=1
Mono: Assembly Loader loaded assembly from location: 'ConsoleApplication1.exe'.
Mono: Assembly Loader probing location: 'ConsoleApplication1.exe'.
Mono: Assembly Ref addref ConsoleApplication1[0x14d20230] -> mscorlib[0x14ce2c70]: 2
Mono: Assembly Loader probing location: '/var/www/sites/erik/monoconsole/Autofac.dll'.
Mono: Image addref Autofac[0x14d269b0] -> /var/www/sites/erik/monoconsole/Autofac.dll[0x14d25c40]: 2
Mono: Assembly Autofac[0x14d269b0] added to domain ConsoleApplication1.exe, ref_count=1
Mono: Assembly Loader loaded assembly from location: '/var/www/sites/erik/monoconsole/Autofac.dll'.
Mono: Assembly Ref addref ConsoleApplication1[0x14d20230] -> Autofac[0x14d269b0]: 2
Mono: The request to load the retargetable assembly mscorlib v2.0.5.0 was remapped to mscorlib v4.0.0.0
Mono: Assembly Ref addref Autofac[0x14d269b0] -> mscorlib[0x14ce2c70]: 3
Mono: The request to load the retargetable assembly System.Core v2.0.5.0 was remapped to System.Core v4.0.0.0
Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/mono/gac/System.Core/4.0.0.0__7cec85d7bea7798e/System.Core.dll'.
Mono: Assembly Loader probing location: '/var/www/sites/erik/monoconsole/System.Core.dll'.
Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/System.Core.dll'.
Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/mono/gac/System.Core/4.0.0.0__7cec85d7bea7798e/System.Core.exe'.
Mono: Assembly Loader probing location: '/var/www/sites/erik/monoconsole/System.Core.exe'.
Mono: Assembly Loader probing location: '/opt/mono-3.0.5/lib/System.Core.exe'.
Mono: The following assembly referenced from /var/www/sites/erik/monoconsole/Autofac.dll could not be loaded:
     Assembly:   System.Core    (assemblyref_index=1)
     Version:    2.0.5.0
     Public Key: 7cec85d7bea7798e
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/var/www/sites/erik/monoconsole/).

Mono: Failed to load assembly Autofac[0x14d269b0]

Mono: Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies.
Missing method .ctor in assembly /var/www/sites/erik/monoconsole/Autofac.dll, type System.Runtime.CompilerServices.ExtensionAttribute
Can't find custom attr constructor image: /var/www/sites/erik/monoconsole/Autofac.dll mtoken: 0x0a000015
Hello!
Mono: Unloading domain ConsoleApplication1.exe[0x2aaaab6f1cc0], assembly mscorlib[0x14ce2c70], ref_count=3
Mono: Unloading domain ConsoleApplication1.exe[0x2aaaab6f1cc0], assembly ConsoleApplication1[0x14d20230], ref_count=1
Mono: Unloading assembly ConsoleApplication1 [0x14d20230].
Mono: Unloading image /var/www/sites/erik/monoconsole/ConsoleApplication1.exe [0x14d1f4a0].
Mono: Unloading domain ConsoleApplication1.exe[0x2aaaab6f1cc0], assembly Autofac[0x14d269b0], ref_count=1
Mono: Unloading assembly Autofac [0x14d269b0].
Mono: Unloading image /var/www/sites/erik/monoconsole/Autofac.dll [0x14d25c40].
Mono: Unloading assembly mscorlib [0x14ce2c70].
Mono: Unloading image /opt/mono-3.0.5/lib/mono/4.5/mscorlib.dll [0x14ce1ec0].

注意すべき点がいくつかあります。まず、System.Core 2.0.5.0 をロードできなかったようです。これは、Autofac 3.0.1 が移植可能なクラス ライブラリであるためでしょうか?

この問題は、System.Runtime.CompilerServices.ExtensionAttribute に Missing method .ctor がある 2 番目の問題にもつながります。この問題に関する情報をいくつか見つけました。この問題は、ExtensionAttribute クラスが DLL から別の DLL に移動したことが原因のようです: http://www.lextm.com/2013/02/how-to-use-nuget -on-mono-part-iv.html

この問題は次のように再現できます ( https://gist.github.com/ErikSchierboom/5047101を参照)。

  1. .NET 4.0 コンソール アプリケーションを作成する
  2. Autofac 3.0.1 への参照を追加します (NuGet 経由など)。
  3. ContainerBuilderクラスのインスタンスを作成する
  4. コンソール アプリケーションをビルドする
  5. Mono でコンソール アプリケーションを実行する

この問題を解決する方法を知っている人はいますか?

4

1 に答える 1

1

この問題の再現ファイルを https://github.com/ErikSchierboom/monoportableclasslibraryextensionmethodで作成しました。これには、2 つのコンソール アプリケーションと 2 つのポータブル クラス ライブラリが含まれています。1 つのポータブル クラス ライブラリは拡張メソッドとしてメソッドを定義し、もう 1 つはそうしません。一方のコンソール アプリケーションは拡張メソッド バージョンを使用し、もう一方は使用しません。問題を確認するには、両方のコンソール アプリケーションを Mono 3.0.5 環境で実行します。拡張メソッド バージョンを使用するものはクラッシュし、他のバージョンはクラッシュしません。

Mono 3.0.12 には完全な PCL 機能があり、このエラーの発生を防ぎます: http://www.mono-project.com/Release_Notes_Mono_3.0#New_in_Mono_3.0.12

于 2013-03-04T10:32:01.877 に答える