Investigate using non-strongly typed VTBLs
tannergooding opened this issue · comments
@jkotas suggested here that using non-strongly typed VTBLs might be beneficial for IL Linking.
The type definitions currently look like this: https://github.com/terrafx/terrafx.interop.windows/blob/master/sources/Interop/Windows/um/Unknwnbase/IUnknown.cs
Such a modification might look like:
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace TerraFX.Interop
{
[Guid("00000000-0000-0000-C000-000000000046")]
public unsafe partial struct IUnknown
{
public void** lpVtbl;
[return: NativeTypeName("HRESULT")]
public int QueryInterface([NativeTypeName("const IID &")] Guid* riid, [NativeTypeName("void **")] void** ppvObject)
{
return ((delegate* stdcall<IUnknown*, Guid*, void**, int>)(lpVtbl[0]))((IUnknown*)Unsafe.AsPointer(ref this), riid, ppvObject);
}
[return: NativeTypeName("ULONG")]
public uint AddRef()
{
return ((delegate* stdcall<IUnknown*, uint>)(lpVtbl[1]))((IUnknown*)Unsafe.AsPointer(ref this));
}
[return: NativeTypeName("ULONG")]
public uint Release()
{
var release = ((delegate* stdcall<IUnknown*, uint>)(lpVtbl[2]));
return release((IUnknown*)Unsafe.AsPointer(ref this));
}
}
}
This was resolved in #84