升级到Azure移动服务1.3.1后出错

时间:2015-02-18 10:43:09

标签: xamarin.ios azure-mobile-services

我有一个Xamarin.iOS项目,最近升级了我的PCL项目以获得Windows Azure移动服务SDK 1.3.1。

但是,我现在在尝试创建新的MobileServiceClient时遇到错误。

{System.NullReferenceException: Object reference not set to an instance     an object
at Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.GetUserAgentHeader () [0x0002e] in d:\jw\ZumoSDKBuild_Dev\source\sdk\Managed\src\Microsoft.WindowsAzure.MobileServices\Http\MobileServiceHttpClient.cs:683 
at Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient..ctor (IEnumerable`1 handlers, System.Uri applicationUri, System.String installationId, System.String applicationKey) [0x0004e] in d:\jw\ZumoSDKBuild_Dev\source\sdk\Managed\src\Microsoft.WindowsAzure.MobileServices\Http\MobileServiceHttpClient.cs:138 
at Microsoft.WindowsAzure.MobileServices.MobileServiceClient..ctor (System.Uri applicationUri, System.String applicationKey, System.Net.Http.HttpMessageHandler[] handlers) [0x00040] in d:\jw\ZumoSDKBuild_Dev\source\sdk\Managed\src\Microsoft.WindowsAzure.MobileServices\MobileServiceClient.cs:199 
at Microsoft.WindowsAzure.MobileServices.MobileServiceClient..ctor (System.Uri applicationUri, System.String applicationKey) [0x00000] in d:\jw\ZumoSDKBuild_Dev\source\sdk\Managed\src\Microsoft.WindowsAzure.MobileServices\MobileServiceClient.cs:150 
at Microsoft.WindowsAzure.MobileServices.MobileServiceClient..ctor (System.String applicationUrl, System.String applicationKey) [0x00000] in d:\jw\ZumoSDKBuild_Dev\source\sdk\Managed\src\Microsoft.WindowsAzure.MobileServices\MobileServiceClient.cs:135 
at MyApp.App..ctor () [0x00009] in c:\Users\adam\Documents\Visual Studio 2013\Projects\MyApp\App.cs:30 }

在这里查看MobileServiceClient的源代码是它失败的功能

            private string GetUserAgentHeader() 
678         { 
679             AssemblyFileVersionAttribute fileVersionAttribute = typeof(MobileServiceClient).GetTypeInfo().Assembly 
680                                                                         .GetCustomAttributes(typeof(AssemblyFileVersionAttribute)) 
681                                                                         .Cast<AssemblyFileVersionAttribute>() 
682                                                                         .FirstOrDefault(); 
683             string fileVersion = fileVersionAttribute.Version; 
684             string sdkVersion = string.Join(".", fileVersion.Split('.').Take(2)); // Get just the major and minor versions 
685 

686             IPlatformInformation platformInformation = Platform.Instance.PlatformInformation; 
687             return string.Format( 
688                 CultureInfo.InvariantCulture, 
689                 "ZUMO/{0} (lang={1}; os={2}; os_version={3}; arch={4}; version={5})", 
690                 sdkVersion, 
691                 "Managed", 
692                 platformInformation.OperatingSystemName, 
693                 platformInformation.OperatingSystemVersion, 
694                 platformInformation.OperatingSystemArchitecture, 
695                 fileVersion); 
696         } 

我不知道具体导致错误的原因。任何帮助表示赞赏。

更新

如果我在尝试初始化MobileServiceClient之前在我的应用程序中运行以下代码

AssemblyFileVersionAttribute fileVersionAttribute = typeof(MobileServiceClient).GetTypeInfo().Assembly 
                                                                        .GetCustomAttributes(typeof(AssemblyFileVersionAttribute)) 
                                                                        .Cast<AssemblyFileVersionAttribute>() 
                                                                         .FirstOrDefault(); 
             string fileVersion = fileVersionAttribute.Version; 

使用Do not Link它完美无缺。如果我使用Link SDK或Link All运行它,那么assembly就等于null。

从这里开始我还不确定。

3 个答案:

答案 0 :(得分:2)

链接的目的是通过排除未使用的名称空间,类和成员来减少整体应用程序大小。链接大多数应用程序需要手动迭代过程:

  1. 为您关注的任何构建配置启用完全链接。
  2. 清理并构建应用程序。
  3. 运行应用程序,并观察由于缺少类型和方法(包括构造函数)而发生的运行时异常。
  4. 向mtouch命令参数或链接描述XML文件添加规则,以便跳过关于您发现抛出异常的命名空间,类型和类的链接。
  5. 为了链接使用Azure移动服务客户端PCL的应用程序,您遵循我刚才所说的相同迭代过程。

    我更喜欢链接保存的基于XML的配置文件策略: https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/

    XML文件通常称为链接定义文件。它允许您以声明方式控制链接器,而无需在代码中的任何位置添加[Preserve]属性;对于第三方库,没有混淆Xamarin.iOS项目的mtouch参数或Xamarin.Android项目的csproj文件。只要您正确地告诉您的平台项目,就可以命名它。

    适当的配置可能如下所示:

    <?xml version="1.0" encoding="UTF-8" ?>
    <linker>
        <assembly fullname="Microsoft.WindowsAzure.Mobile">
            <type fullname="Microsoft*" />
        </assembly>
        <assembly fullname="Microsoft.WindowsAzure.Mobile.Ext">
            <type fullname="Microsoft*" />
        </assembly>
    </linker>
    

    在每个装配节点中,您将描述要保留的类型或成员。为了简单起见,我使用了通配符来包含以“Microsoft”开头的所有类型。这与完全限定名称匹配,包括名称空间。

    但是,如上所述,GetUserAgentHeader()类中的MobileServiceHttpClient方法会遇到运行时问题: enter image description here

    幸运的是,the source code is available。所以,我删除了源代码并在我的项目中引用它。行699上发生异常,其中尝试检索Version var的fileVersionAttribute属性。但fileVersionAttribute为空!...链接时。启用链接时,从695行开始的LINQ语句将返回null。 在未链接时返回有效值;值“1.0.0.0”。

    为什么?我还不太确定。但这是例外的根本原因。

    无论如何,现在我必须在我的项目中包含Azure移动服务源,并人为地将该值设置为“1.0.0.0”......这很脏,我对此并不满意。 / p>

    string fileVersion = fileVersionAttribute?.Version ?? "1.0.0.0";
    

    修改

    在github上提出的问题:https://github.com/Azure/azure-mobile-services/issues/855

答案 1 :(得分:1)

我终于找到了一种方法来阻止Azure移动服务库的链接,而不会禁用其他所有内容的链接。

您可以添加

--linkskip=Microsoft.WindowsAzure.Mobile --linkskip=Microsoft.WindowsAzure.Mobile.Ext

到iOS项目的项目设置下的iOS构建选项中的其他mtouch参数。

这将跳过azure程序集的链接器,但不会跳过其余部分。有关链接器的更多信息,请访问http://developer.xamarin.com/guides/ios/advanced_topics/linker/#Skipping_Assemblies

答案 2 :(得分:0)

我需要添加

CurrentPlatform.Init(); 
在FinishedLaunching的AppDelegate中

其次在iOS项目中我需要转到

Properties > iOS Build > Linker Behavior and set it to "Don't link"

我仍然不认为这是答案,目前只是一项糟糕的工作。