从PInvoke.dll考虑以下方法:
union MYUNION2
{
int i;
char str[128];
};
PINVOKELIB_API void TestUnion2( MYUNION2 u, int type )
{
//...implementation is irrelevant...
}
根据MSDN:
在托管代码中,不允许使用值类型和引用类型 交叠。此示例使用方法重载来使调用者在调用相同的非托管函数时使用这两种类型。
示例的托管代码如下:
[StructLayout(LayoutKind.Explicit, Size=128)]
public struct MyUnion2_1
{
[FieldOffset(0)]
public int i;
}
[StructLayout(LayoutKind.Sequential)]
public struct MyUnion2_2
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string str;
}
[DllImport( "..\\LIB\\PInvokeLib.dll")]
public static extern void TestUnion2(MyUnion2_1 u, int type);
[DllImport( "..\\LIB\\PInvokeLib.dll")]
public static extern void TestUnion2(MyUnion2_2 u, int type);
在P / Invoke中,这一切都很好,但我如何在COM Interop中做到这一点?显然我不能创建重载,因为CLR依赖于方法' vtable中的确切位置。好像我需要一个等同于FieldOffsetAttribute
的COM方法。
创建两个接口(每个重载一个)可以工作,但它有点尴尬......