替代標題: WinRT 對 IDirect3DDevice 的支持
我有一個應用程式,它使用“ Direct3D11CaptureFramePool ”類來捕獲應用程式視窗的內容,如下所示(鏈接)
我想將此示例移植到 NET 6.0
此處描述了如何移植 WinRT 代碼鏈接
這按預期作業。但是CreateFreeThreaded 方法IDirect3DDevice所要求的是不可能的
我如何將此代碼移植到 NET 6.0
uint hr = CreateDirect3D11DeviceFromDXGIDevice(dxgiDevice.NativePointer, out IntPtr pUnknown);
if (hr == 0)
{
device = Marshal.GetObjectForIUnknown(pUnknown) as IDirect3DDevice;
Marshal.Release(pUnknown);
}
IDrect3DDEvice 沒有 FromAbi 方法,如此處所述
編輯:
我有介面型別,我有一個指向 IUnknown 物件的指標,但我無法獲取實體,因為獲取 IUnknown 指標物件的代碼已更改。沒有 Windows.Graphics.DirectX.Direct3D11.IDirect3DDevice.FromAbi(pUnknown)
編輯2:
我創建了一個示例存盤庫來重現該問題: https ://github.com/Amberg/GraphicsCaptureItemNet6Problem
此代碼適用于 NET 4.8,但不適用于 NET 6。我相信,因為呼叫Marshal.GetObjectForIUnknown(pUnknown)應該替換為
IDirect3DDevice.FromAbi(pUnknown)但沒有這樣的方法
internal class Program
{
[DllImport(
"d3d11.dll",
EntryPoint = "CreateDirect3D11DeviceFromDXGIDevice",
SetLastError = true,
CharSet = CharSet.Unicode,
ExactSpelling = true,
CallingConvention = CallingConvention.StdCall
)]
static extern UInt32 CreateDirect3D11DeviceFromDXGIDevice(IntPtr dxgiDevice, out IntPtr graphicsDevice);
static void Main(string[] args)
{
using var sharpDxDevice = new SharpDX.Direct3D11.Device(SharpDX.Direct3D.DriverType.Hardware, SharpDX.Direct3D11.DeviceCreationFlags.BgraSupport);
IDirect3DDevice direct3dDevice = CreateDirect3DDeviceFromSharpDXDevice(sharpDxDevice);
// this will throw internal cast exception
using var framePool = Direct3D11CaptureFramePool.CreateFreeThreaded(
direct3dDevice,
DirectXPixelFormat.B8G8R8A8UIntNormalized,
2,
new SizeInt32(64, 64));
}
private static IDirect3DDevice CreateDirect3DDeviceFromSharpDXDevice(SharpDX.Direct3D11.Device sharpDxDevice)
{
IDirect3DDevice device = null;
using (var dxgiDevice = sharpDxDevice.QueryInterface<SharpDX.DXGI.Device3>())
{
uint hr = CreateDirect3D11DeviceFromDXGIDevice(dxgiDevice.NativePointer, out IntPtr pUnknown);
if (hr == 0)
{
// with NET 6 there should be something like
// IDirect3DDevice.FromAbi(pUnknown)
// see here https://github.com/microsoft/CsWinRT/blob/master/docs/interop.md#create-rcw
device = Marshal.GetObjectForIUnknown(pUnknown) as IDirect3DDevice;
Marshal.Release(pUnknown);
}
}
return device;
}
}
uj5u.com熱心網友回復:
使用 .NET 6 和 CsWinRT,您可以CreateDirect3DDeviceFromSharpDXDevice像這樣撰寫函式:
private static IDirect3DDevice CreateDirect3DDeviceFromSharpDXDevice(SharpDX.Direct3D11.Device sharpDxDevice)
{
if (CreateDirect3D11DeviceFromDXGIDevice(sharpDxDevice.NativePointer, out var punk) != 0)
return null;
return WinRT.MarshalInterface<IDirect3DDevice>.FromAbi(punk);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457507.html
標籤:C# 。网 视窗 窗口运行时 directx-11
