0

我试图将 C# 代码从 .NET 4.8 移植到 .NET 5,旧版本的 .NET 正在使用Microsoft.Windows.SDK.Contracts,在 .NET 5Microsoft.Windows.SDK.Contracts中被目标框架名字对象(TFM)替换我使用相同的代码并尝试将合成器转换为ICompositorDesktopInterop 但它抛出异常:

System.PlatformNotSupportedException:“.NET 运行时不支持编组为 IInspectable。”

这是代码:

private readonly object _dispatcherQueue;
private readonly ICompositorDesktopInterop _compositorDesktopInterop;
private ICompositionTarget compositionTarget;
public Compositor compositor;

private void InitComposition(IntPtr hwnd) 
{
  ICompositorDesktopInterop interop;
  compositor = new Compositor();
  interop = compositor.As < ICompositorDesktopInterop > ();
  interop.CreateDesktopWindowTarget(hwnd, true, out compositionTarget);
  compositionTarget.Root = compositor.CreateSpriteVisual();
}

这是我使用的 Com 接口定义:

[ComImport]
[Guid("29E691FA-4567-4DCA-B319-D0F207EB6807")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICompositorDesktopInterop 
{
  void CreateDesktopWindowTarget(IntPtr hwndTarget, bool isTopmost, out ICompositionTarget test);
}

[ComImport]
[Guid("A1BEA8BA-D726-4663-8129-6B5E7927FFA6")]
[InterfaceType(ComInterfaceType.InterfaceIsIInspectable)]
public interface ICompositionTarget 
{
  Windows.UI.Composition.Visual Root 
  {
    get;
    set;
  }
}

为什么它不能与 TFM 一起使用?有什么我错过的吗?

4

1 回答 1

1

TFM 的问题可以通过使用DirectN或使用InteropCompositor来解决

对于互操作合成器:

在项目文件中设置 TargetFramework

<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>

并在您的代码中使用

Compositor compositor = new Compositor();
ICompositorDesktopInterop interop = compositor.TryAs<ICompositorDesktopInterop>();
interop.CreateDesktopWindowTarget(hwnd, true, out var target).ThrowOnError();
ICompositionTarget compositionTarget = (ICompositionTarget)target;

注意:不要忘记DispatcherQueueController在 MainWindow 构造函数上创建。

所有学分:西蒙·穆里埃

于 2021-08-26T09:21:32.827 回答