COM对象IUnknown参数。 InvalidCastException IRowset

时间:2015-11-19 08:21:58

标签: c# interface com iunknown

我在c#(COM技术)上写了一个Ole Db Provider。

  

Ole Db Provider是.NET DLL。

     

InvalidCastException存在问题:其他信息:   无法投射" MyOleDbProvider.RowsetObject"输入" IRowset"。

执行' GetRowset'来自 Ole Db客户端的方法。 在msdn:

HRESULT GetRowset (IUnknown       *pUnkOuter,
                   REFGUID         rguidSchema,
                   ULONG           cRestrictions,
                   const VARIANT   rgRestrictions[],
                   REFIID          riid,
                   ULONG           cPropertySets,
                   DBPROPSET       rgPropertySets[],
                   IUnknown      **ppRowset);

我转换了' GetRowset'比如

[PreserveSig]
HRESULT GetRowset(
            [In] IntPtr pUnkOuter,
            [In] ref Guid rguidSchema,
            [In] int cRestrictions,
            [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] object[] rgRestrictions,
            [In] ref Guid riid,
            [In] int cProperties,
            [In] IntPtr rgPropertySets,
            [Out, MarshalAs(UnmanagedType.Interface, IidParameterIndex = 4)] out object ppRowset);

实现:

HRESULT IDBSchemaRowset.GetRowset(IntPtr pUnkOuter, ref Guid rguidSchema, int cRestrictions, object[] rgRestrictions,
            ref Guid riid, int cProperties, IntPtr rgPropertySets, out object ppRowset)
        {
            // not significantly begin
               ...
            // not significantly end

            var rowsetObject = new RowsetObject(rguidSchema);

            if (pUnkOuter == IntPtr.Zero)
            {               
                // always here
                ppRowset = rowsetObject;
                return HRESULT.S_OK;
            }
            else
            {                    
                ppRowset = rowsetObject.AggregateIn(pUnkOuter);
            }

            return HRESULT.S_OK;
        }

当我通过 ppRowset 时会发生InvalidCastException。

public class RowsetObject : IRowset
{
   ...
}

[ComImport]
[Guid("0C733A7C-2A1C-11CE-ADE5-00AA0044773D")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRowset
{
    ...
}

仅当客户端是.NET客户端时才会出现此问题。 .NET客户端使用System.Data.OleDb命名空间。如果客户端是本机客户端,则没有问题。

0 个答案:

没有答案