0

大規模なvb6アプリケーションがあり、変更/修正する必要があるため、フレームワーク2.0をターゲットにしてセクションを.netに移動しています。一連のクラスを .net dll に移動し、com に公開されるように適切にセットアップしました。

ここに問題があります: MainAppVB6.exe は DOTNET_COM.ComClass をインスタンス化します。これを別の .net dll のメソッドに渡し、appdomain を介して渡します。これは、vb6 で記述された COM オブジェクトではまったく問題になりません。

.net は appdomain の境界を認識し、オブジェクトをシリアライズ可能にするか、marshalbyref にする必要があります。vb6 に戻すデータを変更するには .net 部分が必要なので、シリアライズ可能は機能しません。Inherits MarshalByRefObject でクラスをマークすると、「このリモーティング プロキシにはチャネル シンクがありません。これは、サーバーに登録済みのサーバー チャネルがリッスンしていないか、アプリケーションにサーバーと通信するための適切なクライアント チャネルがないことを意味します」というメッセージが表示されます。

チャネルはありません。同じ dll 内の appdomain を通過しているだけです。.net はオブジェクトを COM として扱っていないようです。

marshalbyref と serializable の両方を削除すると、com オブジェクトが vb6 によってインスタンス化されている場合にのみ機能します。appdomain の .net 機能がオブジェクトを作成し、割り当てて vb6 に戻すと、vb6 で自動化エラーが発生します。

新しい appdomain でオブジェクトをシリアル化し、xml を送り返し、vb6 に逆シリアル化させるのは非常に厄介な方法ですが、それはばかげているように思えます。

誰にもアイデアはありますか?

ありがとうございました。

セス

4

2 に答える 2

0

最初の .NET メソッドで COM クラスの適切なミューテーター メソッドへのデリゲートを作成し、そのデリゲートを AppDomain 境界を越えて渡し、そのデリゲートを使用して 2 番目の .NET メソッドで COM オブジェクトを変更し、変更されたオブジェクトを返すことができます。 VB6に。Marshal クラスのメソッドが役立つ場合があります。:)

コメントから編集: 最初の .net 呼び出しで vb6 クラスの .net コピーを作成し、その新しいオブジェクトを必要なすべての .net 呼び出しに渡してから、com オブジェクトを元に戻すのはどうでしょうか。これは、vb6 の逆シリアル化よりも簡単かもしれません。

于 2009-04-19T03:48:00.613 に答える