【问题标题】:Returning S_FALSE from a C# COM dll从 C# COM dll 返回 S_FALSE
【发布时间】:2011-02-05 06:24:56
【问题描述】:

我在 IDL 中定义了一个方法如下:

interface IMyFunc : IDispatch
{
    [id(1), helpstring("method GetNextFunction")] HRESULT GetNextFunction(
        [in,out] long* lPos, [out, retval] BSTR* bstrName);
}

使用 C++ 我总是按如下方式实现:

STDMETHODIMP CMyFunc::GetNextFunction(long *nID, long *lPos, BSTR *bstrName)
{
    if ( function to return )
    {
        // setup return values;
        return S_OK;
    }
    else
    {
        // just exit
        return S_FALSE;
    }
}

现在我在 C# 中实现它并在类型库上使用了 tlbimp 并最终得到:

public string GetNextFunction(ref int nID, ref int lPos)

我知道这是因为 [out, retval] 用作返回类型,而不是 C++ 中的 HRESULT。有没有一种简单的方法可以在不更改方法定义的情况下返回 S_OK / S_FALSE 值?我能看到的唯一方法是我必须使用 ildasm / ilasm 添加preservesig 所以我最终得到这样的东西:

public int GetNextFunction(ref int nID, ref int lPos, ref string bstrName)

我想知道是否有其他方法不执行 il 编译步骤。

【问题讨论】:

    标签: c# com-interop tlbimp


    【解决方案1】:

    尝试将/PreserveSig 标志传递给tlbimp。这应该将PreserveSigAttribute 添加到它生成的方法中。这是添加到最新版本的新功能。更多信息请访问tlbimp CodePlex site

    【讨论】:

    • 谢谢。那做了我想要的。如果这些功能在标准的 VS2008/VS2010 RC tlbimp 程序中就好了。
    【解决方案2】:

    作为mentioned in another answer,您可以使用/PreserveSig 标志来指示您要将PreserveSig attribute 附加到在生成的接口上导出的所有方法。

    如果您不想将 PreserveSig 属性应用于所有方法,那么您可以轻松地在 C# 代码中定义 COM 接口,然后应用 PreserveSig 属性并相应地修改函数的签名。然后,您可以从 TLBIMP 中的 co 类中转换类实现,并根据需要使用您的接口定义。

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2011-10-15
      • 2016-12-01
      相关资源
      最近更新 更多