2

相互運用参照を通じて.netプロジェクトで使用していたCOM dllがあります。ここで、この COM コンポーネントを別のリモート マシンに移動し、そこでインスタンスを作成する必要があります。

私が行ったことは、サーバー マシンに新しい COM+ アプリケーションを作成することでした。このアプリ内にこのコンポーネントを追加しました。これは、サーバーの COM+ インターフェイスにリストされる方法です。 ここに画像の説明を入力

このアプリをプロキシ インストーラーとしてエクスポートし、クライアント マシンにインストールしました。これにアクセスするには、次のコードを使用しました

Type type;
type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var returnValue = COMObject.GetType().InvokeMember("Method_1",   BindingFlags.Public |  BindingFlags.InvokeMethod, null, COMObject, new object[1] { "1" });

しかし、Method_1 を呼び出すと UNKNOWN NAME (0x80020006) エラーが発生しますか? 以前に同様の問題に直面したことがある人は、助けてください。

4

3 に答える 3

3

私がすることはこれです:

1)C#で同等のインターフェイスを作成します。次のようになります。

[Guid("<the interface IID goes here>")]
public interface ISomeInterfaceName
{
   int Method1(...);
   int Method2(...);
   int Method3(...);
   ...
}

2)次に、最初の遅延バインディングコードの代わりに、次のようにします。

Type type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var if = (ISomeInterfaceName)COMObject;
if.Method1(...);

注:IIDは、CLSIDと混同しないように、インターフェースからのIIDである必要があります。メソッドは、COMメソッドに正確に対応するようにレイアウトする必要があります(メソッドの順序が重要であり、パラメーターと戻り値のタイプがどのように定義されているかも重要です)

このようなクラスやインターフェイスがたくさんある場合は、COMコンポーネントからTLBをインポートすることもできます。

于 2012-08-30T12:47:27.600 に答える
0

アプリケーションプロキシがクライアントマシンに正しくインストールおよび構成されている場合は、他のオブジェクトインスタンスを作成するのと同じように、COM+をインスタンス化できるはずです。

これだけ試してみてください:

IMyExpectedInterface o = new MyCOMServicedComponent();
o.SomeMethod();

それが正常に実行されていない場合は、インスタンス化中に発生する例外の結果をお知らせください。

于 2012-08-30T11:07:17.467 に答える
0

メソッドを呼び出すときに GetType() を使用する必要はありません。COMObject.InvokeMember()十分なはずです。

.GetTypeFromCLSID()また、 ProgID ではなく ClassID を使用して Type を取得してみてください。

BindingFlags.Publicさらに、使用するのではなくBindingFlags.Default。これにより、すべての型メンバーが使用可能になることが指定されます。

于 2012-08-30T10:48:03.413 に答える