为什么不为事件委托调用ICustomMarshaler?

时间:2019-03-25 20:33:53

标签: c# c++ com interop com-interop

我正在与ICustomMarshaler苦苦挣扎,但找不到其他遇到此问题的人。我一直在寻找答案的事实,而我最终在这里发布的事实意味着,我可能会在距今十分钟的位置找到答案。 :-\

我有一个C#事件被代理到一个COM事件接收器。我想使用ICustomMarshaler将具有两个字符串和一个int的对象数组封送。

我的问题是我已定义了所有内容,但未使用我的ICustomMarshaler。我在GetInstance和MarshalManagedToNative上设置了断点,但它们从未被击中。

我的ICustomMarshaler 确实会在我转向另一个方向时被呼叫。

将自定义封送处理程序与C#事件/ COM事件接收器一起使用是否存在问题?

这是我要序列化的对象:

using System;
using System.Runtime.InteropServices;

namespace ComDll
{
    [StructLayout(LayoutKind.Sequential)]
    [Guid(ClassId), ComVisible(true)]
    public class ParamStruct
    {
        [MarshalAs(UnmanagedType.BStr)]
        public string Key;
        [MarshalAs(UnmanagedType.BStr)]
        public string Value;
        [MarshalAs(UnmanagedType.I4)]
        public int Number;

        internal const string ClassId = "8163B82F-E0AD-47BC-8F82-EFA324DCFB95";
    }
}

在该对象中,我尝试省略MarshalAs属性,因为它们实际上不会被使用,结果为0x80028019(旧格式或无效类型库)。如果使用我的自定义封送拆收器,则不会。

这是我的ICustomMarshaler。注意:由于没有调用GetInstance或其他任何内容,因此我省略了实际的函数内容:

using System;
using System.Runtime.InteropServices;

namespace ComDll
{
    public class ParamStructArrayMarshaler : ICustomMarshaler
    {
        private static ICustomMarshaler _marshaler;
        public static ICustomMarshaler GetInstance(string cookie)
        {
            if(null == _marshaler)
            {
                _marshaler = new ParamStructArrayMarshaler();
            }
            return _marshaler;
        }

        public object MarshalNativeToManaged(IntPtr pNativeData)
        {
            // <Snip>
        }

        public IntPtr MarshalManagedToNative(object ManagedObj)
        {
            // <Snip>
        }

        public void CleanUpManagedData(object ManagedObj)
        {
            // <Snip>
        }

        public void CleanUpNativeData(IntPtr pNativeData)
        {
            // <Snip>
        }

        public int GetNativeDataSize()
        {
            // <Snip>
        }
    }
}

这是我界面中的函数定义:

[DispId(2)]
void ParamsWereSent(
    [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(ParamStructArrayMarshaler)), In]
    ParamStruct[] paramArray,
    [In] int count);

这是我使用的代表和暴露它的事件:

[ComVisible(false)]
public delegate void ParamsWereSentHandler(
    [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(ParamStructArrayMarshaler)), In]
    ParamStruct[] paramArray,
    [In] int count);
public event ParamsWereSentHandler ParamsWereSent;

我找不到真正遇到他们的ICustomMarshaler的人,这意味着我只是在想些傻事。

0 个答案:

没有答案