FAXCOMEXLib и типы возврата

У меня есть элемент управления ActiveX, который я давно создал в VB 6.0 для облегчения отправки факсов, и теперь мне нужно эффективно преобразовать этот элемент управления в библиотеку классов C#.

Я добавил ссылку на библиотеку FAXCOMEXLib, и Visual Studio без проблем видит объекты, свойства и методы, но когда я компилирую свою DLL, я сталкиваюсь с двумя проблемами. Во-первых, кажется, что библиотека классов содержит только те свойства и методы из FAXCOMEXLib, которые фактически используются в моей собственной библиотеке. Это проблема, потому что я выставляю COM-объекты через свойства, доступные только для чтения.

public FaxServer   Server    {get { return m_Server;  }}
public FaxDocument Document  {get { return m_Document;}}

но если вы вызовете эти свойства и попытаетесь использовать возвращенные объекты, у вас будет доступ только к ограниченному количеству методов и свойств.

FaxDocument имеет больше, чем просто ConnectedSubmit()

Я думал, что это могла быть опция компилятора, которая вырезала код, который не использовался, но я не могу найти опцию, чтобы отключить ее.


Моя вторая проблема заключается в том, что метод FaxServer.Connect() возвращает HRESULT согласно документации, но Visual Studio рассматривает это как недействительный возврат. У меня не может быть этого, потому что мне нужно проверить, было ли соединение успешным.

m_Server = new FaxServer();
if (m_Server.Connect("") == 0) // error CS0019 here
  throw new Exception("Could not connect to Server.");

Выдает ошибку CS0019 «Оператор '==' не может быть применен к операндам типа 'void' и 'int'"

Я не знаю, почему он считает, что FaxServer.Connect() возвращает void.

FaxServer в обозревателе объектов

Любая помощь будет принята с благодарностью.

Спасибо, Кен


person K. Ward    schedule 13.02.2018    source источник
comment
Вам не нравится свойство Embed Interop Types ссылки. Довольно неясно, почему, поскольку это никогда не должно быть проблемой, любой код, использующий вашу библиотеку, также нуждается в ссылке, и он заполнит отсутствующие свойства. Но установить для свойства значение No довольно просто. И вы слишком пытаетесь помочь, метод Connect() уже выдает соответствующее исключение с полезным локализованным описательным сообщением, когда он не работает. Заменять его сообщением «Это не сработало» неразумно.   -  person Hans Passant    schedule 13.02.2018
comment
Ах хорошо. Я только недавно узнал об опции Embed Interop Types. Я согласен с решением для обработки исключений, я просто хотел убедиться, что Connect() будет генерировать исключения, когда это необходимо.   -  person K. Ward    schedule 13.02.2018


Ответы (1)


Сначала VS сгенерирует оболочку .NET из библиотеки типов компонентов ActiveX (а затем встроит ее в выходные данные проекта). Вместо того, чтобы позволить VS сделать это, вы можете 1. использовать Tlbimp.exe для создания оболочки .NET, 2. ссылаться на эту оболочку в своем проекте. См. Импорт типа Библиотека как сборка.

Во-вторых, неуспешные HRESULT будут преобразованы в исключения, поэтому вы можете обнаружить сбой с помощью try…catch.

(Если вы хотите использовать S_FAILED и другие коды успеха для различения уровней сбоя: вы не можете. Единственный вариант — создать оболочку COM на C++, которая предоставляет сведения об успехе в параметре out. Но вы говорите, что компонент написан в VB этот случай не применяется.)

person Richard    schedule 13.02.2018