我在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编译步骤。
答案 0 :(得分:2)
尝试将/PreserveSig
标志传递给tlbimp。这应该将PreserveSigAttribute添加到它生成的方法中。这是添加到最新版本的新功能。更多信息位于tlbimp CodePlex site。
答案 1 :(得分:1)
作为mentioned in another answer,您可以使用/PreserveSig
标志来指示您要将PreserveSig attribute附加到在生成的接口上导出的所有方法。
如果您不想将PreserveSig属性应用于所有方法,则可以使用C#代码轻松定义COM接口,然后应用PreserveSig属性并相应地修改函数的签名。然后,您可以从TLBIMP中的co类转换类实现,并根据需要使用您的接口定义。