2010-04-07 78 views
3

我在IDL定义的方法如下:从C#COM DLL返回S_FALSE

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) 

我明白,这是因为[出来,RET val]被用作返回类型而不是C++中的HRESULT。有没有一种简单的方法可以在不改变方法定义的情况下返回S_OK/S_FALSE值?我能看到的唯一方法是,我必须使用ILDASM/ILASM添加preservesig所以我最终是这样的:

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

我想知道是否有没有做的IL编译步骤一些其他的方式。

回答

2

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

+0

谢谢。那做了我想要的。如果这些功能都在标准VS2008/VS2010 RC tlbimp程序中,那将会很不错。 – AntonyW 2010-04-07 15:10:07

1

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

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

+0

谢谢。 codeplex解决方案做了我所需要的。 – AntonyW 2010-04-07 15:11:45