■62432 / ) |
Re[4]: C#からVBで作成したDLLへの構造体渡し |
□投稿者/ 魔界の仮面弁士 (2388回)-(2011/10/09(Sun) 22:22:29)
|
■No62414 (コバピー さん) に返信 >> テストコードを書いて試してみたところ、うちの環境では >> xxxx メソッドの引数は「ref Array dData」になっていました。 ちなみに当方では、 >>> public Function xxxx(ByRef dData() as Type_Data) ではなく、 Public Function xxxx(ByRef dData() As Type_Data) As Integer xxxx = -2 On Error Resume Next xxxx = UBound(dData) - LBound(dData) + 1 End Function という宣言を用いて検証しました。
> 「objVBDll.xxxx(ref a);」と記述した行にカーソルを移動しますと 変数 a は System.Array 型なのですよね。
> 「dynamic clsVBDll.xxxx(ref Array dData)」と表示されますので、 戻り値が dynamic なのが気になります。
VB6 側の Function の戻り値に As キーワードがありませんでしたが、 曖昧さを排除するためにも、VB6 側では戻り値を明示しておくべきかと思います。 (互換性維持のために型を変更できない状況でも、型名自体は明記すべきです)
> エディタ上でのエラー表示も消えましたが、実行しますと、やはり「パラメータが間違っています」 実行時にエラーになるという事は、変数 a に格納してあるインスタンスが、 『VBDLL.clsVBDLL[] 型』のオブジェクトになっていない可能性があります。
あるいは、DLL のバイナリ互換性が失われたために、VB6 側の「clsVBDLL ユーザー定義型」と C# 側の「clsVBDLL 構造体」が不一致状態になっている可能性もあります。この場合は、 (1) DLL への参照設定を解除する。 (2) 相互運用機能アセンブリ(Interop.*.DLL)を削除する。 (3) クリーン操作後、DLL を再度参照設定する。 のように、参照設定をやりなおすことで回復する可能性があります。
>>>>> ((System.ComponentModel.ISupportInitialize)(objVBDll)).BeginInit(); > 尚、BeginInit();の行は、DLLの初期化の為に必要かと思い記述致しましたが、 > objVBDLL = new vbDLL.clsVBDLL();行を実行した際に初期化メソッドが実行されることが分かりました > ので削除致しました。 実際にはそんなコードは記述されていなかった、という事でしょうか。 通常であれば、objVBDll を ISupportInitialize にキャストすることは できないはずなので、どうやって実装したのか少し混乱していました。
|
|