2017-05-09 5 views
0

Ich arbeite in einer Xamarin App mit MVVMCross.IoCResolveException im Freigabemodus

Die App funktioniert perfekt, wenn ich im Debug-Modus laufe.

Aber wenn versuchen, im Release-Modus nicht ausgeführt werden kann es mit Ausnahme:

Exception masked MvxIoCResolveException: Failed to resolve type 
FlexConta.Contracts.Service.IUserService 
[mvx]  at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Resolve (System.Type t) [0x00035] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Resolve[T]() [0x00000] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at MvvmCross.Platform.Mvx.Resolve[TService]() [0x00005] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at FlexConta.Core.AppStart.Start (System.Object hint) [0x00000] in <880d0bdc2a5448ffb4d7b35d827753b5>:0 
[mvx] at MvvmCross.Droid.Support.V7.AppCompat.MvxSplashScreenAppCompatActivity.TriggerFirstNavigate() [0x00005] in <74631770bbbe4bff8d50c85acb55083c>:0 
[mvx] at MvvmCross.Droid.Support.V7.AppCompat.MvxSplashScreenAppCompatActivity.InitializationComplete() [0x00009] in <74631770bbbe4bff8d50c85acb55083c>:0 
[mvx] at MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.<InitializeFromSplashScreen>b__7_1() [0x0000a] in <099dd6f64bd74189922e6888bc76e146>:0 
[mvx] at MvvmCross.Platform.Core.MvxMainThreadDispatcher.ExceptionMaskedAction (System.Action action) [0x00000] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 

ich die MVVMCross IOC-Container bin mit und ich bin Registrierung de Abhängigkeiten wie folgt:

public override void Initialize() 
    { 
     base.Initialize(); 

     CreatableTypes() 
      .EndingWith("Repository") 
      .AsInterfaces() 
      .RegisterAsLazySingleton(); 

     CreatableTypes() 
      .EndingWith("Service") 
      .AsInterfaces() 
      .RegisterAsLazySingleton(); 

     Mvx.RegisterSingleton<IUserRestAPI>(new UserRestAPI()); 

     RegisterAppStart(new AppStart()); 
    } 

Die Benutzerservice-Klasse:

public class UserService : IUserService 
{ 
    private readonly IUserRepository _userRepository; 
    private readonly IDocumentTypesRepository _documentTypesRepository; 
    private readonly IUserRestAPI _userRestAPI; 

    public UserService(IUserRepository userRepository, IDocumentTypesRepository documentTypesRepository, IUserRestAPI userRestAPI) 
    { 
     _userRepository = userRepository; 
     _documentTypesRepository = documentTypesRepository; 
     _userRestAPI = userRestAPI; 
    } 
    . 
    . 
    . 
} 

Was kann passieren?

+0

Wenn Ihre Linker-Einstellung für Ihren Release-Build auf etwas anderes als 'None' eingestellt ist, fügen Sie einen Linker' [Preserve (AllMembers = true)] zu Ihrer 'UserService'-Klasse hinzu, eigentlich all Ihren' * Service' und '* Repository' Klassen .... – SushiHangover

Antwort

1

Sie können eine PreserveAttribute in Ihrem PCL erstellen und sie zu den Klassen hinzufügen, die der Linker entfernt. Xamarin docs beschreiben die Verwendung als

Wenn Sie eine Abhängigkeit von den Xamarin Bibliotheken nehmen Sie nicht wollen - für Beispiel, führen Sie eine Cross-Plattform-portable Klassenbibliothek Aufbau (PCL) - Sie noch die Android verwenden können. Runtime.Preserve-Attribut. Um dies zu tun, erklären eine PreserveAttribute Klasse innerhalb des Android.Runtime Namespace wie folgt aus:

namespace Android.Runtime 
{ 
    public sealed class PreserveAttribute : System.Attribute 
    { 
     public bool AllMembers; 
     public bool Conditional; 
    } 
} 

Wenn Sie die Verknüpfung von gemeinsam genutzten PCL verhindern möchten Sie link skip verwenden können, um den Linker aus Abstreifen Code zu verhindern von dir PCL.

In Ihrem android cs proj einfach <AndroidLinkSkip>YourPCLAssemblyNameHerer</AndroidLinkSkip> oder über die Eigenschaften UI. Android-Optionen -> Linker -> Link-Assemblys überspringen, geben Sie Ihren PCL-Assemblynamen in die Eingabe ein.

Verwandte Themen