2012-08-06 125 views
1

我想下面的VB6代码转换成C#如何在C#中创建对象?

If optHost(0).Value Then 
    Set m_oScpiAccess = New IcSCPIActiveX.IcSCPIAccess 
Else 
    sHost = txtHost.Text 
    Set m_oScpiAccess = CreateObject("Exfo.IcSCPIActiveX.IcSCPIAccess", sHost) 
End If 

我用TLBIMP.EXE以创建COM类包装,和我想:

if (string.IsNullOrEmpty(host)) 
{ 
    // this works 
    IcSCPIAccess = new IcSCPIAccess(); 
} 
else 
{ 
    // throws MissingMethodException 
    IcSCPIAccess = (IcSCPIAccess)Activator.CreateInstance(
     typeof(IcSCPIAccessClass), 
     host); 
} 

但没有构造函数接受host参数

+0

我不知道答案,但可以指出你的.NET/COM互操作性圣经Adam Nathan的“.Net和COM:完整的互操作性指南” – pm100 2012-08-06 23:33:08

回答

5

这不是构造函数调用。 sHost变量包含一台机器的名称,该机器提供了进程外COM服务器。等效功能由Type.GetTypeFromProgId()提供,使用,允许指定的服务器名称的过载:

var t = Type.GetTypeFromProgID("Exfo.IcSCPIActiveX.IcSCPIAccess", sHost, true); 
    obj = (IcSCPIAccess)Activator.CreateInstance(t); 

我把它命名为“目标文件”,也避免给变量名称相同的接口类型。如果让COM服务器在客户机和服务器机器上正确注册并正确设置DCOM安全性对于使代码正常工作至关重要,那么一件巨大的事情仍然会出错。在确定原始代码正常工作之前,不要尝试此操作。