我有一个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。
从这里开始我还不确定。
答案 0 :(得分:2)
链接的目的是通过排除未使用的名称空间,类和成员来减少整体应用程序大小。链接大多数应用程序需要手动迭代过程:
为了链接使用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
方法会遇到运行时问题:
幸运的是,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"
我仍然不认为这是答案,目前只是一项糟糕的工作。