1

次の VB6 コードを 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ただし、パラメーターを受け入れるコンストラクターはありません

4

1 に答える 1

6

コンストラクター呼び出しではありません。sHost変数には、アウトプロセス COM サーバーを提供するマシンの名前が含まれています。サーバー名を指定できるオーバーロードを使用して、同等の機能が Type.GetTypeFromProgId() によって提供されます。

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

私はそれを「obj」と名付けました。変数にインターフェースタイプと同じ名前を付けることは避けてください。このコードを機能させるには、クライアントとサーバー マシンの両方で COM サーバーを適切に登録し、DCOM セキュリティを正しく設定することが不可欠です。元のコードが正しく動作することを確認するまで、これを試さないでください。

于 2012-08-06T23:45:59.817 に答える