2012-05-03 44 views
8

tôi đang cố gắng để tạo ra một thể hiện của StorageFile trong thư viện lớp học của tôi ...StorageFile Async sử dụng trong một ứng dụng NON Metro

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

VS11 không xây dựng nói: 'chờ' yêu cầu các loại 'Windows. Foundation.IAsyncOperation 'có phương thức GetAwaiter phù hợp. Bạn có thiếu chỉ thị sử dụng cho 'Hệ thống' không?

rõ ràng là tôi đang sử dụng .net 4.5 làm mục tiêu và tôi tham chiếu Windows Assemblies ... không chắc chắn tại sao mã này hoạt động trong MetroStyle nhưng không xây dựng trong thư viện lớp ... Làm cách nào để tạo một thể hiện của Storagefile trong một thư viện lớp học ??? ở giai đoạn này nó không phải là quan trọng nếu các tập tin được tạo ra một cách async ...

xin cho tôi biết suy nghĩ của bạn ... Stelio

+0

Trong kiểu Metro, có bất kỳ câu lệnh bổ sung nào sử dụng ở đầu tệp mã không? –

+0

có cùng một cách sử dụng ... –

Trả lời

5

Hình như bạn đang cố gắng sử dụng một loại từ WinRT thư viện bởi vì StorageFileclass documentation chỉ áp dụng cho Metro và được tìm thấy trong Windows.Storage.

This blog post xem xét cách tạo, nhưng có vẻ như đó là quy trình thủ công. Nó cũng mô tả chi tiết nguyên nhân của lỗi:

Using the await keyword causes the compiler to look for a GetAwaiter method on this interface. Since IAsyncOperation does not define a GetAwaiter method, the compiler wants to look for an extension method.

Về cơ bản, có vẻ như bạn cần phải thêm một tham chiếu đến: System.Runtime.WindowsRuntime.dll


Hãy dành thời gian để đọc bài viết trên blog của mình, nhưng tôi sẽ đặt phần quan trọng ở đây để làm rõ.


Blog Content Dưới unceremoniously đạo văn

Thứ nhất, trong Notepad, tôi tạo ra các mã nguồn C# sau trong 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); 
     } 
    } 
} 

Thứ hai, tôi đã tạo ra một Build.bat tệp mà tôi chạy từ Developer Command Prompt để xây dựng mã này (Đây phải là 1 dòng nhưng tôi quấn nó ở đây để đọc khả năng):

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 

Sau đó, tại dấu nhắc lệnh, tôi chỉ chạy EnumDevices.exe để xem đầu ra.

+0

Tôi nghĩ rằng nó nên được chỉ ra những gì Jeffrey Richter metiones trong bài viết của mình: lắp ráp mất tích là System.Runtime.WindowsRuntime.dll. – svick

+0

Các bạn, cảm ơn phản hồi nhanh ... Tôi đang cố gắng sử dụng trình tải xuống nền từ ứng dụng WPF trên Windows 8 (trong ngữ cảnh NON-Metro) nhưng tôi đoán đó không phải là ý tưởng hay và tốt hơn nên sử dụng BITS .... nhưng tôi nghĩ rằng bằng cách sử dụng interop với windowsRuntime không phải là một ý tưởng tốt ... –

+0

Tôi nhận được lỗi sau khi cố gắng chạy ví dụ từ blog: 'numDevices.cs (14,35): lỗi CS4028 : 'await' yêu cầu loại 'Windows.Foundation.IAsyncOperation ' có phương thức GetAwaiter phù hợp. Bạn có thiếu hướng dẫn sử dụng cho 'Hệ thống' không? ' – Hjulle

1

Nó phải là một thời gian dài kể từ khi bài khi tôi Sau khi tham khảo thêm:
System.Runtime.WindowsRuntime.dll
System.Threading.Tasks.dll

và nhắm mục tiêu windows 8 trong tập tin dự án:

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

Ví dụ trên có thể được biên soạn trong VS.

+0

vui lòng đăng câu hỏi riêng nếu bạn muốn hỏi điều gì đó. – thumbmunkeys

10

gì làm việc cho tôi là "thủ công" thêm TargetPlatformVersion

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

và trong nhóm hàng thêm dòng sau

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

Sau đó, dự án cần biên dịch normaly.

+1

Cảm ơn bạn rất nhiều !!! Điều này nên được đánh dấu là câu trả lời –

8

Tôi đã gặp sự cố tương tự. Vấn đề là không gian tên hệ thống bị thiếu trong tiêu đề vùng tên.I chỉ bao gồm hệ thống trong không gian tên và nó hoạt động. hy vọng nó giúp.

+1

Điều này thực sự hiệu quả đối với tôi. –

Các vấn đề liên quan