我目前有一个工作项目,我正在使用免注册 Winrt在 win32 控制台应用程序中使用 C# WinRT 组件。一切都运行良好,但是当我尝试使用 C# 组件中的 Async 方法时出现了问题。由于Task
s 不是 WinRT 类型,因此我四处寻找解决方案。那么从 C# WinRT 组件调用异步方法的正确方法是什么?
我正在使用 winmdidl.exe 和 midlrt.exe 为控制台应用程序创建我的 WinRT comp 头文件。我还包括了“Winrt/Windows.Foundation.h”。
我试过“如何在 Windows 运行时组件中公开异步方法”。这将构建,但它在运行时会出现令人生畏的 (imo) 错误Class not registered
。也是从2014年开始的。
C# WinRT 组件:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Windows.Foundation;
namespace MyComp
{
public sealed class MyLib
{
public static string OtherMethods() // only working method
{
return "string";
}
// Below methods results with `Class not registered` error
public static IAsyncOperation<string> TestAsync() // I think this is the problem
{
return TestAsyncHelper().AsAsyncOperation();
}
private static async Task<string> TestAsyncHelper()
{
// do stuff here
return "string";
}
// ******* Update ****
public static IDictionary<int, string> GetMapOfNames()
{
Dictionary<int, string> retval = new Dictionary<int, string>();
retval.Add(1, "one");
retval.Add(2, "two");
retval.Add(3, "three");
retval.Add(42, "forty-two");
retval.Add(100, "one hundred");
return retval;
}
}
}
更新
我注意到这发生在每个非原始的 WinRT 类型上。我正在尝试实现这些工作中的一个IList<int>
或IDictionary<int, string>
两个都不是。我发现“将托管类型传递给 Windows 运行时”导致“从您的组件返回托管类型”,但我尝试的每一次尝试都导致了Class not registered
错误。在链接的文章中,它提到当将 .Net 类型传递给 WinRT 组件时,它会在另一端显示为相应的 WinRT 类型,这听起来应该可以工作。我也尝试过使用IMap<int, string>
,但错误与IMap<K, V> is inaccessible due to its protection level
. 我已经更新了示例代码。