2017-11-13 7 views
0

リンカーの動作を「すべてリンク」に設定すると、実行時に次のエラーが発生します。 Autofac.Core.DependencyResolutionException。Xamarinのリリースですべてをリンクすると、Autofacアセンブリで失敗しました。

私はアセンブリAutofacを無視して追加しようとしましたが、成功しませんでした。

リンカの動作を「Link Framework SDKのみ」に設定すると機能しますが、可能であれば「すべてリンク」を有効にします。

ありがとうございます。

更新:

ReflectionActivator.ActivateInstance (Autofac.IComponentContext context, System.Collections.Generic.IEnumerable`1[T] parameters) 
    Autofac.Core.DependencyResolutionException: No constructors on type 'Eela.Taxi.Service.RestService' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. 

No constructors on type 'Eela.Taxi.Service.RestService' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. 

An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RestService (ReflectionActivator), Services = [Eela.Model.Xamarin.Interfaces.IRestService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope ---> No constructors on type 'Eela.Taxi.Service.RestService' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. (See inner exception for details.) 

1 
ReflectionActivator.ActivateInstance (Autofac.IComponentContext context, System.Collections.Generic.IEnumerable`1[T] parameters) 
2 
InstanceLookup.Activate (System.Collections.Generic.IEnumerable`1[T] parameters) 

An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RestService (ReflectionActivator), Services = [Eela.Model.Xamarin.Interfaces.IRestService], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope ---> No constructors on type 'Eela.Taxi.Service.RestService' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'. (See inner exception for details.) 

1 
InstanceLookup.Activate (System.Collections.Generic.IEnumerable`1[T] parameters) 
2 
InstanceLookup.Execute() 
3 
ResolveOperation.GetOrCreateInstance (Autofac.Core.ISharingLifetimeScope currentOperationScope, Autofac.Core.IComponentRegistration registration, System.Collections.Generic.IEnumerable`1[T] parameters) 
4 
ResolveOperation.ResolveComponent (Autofac.Core.IComponentRegistration registration, System.Collections.Generic.IEnumerable`1[T] parameters) 
5 
ResolveOperation.Execute (Autofac.Core.IComponentRegistration registration, System.Collections.Generic.IEnumerable`1[T] parameters) 
6 
LifetimeScope.ResolveComponent (Autofac.Core.IComponentRegistration registration, System.Collections.Generic.IEnumerable`1[T] parameters) 
7 
Container.ResolveComponent (Autofac.Core.IComponentRegistration registration, System.Collections.Generic.IEnumerable`1[T] parameters) 
8 
ResolutionExtensions.TryResolveService (Autofac.IComponentContext context, Autofac.Core.Service service, System.Collections.Generic.IEnumerable`1[T] parameters, System.Object& instance) 
9 
ResolutionExtensions.ResolveService (Autofac.IComponentContext context, Autofac.Core.Service service, System.Collections.Generic.IEnumerable`1[T] parameters) 
10 
ResolutionExtensions.Resolve (Autofac.IComponentContext context, System.Type serviceType, System.Collections.Generic.IEnumerable`1[T] parameters) 
11 
ResolutionExtensions.Resolve[TService] (Autofac.IComponentContext context, System.Collections.Generic.IEnumerable`1[T] parameters) 
12 
ResolutionExtensions.Resolve[TService] (Autofac.IComponentContext context) 
13 
App+<OnStart>d__4.MoveNext() 
14 
ExceptionDispatchInfo.Throw() 
15 
AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) 
16 
SyncContext+<>c__DisplayClass2_0.<Post>b__0() 
17 
Thread+RunnableImplementor.Run() 
18 
IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) 
19 
(wrapper dynamic-method) System.Object:f9684b08-49ee-4f47-8b7c-c59b675c18f3 (intptr,intptr) 
+0

スタックトレース全体を追加できますか?また、 'DependencyResolutionException'は、AutofacがIoCコンテナで使用しているタイプの1つを見つけることができず、リンク先のAutofacではありません。 – Cheesebaron

+0

@Cheesebaron stacktraceで質問を更新しました –

+0

したがって、Autofactは 'Eela.Taxi.Service.RestService'のコンストラクタを見つけることができません。そこから始めよう。 – Cheesebaron

答えて

1

あなたのスタックトレースを示しているようになっています。 AutofacがEela.Taxi.Service.RestServiceのインスタンスをインスタンス化しようとしています。しかし、Mono Linkerは直接呼び出されないため、コンストラクタを削除したようです。

だから、あなたはいくつかのことをすることができます。あなたが可能性:

  1. あなたのアセンブリを追加するリンカーから無視されるように
  2. あなたは
  3. あなたはMvvmCrossが何に似ては持っている可能性があり、それに触れないようにリンカに伝えるために、あなたのRestService[Preserve]属性を追加することができますLinkerPleaseInclude.csファイルから取り除かれる各タイプの使用方法を記述したファイル。だからあなたが発見したすべての人に、ここにそれを追加する必要があります。

ですから、1.と2.はかなり自明です。既にautofacには1.を使用していますが、RestServiceを含むあなた自身のアセンブリに対しても同じことをしてください。しかし、ここでの欠点は、このアセンブリの中には何もリンクされておらず、潜在的に必要以上に多くのコードが残されることです。

2.クラスを宣言する直前に[Preserve]を追加するだけです。だから、何かは次のように:あまりにもメンバーのフィールドを維持するために[Preserve(AllMembers = true)]

[Preserve] 
public class RestService : IRestService { } 

またAllMembers = trueでそれを使用して検討することができます。

最後のオプションは基本的には、あなたのAppプロジェクトにLinkerPleaseInclude.csを作成します。リンカーに仕事を任せる。 Linkerが実行時にアプリケーションを終了させるまで、クラスにアイテムを追加し続けます。だから、LinkerPleaseInclude.csのスタートは、次のようになります。

[Preserve(AllMembers = true)] 
public class LinkerPleaseInclude 
{ 
    public void Include(IRestService service) 
    { 
     service = new RestService(); 
    } 
} 

このクラスが呼び出されることはありませんが、リンカがRestServiceのコンストラクタが出てリンクされるべきでないことを知ることが十分にあります。

+0

ありがとう。あなたの最初のオプションは魅力のように働いた:D –

関連する問題