Как вернуть непримитивные типы из компонента C# winrt в C ?

#c# #.net #windows-runtime #c -winrt #winrt-component

Вопрос:

В настоящее время у меня есть рабочий проект, в котором я использую компонент C# WinRT в консольном приложении win32, используя Winrt без регистрации. Все работает хорошо, но проблема возникает, когда я пытаюсь использовать асинхронные методы из компонента C#. Поскольку Task s не являются типами WinRT, я поискал вокруг, чтобы найти решение. Итак, как правильно вызывать асинхронные методы из компонента C# WinRT?

Я использую winmdidl.exe и midlrt.exe чтобы создать мой файл заголовка WinRT comp для консольного приложения. Я также включил «» Winrt/Windows.Основание.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 ошибке. В связанных статьях упоминается, что при прохождении .Чистые типы для компонента WinRT, он будет отображаться как соответствующий тип WinRT с другой стороны, что звучит так, как будто он должен просто работать. Я также пытался использовать IMap<int, string> , но это приводит к ошибкам IMap<K, V> is inaccessible due to its protection level . Я обновил образец кода.

Комментарии:

1. Не смотрите на старые статьи, с 2014 года в этой области все значительно изменилось. Для C# предусмотрены расширения для преобразования асинхронных методов WinRT в задачи: docs.microsoft.com/en-us/dotnet/api/…

2. Я смотрю на AsAsyncOperation() страницу, и она выглядит примерно так, как написано в моем посте. IAsyncOperations приемлемы для WinRT, но я не знаю, что делать с class not registered ошибкой, так как я использую WinRT без регистрации.

3. Я удалил комментарий, в котором говорилось, что это сработало. Это не работает. Я допустил ошибку и восстановил старую версию, которая работала синхронно.

4. Незарегистрированный класс не имеет ничего общего с асинхронностью. Ваш вопрос не ясен.

5. Первоначальный вопрос: «как мне вызвать асинхронную функцию, которая находится в компоненте WinRT C#, из консольного приложения C (неуправляемого)». Я пытаюсь избежать публикации сообщения «Проблема XY». Но так как у меня не было никакого прогресса, я подумал, что попробую какой-нибудь метод. Поэтому я опубликовал свои результаты этого метода, а именно ошибку «Класс не зарегистрирован» из консольного приложения во время выполнения. Разве это не правильный способ публикации? Не следует ли мне попробовать методы, которые я обнаружил, и опубликовать результаты? Я довольно новичок в этом, но, думаю, вы можете видеть это по моей репутации. Я понимаю вашу точку зрения по поводу ошибки в названии, поэтому я удалил ее.