为了账号安全,请及时绑定邮箱和手机立即绑定

签名 C# 的 ISearchManager2 问题

签名 C# 的 ISearchManager2 问题

C#
交互式爱情 2022-10-23 13:33:24
我正在尝试ISearchManager2在 C# 上加载界面。直到这一刻,一切正常ISearchManager。我使用 Microsoft.Search.Interop 程序集来做到这一点。我可以设置目录,从索引器和其他东西中获取一些结果。但是,现在,我想要一个名为的接口ISearchManager2,所以,我创建了:[ComConversionLoss][ComImport][Guid("DBAB3F73-DB19-4A79-BFC0-A61A93886DDF")][InterfaceType(1)]public interface ISearchManager2 : ISearchManager{    void CreateCatalog([MarshalAs(UnmanagedType.LPWStr)] [In] string pszCatalog, out ISearchCatalogManager _out);    void DeleteCatalog([MarshalAs(UnmanagedType.LPWStr)] string pszCatalog);}相同的签名和顺序searchapi.h是:MIDL_INTERFACE("DBAB3F73-DB19-4A79-BFC0-A61A93886DDF")ISearchManager2 : public ISearchManager{public:    virtual HRESULT STDMETHODCALLTYPE CreateCatalog(         /* [string][in] */ __RPC__in_string LPCWSTR pszCatalog,        /* [out] */ __RPC__deref_out_opt ISearchCatalogManager **ppCatalogManager) = 0;    virtual HRESULT STDMETHODCALLTYPE DeleteCatalog(         /* [string][in] */ __RPC__in_string LPCWSTR pszCatalog) = 0;};使用有效的ISearchManagerIm 铸造,例如:ISearchCatalogManager _out;Teste _test = (Teste)_searchManager;_test.CreateCatalog(catalog, out _out);QueryInterface 没有错误(这意味着找到了接口)并且没有异常(有 hresults)。但是,它从未分配过。调试它,我可以看到string catalog变化。[这是在通话之前CreateCatalog。之后:我假设它使用额外参数调用的 C# 和第二个(输出值)是字符串。我尝试过PreserveSigAttribute和其他类似的东西:[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]void CreateCatalog([MarshalAs(UnmanagedType.LPWStr)] [In] string pszCatalog, out ISearchCatalogManager _out);因为当我从(来自 Microsoft.Search.Interop)反编译接口时,我可以在具有相同签名的ISearchManager函数上看到该属性。GetCatalog有人知道为什么会这样?
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

在 .NET 中声明继承的 COM 接口时,您必须递归地声明所有继承的接口成员。例如,如果您将此作为基本接口:


[Guid("2cd90691-12e2-11dc-9fed-001143a055f9"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interface IBase

{

    int Blabla();

}

那么IDerived定义将是这样的:


[Guid("65019f75-8da2-497c-b32c-dfa34e48ede6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interface IDerived

{

    // IBase methods

    int Blabla();


    // IDerived methods

    ...

}

或者更好,像这样,如果你想在 .NET 中保持继承层次结构:


[Guid("65019f75-8da2-497c-b32c-dfa34e48ede6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interface IDerived : IBase

{

    // IBase methods

    new int Blabla();


    // IDerived methods

    ...

}


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信