1

相互運用性を介していくつかのテストを実行するためにActiveX dll、古い (まだ維持されている) VB6 exe project(*) ソースからビルドしようとしているときに、これに遭遇しました。COM / NET

(望ましい)ユースケースは次のとおりです。

  1. VB6一部のコントロール(たとえばCommonDialog)参照を取得または返すパブリックメソッドを持つクラスを取得します
  2. このクラスを ActiveX dll にコンパイルします
  3. .NET から COM 相互運用機能を介してこのクラスのインスタンスを作成し、そのメソッドを正しく呼び出す

要するに、最初の問題は、

Public Function bad_dlg() As CommonDialog
   Set bad_dlg = Nothing
End Function

を Visual Basic 6ActiveX dllのクラス ファイルに追加すると、コンパイル (* *) が次のエラーで失敗します。

「プライベート オブジェクト モジュールは、パブリック オブジェクト モジュールで、パブリック プロシージャのパラメーターまたは戻り値の型、パブリック データ メンバー、またはパブリック ユーザー定義型のフィールドとして使用することはできません」

したがって、質問は次のとおりです。

  1. 上記のようなものを正しくコンパイルして実行することは本当に不可能ですか?
  2. [IF NOT]VB6 Objectタイプのインスタンスを返し、受け取るようにすべてを変更するとします。.Net からそのようなインスタンスを操作するにはどうすればよいですか (特定のメソッドを呼び出すなど)。

(*) -- ではなくActiveX exe、単なる「通常の」もの

(* *) 適切な.ocx(「Microsoft Common Dialog Control 6.0 (SP6)」、C:\Windows\system32\ComDlg32.OCX) が参照されている場合

(* * *) 私が見つけたのはPassing control Ref to dllだけです

4

2 に答える 2

2

(質問の最初の部分について)

Microsoft のドキュメント ( Data Types Allowed in Properties and Methods ) には次のように記載されています。

プライベート オブジェクトを返すことの弊害について

次のデータ型は許可されていないため、それらへの参照をクライアント アプリケーションに返してはなりません。

  • コントロールなど、Visual Basic (VB) オブジェクト ライブラリで提供されるすべてのオブジェクト。リスト全体を表示するには、オブジェクト ブラウザを使用します。

  • すべてのフォーム。

  • Instancing プロパティが Private に設定されているすべてのクラス モジュール。

  • ActiveX コントロールへの参照。

Visual Basic では、非ビジュアル プライベート オブジェクトをアウト プロセス コンポーネントとの間でやり取りすることはできません。そうしようとすると、エラー 98、「プロパティまたはメソッドの呼び出しには、引数または戻り値としてプライベート オブジェクトへの参照を含めることはできません。」が発生します。このエラーは常にクライアントによって受信されます。

...

重要

  • プライベート オブジェクトは、通常、プロジェクト外で使用するように設計されていないという理由でプライベートです。それらをクライアントに渡すと、プログラムの安定性が低下し、Visual Basic の将来のバージョンとの互換性が失われる可能性があります。独自のプライベート クラスをクライアントに渡す必要がある場合は、Instancing プロパティを Private 以外の値に設定します。

詳細はこちら

于 2011-03-02T11:54:03.407 に答える
1

1 では役に立ちませんが、DotNet 4.0 では dynamic キーワードを使用して 2 が可能になるはずです。

于 2011-03-01T16:16:59.257 に答える