#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». Но так как у меня не было никакого прогресса, я подумал, что попробую какой-нибудь метод. Поэтому я опубликовал свои результаты этого метода, а именно ошибку «Класс не зарегистрирован» из консольного приложения во время выполнения. Разве это не правильный способ публикации? Не следует ли мне попробовать методы, которые я обнаружил, и опубликовать результаты? Я довольно новичок в этом, но, думаю, вы можете видеть это по моей репутации. Я понимаю вашу точку зрения по поводу ошибки в названии, поэтому я удалил ее.