C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: [マーシャリング] クラスオブジェクト配列


(過去ログ 42 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■21898 / inTopicNo.1)  [マーシャリング] クラスオブジェクト配列
  
□投稿者/ まどか (558回)-(2008/07/11(Fri) 16:07:25)

分類:[.NET 全般] 

VB2005でCOMクラスを作っています。

Public Class1
Public Function Method1() As Class1()

これをVariant配列(VBScript:Dim x())で受けようとしています。

.NET側の下記の定義に対して、

Public Function Method1() As Class1()
Public Function Method1() As <MarshalAs(UnmanagedType.SafeArray)> Class1()
Public Function Method1() As <MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VarEnum.VT_VARIANT)> Class1()

前者二つは結果(x(0))を参照するところで「型が一致しません」、
3番目はメソッド呼び出しで「型が一致しません」
となります。

MarshalAs(〜)の正解は何でしょうか?
引用返信 編集キー/
■21906 / inTopicNo.2)  Re[1]: [マーシャリング] クラスオブジェクト配列
□投稿者/ 渋木宏明(ひどり) (819回)-(2008/07/11(Fri) 16:47:07)
渋木宏明(ひどり) さんの Web サイト
> MarshalAs(〜)の正解は何でしょうか?

それ以前に、Struct ではなく Class の参照をマーシャリングして、VBScript 側?から何者として扱いたいんでしょう?

引用返信 編集キー/
■21909 / inTopicNo.3)  Re[2]: [マーシャリング] クラスオブジェクト配列
□投稿者/ まどか (560回)-(2008/07/11(Fri) 17:26:05)
No21906 (渋木宏明(ひどり) さん) に返信
> それ以前に、Struct ではなく Class の参照をマーシャリングして、VBScript 側?から何者として扱いたいんでしょう?

マーシャリングは不要ということでしょうか?

VB6からはAs Class1()で正常に結果を取得できていますが
VBScriptではVariant型しか使えないということ(らしい)なので、マーシャリングが必要と認識しました。
#呼び出せるが、要素の参照で型不一致となる。

Dim x()
x = class.Method1()
〜 x(0).Id 〜  ← ここで型不一致

それともStructに置き換える必要があるのでしょうか?
#検索してたらほとんど「構造体のマーシャリング」でしたので。。。
#こういうセーフアレイだの何だのというCとかが絡むとこは微妙な知識なので頓珍漢なことを言ってるかもです。


引用返信 編集キー/
■21910 / inTopicNo.4)  Re[2]: [マーシャリング] クラスオブジェクト配列
□投稿者/ まどか (561回)-(2008/07/11(Fri) 17:29:07)
No21906 (渋木宏明(ひどり) さん) に返信
> それ以前に、Struct ではなく Class の参照をマーシャリングして、VBScript 側?から何者として扱いたいんでしょう?

COMラッパ側のオリジナルマネージメソッドがList(Of Class1)を返しています。
ラッピングに際してジェネリックは使えないので戻り値の型をClass1配列にした次第です。
引用返信 編集キー/
■21912 / inTopicNo.5)  Re[3]: [マーシャリング] クラスオブジェクト配列
□投稿者/ 渋木宏明(ひどり) (820回)-(2008/07/11(Fri) 18:04:06)
渋木宏明(ひどり) さんの Web サイト
> マーシャリングは不要ということでしょうか?

いいえ。

「Class1 配列を COM オブジェクトの参照の配列として VBScript に渡したい」のかどうか明確に書かれていなかったので、その確認です。

「アンマネージ側でどんな型を必要としているか」が分からなければ、明示的にどんなマーシャリング指定を行えばいいのかアドバイスできないです。

誤解されやすい表現なので補足しておくと、COM 相互運用には常にマーシャリングが伴います。

属性による明示的なマーシャリング指定を行わない場合、デフォルトのマーシャリング規則が適用されるというだけで、マーシャリングそのものが不要なわけではありません。

で、もし「Class1 配列を COM オブジェクトの参照の配列として VBScript に渡したい」ということなら

Public Function Method1() As <MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VarEnum.VT_DISPATCH)> Class1()

てな感じなんじゃないでしょうか。


引用返信 編集キー/
■21913 / inTopicNo.6)  Re[3]: [マーシャリング] クラスオブジェクト配列
□投稿者/ 渋木宏明(ひどり) (821回)-(2008/07/11(Fri) 18:06:04)
渋木宏明(ひどり) さんの Web サイト
2008/07/11(Fri) 18:09:04 編集(投稿者)

> #こういうセーフアレイだの何だのというCとかが絡むとこは微妙な知識なので頓珍漢なことを言ってるかもです。

まー、それもこれも含めて COM/OLE の既定範囲なので、COM 相互運用するならおさえておかねばなりません。

引用返信 編集キー/
■21922 / inTopicNo.7)  Re[4]: [マーシャリング] クラスオブジェクト配列
□投稿者/ まどか (562回)-(2008/07/11(Fri) 19:57:44)
> Public Function Method1() As <MarshalAs(UnmanagedType.SafeArray, SafeArraySubType:=VarEnum.VT_DISPATCH)> Class1()

ありがとうございます。
実はもう自宅なので月曜に試します。

#VBを起点としてCLSIDやタイプライブラリ周りとVTABLEくらいまでは知識としてありますが
#やはり仕組みそのものを丸ごと習得してないのでこういう細かいピンポイントでのゴールがなかなか。。。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -