2010-04-07 2 views
3

У меня есть метод, определенный в IDL следующим образом:Возвращение S_FALSE из DLL C# COM

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] используется как возвращаемый тип вместо HRESULT, как в C++. Есть ли простой способ вернуть значения S_OK/S_FALSE без изменения определения метода? Единственный способ, которым я могу видеть, что я должен использовать ILDASM/ILASM добавить preservesig, так что я в конечном итоге с чем-то вроде этого:

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

мне было интересно, есть ли какой-то другой путь, не делая шаг иль компиляции.

ответ

2

Попробуйте передать /PreserveSig флаг на tlbimp. Это должно добавить PreserveSigAttribute к методам, которые он создает. Это новая функция, добавленная в последнюю версию. Больше информации находится на tlbimp CodePlex site.

+0

Спасибо. Это сделало то, что я хотел. Было бы неплохо, если бы эти функции были в стандартной программе VS2008/VS2010 RC tlbimp. – AntonyW

1

Как mentioned in another answer, вы можете использовать /PreserveSig флаг, чтобы указать, что вы хотите, чтобы прикрепить PreserveSig attribute ко всем методам, которые экспортируются на интерфейсах, которые генерируются.

Если вы не хотите применять атрибут PreserveSig ко всем методам, вы можете легко определить COM-интерфейс в коде C#, а затем применить атрибут PreserveSig и соответствующим образом изменить подпись функций. Затем вы можете использовать реализацию классов из ваших со-классов в TLBIMP и работать с определением интерфейса, как вы пожелаете.

+0

Спасибо. Решение codeplex сделало все, что мне было нужно. – AntonyW