我正在与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的人,这意味着我只是在想些傻事。