从C#COM dll返回S_FALSE

我在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编译步骤。

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

如另一个答案中所述 ,您可以使用/PreserveSig标志指示您要将PreserveSig属性附加到在生成的接口上导出的所有方法。

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