Как переписать регистрационный код Windows App SDK WidgetProvider с помощью генерации исходного кода ComWrappers?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как переписать регистрационный код Windows App SDK WidgetProvider с помощью генерации исходного кода ComWrappers?

Сообщение Anonymous »

Для приложений Windows App SDK для предоставления виджетов Windows необходимо написать некоторый код COM-взаимодействия в соответствии с официальной документацией:
Сначала реализуйте фабрику классов, которая будет создавать экземпляр WidgetProvider запрос:

Код: Выделить всё

// FactoryHelper.cs

using Microsoft.Windows.Widgets.Providers;
using System.Runtime.InteropServices;
using WinRT;

namespace COM
{
static class Guids
{
public const string IClassFactory = "00000001-0000-0000-C000-000000000046";
public const string IUnknown = "00000000-0000-0000-C000-000000000046";
}

///
/// IClassFactory declaration
///
[ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(COM.Guids.IClassFactory)]
internal interface IClassFactory
{
[PreserveSig]
int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject);
[PreserveSig]
int LockServer(bool fLock);
}

[ComVisible(true)]
class WidgetProviderFactory : IClassFactory
where T : IWidgetProvider, new()
{
public int CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject)
{
ppvObject = IntPtr.Zero;

if (pUnkOuter != IntPtr.Zero)
{
Marshal.ThrowExceptionForHR(CLASS_E_NOAGGREGATION);
}

if (riid == typeof(T).GUID || riid == Guid.Parse(COM.Guids.IUnknown))
{
// Create the instance of the .NET object
ppvObject = MarshalInspectable.FromManaged(new T());
}
else
{
// The object that ppvObject points to does not support the
// interface identified by riid.
Marshal.ThrowExceptionForHR(E_NOINTERFACE);
}

return 0;
}

int IClassFactory.LockServer(bool fLock)
{
return 0;
}

private const int CLASS_E_NOAGGREGATION = -2147221232;
private const int E_NOINTERFACE = -2147467262;

}
}
Затем зарегистрируйте объект класса поставщика виджетов с помощью OLE:

Код: Выделить всё

// Program.cs

using System.Runtime.InteropServices;
using ComTypes = System.Runtime.InteropServices.ComTypes;
using Microsoft.Windows.Widgets;
using ExampleWidgetProvider;
using COM;
using System;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("ole32.dll")]

static extern int CoRegisterClassObject(
[MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
[MarshalAs(UnmanagedType.IUnknown)] object pUnk,
uint dwClsContext,
uint flags,
out uint lpdwRegister);

[DllImport("ole32.dll")] static extern int CoRevokeClassObject(uint dwRegister);

Console.WriteLine("Registering Widget Provider");
uint cookie;

Guid CLSID_Factory = Guid.Parse("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
CoRegisterClassObject(CLSID_Factory, new WidgetProviderFactory(), 0x4, 0x1, out cookie);
Console.WriteLine("Registered successfully. Press ENTER to exit.");
Console.ReadLine();

if (GetConsoleWindow() != IntPtr.Zero)
{
Console.WriteLine("Registered successfully. Press ENTER to exit.");
Console.ReadLine();
}
else
{
// Wait until the manager has disposed of the last widget provider.
using (var emptyWidgetListEvent = WidgetProvider.GetEmptyWidgetListEvent())
{
emptyWidgetListEvent.WaitOne();
}

CoRevokeClassObject(cookie);
}
Я хочу использовать AOT в своем приложении. Но однажды я включил AOT в своем проекте (), вызов CoRegisterClassObject во втором блоке кода покажет предупреждение:

P/invoke метод 'CoRegisterClassObject(Guid , Object, Ulnt32, Ulnt32,
out UInt32)' объявляет параметр с маршалингом COM. Корректность
COM-взаимодействия не может быть гарантирована после обрезки. Интерфейсы и
члены интерфейса могут быть удалены.

и выдать исключение при выполнении:
System.NotSupportedException: «Встроенный COM отключен с помощью переключателя
функций. Дополнительную
информацию см. на https://aka.ms/dotnet-illink/com».

По этой ссылке (известные несовместимости обрезки) ), этот тип кода взаимодействия COM несовместим с обрезкой .NET и AOT, и альтернативным подходом является использование COM-оболочек или их генерации исходного кода: Генерация исходного кода для ComWrappers.
Генерация исходного кода подход кажется более простым. Но разработчику .NET, который ничего не знает о COM, все равно сложно прочитать документацию и понять, как переписать код.
Спасибо всем, кто попытается решить эту проблему!< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-comwra
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»