-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Description
In trying to wrap ID2D1RenderTarget::GetSize which returns [D2D_SIZE_F] the expected way it would corrupt the stack.
Flipping it to an out parameter made it work, but I'm unclear as to why. Discussing with @davidwrighton, there might be a bug here. I was unable to create the same scenario via straight [DllImport]s against a sample project. I'll see if I can get a smaller repro together.
In d2d1.h it is defined as:
STDMETHOD_(D2D1_SIZE_F, GetSize)(
) CONST PURE;Which expands to:
virtual __declspec(nothrow) D2D1_SIZE_F __stdcall GetSize() const = 0;The struct is:
typedef struct D2D_SIZE_F
{
FLOAT width;
FLOAT height;
} D2D_SIZE_F;I wrapped this here (SizeF is from System.Drawing):
[PreserveSig]
void GetSize(out SizeF size);
// Doesn't Work:
// [PreserveSig]
// SizeF GetSize();In the WInterop project I have a test Direct2dTests.RenderTarget.GetSize() that exercises it. One can also look at this by tweaking the Direct2dDemo project (i.e. call the method) which runs on .NET Core and sets up a render target that you can use.
As stated, I'll try and get a smaller COM repro together for this.