问题
I am trying to create an instance of StorageFile in my class library...
var localFolder = ApplicationData.Current.LocalFolder;
StorageFile destinationFile = await localFolder.CreateFileAsync(destination, CreationCollisionOption.GenerateUniqueName);
VS11 is not building say: 'await' requires that the type 'Windows.Foundation.IAsyncOperation' have a suitable GetAwaiter method. Are you missing a using directive for 'System'?
obviously I am using .net 4.5 as target and I am referencing Windows Assemblies... not sure why this code work in MetroStyle but does not build in a class library... How can I create an instance of Storagefile in a class library??? at this stage it is not important if the file is created in an async way...
pls let me know your thoughts... Stelio
回答1:
What worked for me is to "manually" add the TargetPlatformVersion
<PropertyGroup>
<TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>
and in Item group add the following
<ItemGroup>
<Reference Include="System.Runtime.WindowsRuntime" />
<Reference Include="System.Runtime" />
<Reference Include="Windows" />
</ItemGroup>
Then the project should compile normaly.
回答2:
I had the same issue.The problem was system namespace is missing in the namespace header.I just included system in the namespace and it worked. hope it helps.
回答3:
Looks like you are trying to use a type from the WinRT libraries because the StorageFile
class documentation states it applies to Metro only and it is found in Windows.Storage
.
This blog post goes through how to build it, but it appears to be a manual process. It also details the cause of the error:
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.
Basically, it looks like you need to add a reference to: System.Runtime.WindowsRuntime.dll
Please take the time to read his blog post, but I will put the important part here for clarity.
Blog Content Below Unceremoniously Plagiarised
First, in Notepad, I created the following C# source code in 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);
}
}
}
Second, I created a Build.bat file which I run from the Developer Command Prompt to build this code (This should be 1 line but I wrap it here for read ability):
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
Then, at the command prompt, I just run the EnumDevices.exe to see the output.
回答4:
It must be a long time since the post when I
After adding references:
System.Runtime.WindowsRuntime.dll
System.Threading.Tasks.dll
and targeting windows 8 in project file:
<PropertyGroup>
<TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>
Mentioned above example can be compiled in VS.
来源:https://stackoverflow.com/questions/10428446/storagefile-async-usage-in-a-non-metro-application