0

我目前有一个工作项目,我正在使用免注册 Winrt在 win32 控制台应用程序中使用 C# WinRT 组件。一切都运行良好,但是当我尝试使用 C# 组件中的 Async 方法时出现了问题。由于Tasks 不是 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. 我已经更新了示例代码。

4

0 回答 0