Использование StorageFile Async в приложении НЕ Metro

Я пытаюсь создать экземпляр StorageFile в своей библиотеке классов...

var localFolder = ApplicationData.Current.LocalFolder;
StorageFile destinationFile = await localFolder.CreateFileAsync(destination, CreationCollisionOption.GenerateUniqueName);

VS11 не строит: «ожидание» требует, чтобы тип «Windows.Foundation.IAsyncOperation» имел подходящий метод GetAwaiter. Вам не хватает директивы использования для «Системы»?

очевидно, я использую .net 4.5 в качестве цели и ссылаюсь на сборки Windows... не уверен, почему этот код работает в MetroStyle, но не встраивается в библиотеку классов... Как я могу создать экземпляр Storagefile в библиотеке классов? ?? на данном этапе не важно, создан ли файл асинхронно...

Пожалуйста, дайте мне знать ваши мысли... Стелио


person Stelio Di Bello    schedule 03.05.2012    source источник
comment
Есть ли в стиле Metro какие-либо дополнительные операторы использования в верхней части файла кода?   -  person Adam Houldsworth    schedule 03.05.2012


Ответы (4)


Что сработало для меня, так это «вручную» добавить TargetPlatformVersion

<PropertyGroup>
  <TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>

и в группе Item добавьте следующее

<ItemGroup>
  <Reference Include="System.Runtime.WindowsRuntime" />
  <Reference Include="System.Runtime" />
  <Reference Include="Windows" />
</ItemGroup>

Тогда проект должен компилироваться нормально.

person Panagiotis Lefas    schedule 01.11.2013

У меня была та же проблема. Проблема заключалась в том, что в заголовке пространства имен отсутствует системное пространство имен. Я просто включил систему в пространство имен, и это сработало. Надеюсь, поможет.

person Ansary Ans21    schedule 25.04.2014

Похоже, вы пытаетесь использовать тип из библиотек WinRT, потому что StorageFile документация по классу говорится, что это относится только к Metro и находится в Windows.Storage.

В этом сообщении в блоге рассказывается, как его создать, но похоже, что это ручной процесс. Также подробно описывается причина ошибки:

Использование ключевого слова await заставляет компилятор искать метод GetAwaiter в этом интерфейсе. Поскольку IAsyncOperation не определяет метод GetAwaiter, компилятор хочет найти метод расширения.

По сути, похоже, вам нужно добавить ссылку на: System.Runtime.WindowsRuntime.dll


Пожалуйста, найдите время, чтобы прочитать его сообщение в блоге, но я помещу здесь важную часть для ясности.


Контент блога ниже является бесцеремонным плагиатом

Во-первых, в Блокноте я создал следующий исходный код C# в EnumDevices.cs:

using System;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Foundation;

class App {
    static void Main() {
        EnumDevices().Wait();
    }

    private static async Task EnumDevices() {
        // To call DeviceInformation.FindAllAsync:
        // Reference Windows.Devices.Enumeration.winmd when building
        // Add the "using Windows.Devices.Enumeration;" directive (as shown above)
        foreach (DeviceInformation di in await DeviceInformation.FindAllAsync()) {
            Console.WriteLine(di.Name);
        }
    }
}

Во-вторых, я создал файл Build.bat, который я запускаю из командной строки разработчика для создания этого кода (это должна быть 1 строка, но я помещаю ее сюда для возможности чтения):

csc EnumDevices.cs  
/r:c:\Windows\System32\WinMetadata\Windows.Devices.Enumeration.winmd  
/r:c:\Windows\System32\WinMetadata\Windows.Foundation.winmd 
/r:System.Runtime.WindowsRuntime.dll  
/r:System.Threading.Tasks.dll

Затем в командной строке я просто запускаю EnumDevices.exe, чтобы увидеть результат.

person Adam Houldsworth    schedule 03.05.2012
comment
Я думаю, следует указать на то, что Джеффри Рихтер упоминает в своем посте: отсутствующая сборка — это System.Runtime.WindowsRuntime.dll. - person svick; 03.05.2012
comment
Ребята, спасибо за быстрый ответ... Я пытался использовать фоновый загрузчик из приложения WPF в Windows 8 (в контексте НЕ-Metro), но я думаю, что это не очень хорошая идея, и лучше использовать BITS. ... но я думаю, что использование взаимодействия с windowsRuntime - не очень хорошая идея... - person Stelio Di Bello; 03.05.2012
comment
Я получаю следующую ошибку при попытке запустить пример из блога: numDevices.cs(14,35): error CS4028: 'await' requires that the type 'Windows.Foundation.IAsyncOperation<Windows.Devices.Enumeration.DeviceIn formationCollection>' have a suitable GetAwaiter method. Are you missing a using directive for 'System'? - person Hjulle; 28.11.2013
comment
@Hjulle У вас есть оператор использования в верхней части файла? using System;. Кроме того, используете ли вы достаточно позднюю версию VS в соответствующей версии C#, чтобы получить поддержку ключевого слова await? - person Adam Houldsworth; 28.11.2013
comment
Да, я точно скопировал пример. Я предполагаю, что он поддерживает ключевое слово await, поскольку он ищет метод GetAwaiter и не жалуется на неизвестное ключевое слово или что-то в этом роде. Но я не использую VS, я использую компилятор csc, который входит в состав среды выполнения .NET 4.5. - person Hjulle; 28.11.2013

Должно быть, прошло много времени с момента публикации, когда я После добавления ссылок:
System.Runtime.WindowsRuntime.dll
System.Threading.Tasks.dll

и ориентироваться на окна 8 в файле проекта:

  <PropertyGroup>
    <TargetPlatformVersion>8.0</TargetPlatformVersion>
  </PropertyGroup>

Упомянутый выше пример может быть скомпилирован в VS.

person user2523651    schedule 08.08.2013
comment
пожалуйста, напишите отдельный вопрос, если вы хотите что-то спросить. - person thumbmunkeys; 12.03.2015