のために壊し最終更新日: 2009-08-11 14:30 EDTはVB6アプリ
数日前、私はいくつかの非常に奇妙な問題についてthis questionを掲載しました。さて、あるマシンをビルドさせて他のマシンを動かさないようにしていたのはわかっていて、回避策も出てきましたが、今は素敵な具体的な質問が残っています。
問題を再現するために、私は新しいInteropUserControlを作成し、次の操作を行います
public struct MyStruct
新しい追加:それをGUIDとComVisible
属性- を与える
- を
_InteropUserControl
にGetMyStruct
メンバーを追加します。インターフェイスを実装し、InteropUserControl
に実装します。
MyStruct
:
[Guid("49E803EC-BED9-4a08-B42B-E0499864A169")]
[ComVisible(true)]
public struct MyStruct {
public int mynumber;
}
_InteropUserControl.GetMyStruct()
:
[DispId(7)]
void getMyStruct(int num, ref MyStruct data);
(Iも同様に、MyStruct
を返す代わりに、参照によって通過しようとしている。)
InteropUserControl.GetMyStruct()
実装:
public void getMyStruct(int num, ref MyStruct data) {
data = new MyStruct();
data.mynumber = num * 2;
}
また、アセンブリに署名してGACにインストールし、Regasmで登録します。新しいVB6プロジェクトに追加してGetMyStruct()
への呼び出しを追加し、ビルドマシンでコンパイルすると、他のマシンでの実行を拒否します。この問題を回避するには
は、私が代わりに構造体のCOMにクラスを公開しなければならなかった、と基本的にはこれにGetMyStruct
を変更します。私の実際のプロジェクトで
public void GetMyData(int num, MyClass data) {
data.mynumber = num * 2;
}
、私は内部構造体を取得した後、コピー構造体からクラスのインスタンス上の一致するメンバーまでのすべてのフィールド値は、クライアントによってメソッドに渡されます。
なぜ構造体がこの動作を引き起こし、クラスが正常に動作しましたか? VB6で使用するためにCOMに構造体を公開するにはいくつかの魔法がありますか?
私はそれがOLEオートメーションと関係があるかもしれないと思います。
注:ref
パラメータを使用するのではなく、構造体を返そうとしましたが、動作を変更しませんでした。
編集テンプレートを投影するリンクを追加するには:
Interop Forms Toolkit 2.0は、元のVB.NETのプロジェクトテンプレートおよびDLLです。私はdllを参照しないので、これをインストールする必要はありません。
C# Translations of templates on CodeProject私が作成したものです(プロジェクトテンプレートで、アイテムテンプレートではありません)。 VB。NETバージョンは、__InteropUserControl
イベントインターフェイス、_InteropUserControl
インターフェイス、およびいくつかの関連する属性を自動的に生成します。これらはC#バージョンで明示的にコード化されています。
getMyStructでは、msとは何ですか?データでなければならないのでしょうか? – SwDevMan81
短いが、_complete_複製を提供できますか? – AnthonyWJones
@ SwDevMan81:そうです。私の一部にはタイプミス。それは1秒で修正されます。 –