升级到 Azure 移动服务 1.3.1 后出错
Error after upgrading to Azure Mobile Services 1.3.1
我有一个 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;
Don't Link 效果很好。如果我 运行 它与 Link SDK 或 Link All 然后程序集等于 null.
我还不确定从这里到哪里去。
我需要添加
CurrentPlatform.Init();
在 FinishedLaunching 中的 AppDelegate 中
其次,在 iOS 项目中,我需要去
Properties > iOS Build > Linker Behavior and set it to "Don't link"
我仍然不认为这是答案,目前它只是一个糟糕的解决方法。
我终于找到了一种方法来阻止 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
linking 的目的是通过排除未使用的命名空间、classes 和成员来减小整体应用程序大小。链接大多数应用程序需要手动迭代过程:
- 为您关心的任何构建配置启用完整 linking。
- 清理并构建应用程序。
- 运行 应用程序,并观察由于缺少类型和方法(包括构造函数)而导致的运行时异常。
- 将规则添加到您的 mtouch 命令参数或 link 描述 XML 文件以跳过 link 命名空间、类型和 classes您发现正在抛出异常。
为了 link 使用 Azure 移动服务客户端的应用程序 PCL,您需要遵循我刚才所述的相同迭代过程。
我更喜欢 linking 保存的基于 XML 的配置文件策略:
https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/
XML 文件通常称为 link 定义文件。它允许您以声明的方式控制 linker,而无需在代码中的任何地方添加 [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" 开头的类型。这与完全限定名称匹配,包括命名空间。
但是,如前所述,您将遇到 MobileServiceHttpClient
class 中的 GetUserAgentHeader()
方法的运行时问题:
幸运的是,当 linking 启用时,the source code is available. So, I pulled down the source and referenced it in my project. The exception occurs on line 699, where the the Version
property of the fileVersionAttribute
var is attempted to be retrieved. But fileVersionAttribute
is null!...when linked. The LINQ statement that begins on line 695 returns 为空。它 return 在未 linked 时是一个有效值;值为“1.0.0.0”。
为什么?我还不太确定。但这是异常的根本原因。
无论如何,现在我必须在我的项目中包含 Azure 移动服务源,并人为将该值设置为“1.0.0.0”...这是肮脏的,我对此并不满意.
string fileVersion = fileVersionAttribute?.Version ?? "1.0.0.0";
编辑:
github 上提出的问题:https://github.com/Azure/azure-mobile-services/issues/855
我有一个 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;
Don't Link 效果很好。如果我 运行 它与 Link SDK 或 Link All 然后程序集等于 null.
我还不确定从这里到哪里去。
我需要添加
CurrentPlatform.Init();
在 FinishedLaunching 中的 AppDelegate 中
其次,在 iOS 项目中,我需要去
Properties > iOS Build > Linker Behavior and set it to "Don't link"
我仍然不认为这是答案,目前它只是一个糟糕的解决方法。
我终于找到了一种方法来阻止 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
linking 的目的是通过排除未使用的命名空间、classes 和成员来减小整体应用程序大小。链接大多数应用程序需要手动迭代过程:
- 为您关心的任何构建配置启用完整 linking。
- 清理并构建应用程序。
- 运行 应用程序,并观察由于缺少类型和方法(包括构造函数)而导致的运行时异常。
- 将规则添加到您的 mtouch 命令参数或 link 描述 XML 文件以跳过 link 命名空间、类型和 classes您发现正在抛出异常。
为了 link 使用 Azure 移动服务客户端的应用程序 PCL,您需要遵循我刚才所述的相同迭代过程。
我更喜欢 linking 保存的基于 XML 的配置文件策略: https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/
XML 文件通常称为 link 定义文件。它允许您以声明的方式控制 linker,而无需在代码中的任何地方添加 [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" 开头的类型。这与完全限定名称匹配,包括命名空间。
但是,如前所述,您将遇到 MobileServiceHttpClient
class 中的 GetUserAgentHeader()
方法的运行时问题:
幸运的是,当 linking 启用时,the source code is available. So, I pulled down the source and referenced it in my project. The exception occurs on line 699, where the the Version
property of the fileVersionAttribute
var is attempted to be retrieved. But fileVersionAttribute
is null!...when linked. The LINQ statement that begins on line 695 returns 为空。它 return 在未 linked 时是一个有效值;值为“1.0.0.0”。
为什么?我还不太确定。但这是异常的根本原因。
无论如何,现在我必须在我的项目中包含 Azure 移动服务源,并人为将该值设置为“1.0.0.0”...这是肮脏的,我对此并不满意.
string fileVersion = fileVersionAttribute?.Version ?? "1.0.0.0";
编辑:
github 上提出的问题:https://github.com/Azure/azure-mobile-services/issues/855