2012-08-06 120 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安全性對於使代碼正常工作至關重要,那麼一件巨大的事情仍然會出錯。在確定原始代碼正常工作之前,不要嘗試此操作。