我有很久以前在VB 6.0中构建的ActiveX控件,以方便传真,现在我需要将此控件有效地转换为C#类库。
我已经添加了对FAXCOMEXLib库的引用,并且Visual Studio在查看对象,属性和方法时没有任何问题,但是当我编译我的DLL时遇到了两个问题。 首先,类库似乎只包含FAXCOMEXLib中实际在我自己的库中使用的属性和方法。这是一个问题,因为我通过只读属性公开COM对象。
public FaxServer Server {get { return m_Server; }}
public FaxDocument Document {get { return m_Document;}}
但是如果调用这些属性并尝试使用返回的对象,则只能访问有限数量的方法和属性。
FaxDocument has more than just ConnectedSubmit()
我认为这可能是一个编译器选项,可以删除未使用的代码,但我找不到关闭它的选项。
我的第二个问题是FaxServer.Connect()方法返回HRESULT according to the documentation,但Visual Studio将其视为void返回。我不能拥有这个,因为我需要能够检查连接是否成功。
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 in the Object Browser
非常感谢任何帮助。
谢谢, 肯
答案 0 :(得分:1)
首先,VS将从ActiveX组件类型库生成一个.NET包装器(然后嵌入到项目的输出中)。不要让VS这样做,你可以1.使用Tlbimp.exe
生成.NET包装器,2。在项目中引用该包装器。请参阅导入类型Library as an Assembly。
其次,非成功的HRESULT将转换为异常,因此您可以使用try…catch
检测到失败。
(如果您想使用S_FAILED
和其他成功代码来区分失败级别:您不能。您在C ++中创建COM包装器的唯一选择是在{{1}中提供成功详细信息但是你说组件是用VB编写的,这种情况不适用。)