Alternative title: WinRT support for IDirect3DDevice
我有一个应用程序,它使用"Direct3D11CaptureFramePool"类来捕获应用程序窗口的内容,如下所示(link)
我想把这个例子移植到Net6.0
这里介绍了如何移植WinRT代码
How can i port this code to 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方法,如here所述
Edit:
我有接口类型,我有一个指向IUnknown对象的指针,但我无法获取实例,因为为IUnknown指针获取对象的代码已更改.没有 Windows.Graphics.DirectX.Direct3D11.IDirect3DDevice.FromAbi(pUnknown)
个
Edit 2:
我创建了一个回购示例来重现这个问题:
这段代码适用于Net4.8,但不适用于Net6.我相信,因为
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;
}
}