发布模式

时间:2017-05-09 02:53:05

标签: xamarin xamarin.android mvvmcross

我正在使用MVVMCross的Xamarin应用程序。

当我在调试模式下运行时,该应用程序运行良好。

但是如果尝试在发布模式下运行,则会失败并出现例外情况:

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 

我正在使用MVVMCross IOC容器,我正在注册de dependencies,如下所示:

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

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

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

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

        RegisterAppStart(new AppStart());
    }

用户服务类:

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;
    }
    .
    .
    .
}

可能会发生什么?

1 个答案:

答案 0 :(得分:1)

您可以在PCL中创建namespace Android.Runtime { public sealed class PreserveAttribute : System.Attribute { public bool AllMembers; public bool Conditional; } } 并将其添加到链接器正在剥离的类中。 Xamarin docs将用途描述为

  

如果你不想依赖Xamarin库 - 为   例如,您正在构建跨平台可移植类库   (PCL) - 您仍然可以使用Android.Runtime.Preserve属性。至   这样做,在Android.Runtime中声明一个PreserveAttribute类   像这样的命名空间:

<AndroidLinkSkip>YourPCLAssemblyNameHerer</AndroidLinkSkip>

如果要阻止链接共享PCL,可以使用link skip阻止链接器从PCL中删除代码。

在你的android cs项目中,只需添加<?php define( 'ML_DIR', get_template_directory() ); define( 'ML_URI', get_template_directory_uri() ); require ML_DIR . '/inc/enqueues.php'; ?> 或通过属性UI。 Android选项 - &gt;链接器 - &gt;跳过链接装配,在输入中输入PCL装配名称。