.net COM互操作-通过重载接口方法封送值和引用类型的联合

.net COM互操作-通过重载接口方法封送值和引用类型的联合,.net,com,com-interop,unions,.net,Com,Com Interop,Unions,考虑以下方法: 根据: 在托管代码中,不允许使用值类型和引用类型 重叠此示例使用方法重载使调用方在调用同一非托管函数时能够同时使用这两种类型 示例的托管代码如下所示: [StructLayout(LayoutKind.Explicit, Size=128)] public struct MyUnion2_1 { [FieldOffset(0)] public int i; } [StructLayout(LayoutKind.Sequential)] public struct

考虑以下方法:

根据:

在托管代码中,不允许使用值类型和引用类型 重叠此示例使用方法重载使调用方在调用同一非托管函数时能够同时使用这两种类型

示例的托管代码如下所示:

[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互操作中如何做到这一点呢?显然,我不能仅仅创建重载,因为CLR依赖于方法在vtable中的确切位置。好像我需要一个与FieldOffsetAttribute等效的COM方法


创建两个接口,每个接口一个重载工作,但有点尴尬…

这需要暴力。首先是针对开发人员让他解决这个问题。接下来,在C中输入fixed关键字,以便您可以声明联合。使用编码。默认情况下手动转换字符串,不要忘记零终止。我是唯一一个开发人员,所以暴力不会成为问题:我已经看到我会更喜欢两个接口的解决方案,但出于好奇,我想让你的建议起作用。当然,我在不安全的上下文中尝试了[StructLayoutLayoutKind.Explicit]public struct MyUnion{[FieldOffset0]public int I;[FieldOffset0]public fixed char str[128];},但即使访问整数也不起作用。调用该方法时,不会发生任何情况。
[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);