2015-12-02 2 views
3

Мое приложение (UWP, C#/xaml) отлично работает в режиме деблокирования, если я его развертываю через Visual Studio или если я загружаю приложение на свой телефон.Приложение UWP падает при загрузке из магазина, но не при загрузке

Но если я загрузить его из магазина и запустить его, он падает со следующим исключением

System.IO.FileLoadException: Не удалось загрузить файл или сборку «System.Threading, Version = 4.0.10.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'или одна из ее зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Кроме того, такое же приложение работает на ПК без сбоев при загрузке/загрузке через VS или даже при загрузке из магазина. Любая помощь будет оценена по достоинству.

Редактировать: Код Snippet > закрытый статический словарь lockDictionary = новый словарь();

private static SemaphoreSlim getLockElement(string fileName) 
    { 
     if (lockDictionary.ContainsKey(fileName)) 
      return lockDictionary[fileName]; 
     else 
     { 
      SemaphoreSlim objectToReturn = new SemaphoreSlim(1); 
      lockDictionary.Add(fileName, objectToReturn); 
      return objectToReturn; 
     } 
    } 

    private async static Task<StorageFile> getFile(string key) 
    { 
     try 
     { 
      return await storageFolder.GetFileAsync(key); 
     } 
     catch (FileNotFoundException ex) 
     { 
      return null; 
     } 
    } 

    public static async Task<string> readFileDataIndependentOfUserId(string key) 
    { 
     AccountFunctions.logMsg("Awaiting " + key); 
     await getLockElement(key).WaitAsync(); 
     AccountFunctions.logMsg("Got into " + key); 

     try 
     { 
      StorageFile File = await getFile(key); 
      if (File == null) 
       return null; 
      string text = await FileIO.ReadTextAsync(File); 

      return text; 
     } 
     finally 
     { 
      AccountFunctions.logMsg("Released " + key); 
      getLockElement(key).Release(); 
     } 
    } 

    public static async Task saveDataInFileIndependentOfUserId(string key, string data) 
    { 
     AccountFunctions.logMsg("Awaiting " + key); 
     await getLockElement(key).WaitAsync(); 
     AccountFunctions.logMsg("Got into " + key); 

     try 
     { 
      var FileName = key; 
      var Fileoption = CreationCollisionOption.ReplaceExisting; 
      var File = await storageFolder.CreateFileAsync(FileName, Fileoption); 
      await FileIO.WriteTextAsync(File, data); 
      AccountFunctions.logMsg("Saving : " + key + " : " + data); 
     } 
     finally 
     { 
      AccountFunctions.logMsg("Released " + key); 
      getLockElement(key).Release(); 
     } 
    } 

    public static async Task removeFileDataIndependentOfUserId(string key) 
    { 
     AccountFunctions.logMsg("Awaiting " + key); 
     await getLockElement(key).WaitAsync(); 
     AccountFunctions.logMsg("Got into " + key); 

     try 
     { 
      StorageFile File = await getFile(key); 
      if (File == null) 
      { 
       getLockElement(key).Release(); 
       return; 
      } 
      await File.DeleteAsync(); 
     } 
     finally 
     { 
      AccountFunctions.logMsg("Released " + key); 
      getLockElement(key).Release(); 
     } 
    } 

Аварийная ситуация возникает в конструкторе моего класса, содержащем эти статические функции. AccountFunctions.logMsg - это функция, которая просто записывает в отладчик, если он подключен.

+0

Сбой на той же машине, что он также работает правильно? –

+2

Ну, этого не должно быть. Ваше приложение будет восстановлено на сервере Store с помощью .NET Native. Который удаляет любую зависимость от сборки .NET. Одна проблема с .NET Native заключается в том, что код отражения очень затруднительный, инструмент сборки не может видеть, что у вас может быть косвенная зависимость. Вот почему у вас есть .NET Native на вашей собственной машине, чтобы вы могли протестировать такой код. Похоже, вы пропустили этот тест. –

+0

@HansPassant Не могли бы вы указать мне направление написания? О каком тесте вы говорите? Также я не использую отражение в своем коде. –

ответ

2

Кажется, что у вас может быть включен .NET Native в ваших локальных сборках. Если вы посмотрите на свойства проекта> Build, вы увидите флажок Enable .NET Native tool chain. Убедитесь, что этот флажок установлен, потому что это конфигурация, которую вы создаете в магазине.

Шаблон UWP имеет этот атрибут, добавленный для конфигураций RELEASE: true. Если вы перенесли старый проект в UWP, может быть полезно разложить файл проекта с помощью пустого шаблона UWP, чтобы узнать, есть ли какие-либо другие странности, которые могут вызвать проблемы.

Смежные вопросы