Грешка след надграждане до мобилни услуги на Azure 1.3.1

Имам проект Xamarin.iOS и наскоро го надстроих плюс моя PCL проект, за да има Windows Azure Mobile Services 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.

Накъде да отида от тук, още не съм сигурен.


person Adam    schedule 18.02.2015    source източник


Отговори (3)


Най-накрая открих начин да предотвратя свързването на библиотеката на мобилните услуги на Azure, без да деактивирам свързването за всичко останало.

Можете да добавите

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

към Допълнителни mtouch аргументи в опциите за изграждане на iOS под настройките на проекта за проекта за iOS.

Това ще пропусне линкера за лазурните сглобки, но не и останалите. Повече за линкера можете да намерите на http://developer.xamarin.com/guides/ios/advanced_topics/linker/#Skipping_Assemblies

person Dimse    schedule 15.04.2015
comment
Опитвах се да намеря командите на линкера, за да го направя, но документът на линкера е толкова рядък. Със сигурност най-добрият начин да го направя, но моят започна да работи върху модулите на Link SDK отново по някаква напълно неизвестна причина. - person Adam; 15.04.2015

Целта на свързването е да се намали общият размер на приложението чрез изключване на неизползваните пространства от имена, класове и членове. Свързването на повечето приложения ще изисква ръчен итеративен процес на:

  1. Активирайте пълното свързване за каквато и конфигурация на компилация да ви интересува.
  2. Почистете и изградете приложението.
  3. Стартирайте приложението и наблюдавайте какви изключения по време на изпълнение възникват в резултат на липсващи типове и методи (включително конструктори).
  4. Добавете правила или към аргументите на вашата команда mtouch, или към XML файла с описание на връзката, за да пропуснете свързването на пространствата от имена, типовете и класовете, за които установите, че хвърлят изключения.

За да свържете приложение, което използва Azure Mobile Services Client PCL, вие следвате същия итеративен процес, който току-що посочих.

Предпочитам базираната на XML стратегия за конфигурационен файл за запазване на връзки: https://developer.xamarin.com/guides/cross-platform/advanced/custom_linking/

XML файлът е известен като файл с дефиниция на връзка. Той ви позволява да контролирате линкера по декларативен начин, без да добавяте [Preserve] атрибути навсякъде във вашия код; и за библиотеки на трети страни, без да замъглявате аргументите на mtouch на проектите Xamarin.iOS или файла csproj на проектите Xamarin.Android. Може да се наименува както искате, стига правилно да кажете на проекта на платформата за него.

Подходяща конфигурация може да изглежда така:

<?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: въведете описание на изображението тук

За щастие, изходният код е наличен. И така, извадих източника и го посочих в моя проект. Изключението възниква на линия 699, където е направен опит за извличане на свойството Version на fileVersionAttribute var. Но fileVersionAttribute е нула!...когато е свързан. Изявлението LINQ, което започва на ред 695 връща нула, когато свързването е разрешено. Той връща валидна стойност, когато не е свързан; стойност "1.0.0.0".

ЗАЩО? Още не съм съвсем сигурен. Но това е основната причина за изключението.

Както и да е, засега ще трябва да включа източника на Azure Mobile Service в моя проект и изкуствено да задам тази стойност на "1.0.0.0"...което е мръсно и не съм доволен от това.

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

РЕДАКТИРАНЕ:

Проблем, повдигнат в github: https://github.com/Azure/azure-mobile-services/issues/855

person NovaJoe    schedule 18.11.2015

Трябваше да добавя

CurrentPlatform.Init(); 

в AppDelegate в FinishedLaunching

На второ място в проекта за iOS, към който трябваше да отида

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

Все още не смятам, че това е отговорът, просто е лоша работа в момента.

person Adam    schedule 19.02.2015
comment
Извикването CurrentPlatform.Init() беше добавено като изискване преди няколко версии, така че ако сте надграждали от много стара версия, се очаква това да е задължително. Сигурни ли сте обаче, че без връзка е единствената опция за връзка, която работи за вас? - person Paul Batum; 25.02.2015
comment
Да, иначе се срива всеки път и наистина искам да намеря начин да го заобиколя, защото драстично увеличава размера на файла ми, така че след като Apple го обработи, той също отива над ограничението от 100mb - person Adam; 26.02.2015
comment
Ще се задълбоча повече в това защо това се случва през следващата седмица или така и ще публикувам всички открития тук или решение, ако намеря такова. - person Adam; 26.02.2015