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

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

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

Re[7]: 継承マネージクラスのCOMへの公開


(過去ログ 41 を表示中)

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

■21400 / inTopicNo.1)  継承マネージクラスのCOMへの公開
  
□投稿者/ まどか (543回)-(2008/07/01(Tue) 16:58:46)

分類:[.NET 全般] 

現在、VB.NETで既存クラスライブラリのCOMへのラッパを作っていてVSとVB6のオブジェクトブラウザを行ったり来たりしています。

マネージ側の継承したクラスをVB6で見ると基底メンバが見えないようです。
基底メンバを派生クラスへ記述して平坦化するしかないという認識でよいのでしょうか。
それとも構造を維持したまま派生クラスのタイプライブラリに基底メンバを見えるようにさせる手段があるのでしょうか?

引用返信 編集キー/
■21401 / inTopicNo.2)  Re[1]: 継承マネージクラスのCOMへの公開
□投稿者/ ネタ好き (518回)-(2008/07/01(Tue) 17:13:51)
No21400 (まどか さん) に返信
> 現在、VB.NETで既存クラスライブラリのCOMへのラッパを作っていてVSとVB6のオブジェクトブラウザを行ったり来たりしています。
>
> マネージ側の継承したクラスをVB6で見ると基底メンバが見えないようです。
> 基底メンバを派生クラスへ記述して平坦化するしかないという認識でよいのでしょうか。
> それとも構造を維持したまま派生クラスのタイプライブラリに基底メンバを見えるようにさせる手段があるのでしょうか?
>

非常に難しい問題です。一つしか手段が思いつきません。
それは、基底クラスのポインタを派生クラスのプロパティかメソッドとして実装する事です。
でもそれは、オブジェクトのデザインとしては駄目で、セキュリティ上問題あるとすら思うのですが、
残念ながらその方法しか思いつきません。
この方法は最終手段なので、COMとの相互運用機能を探索するとよろしいかと。
引用返信 編集キー/
■21402 / inTopicNo.3)  Re[2]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (544回)-(2008/07/01(Tue) 17:25:35)
No21401 (ネタ好き さん) に返信
> それは、基底クラスのポインタを派生クラスのプロパティかメソッドとして実装する事です。
> でもそれは、オブジェクトのデザインとしては駄目で、セキュリティ上問題あるとすら思うのですが、

なるほど。
と思ってもやはり同じく嫌ですね。

> この方法は最終手段なので、COMとの相互運用機能を探索するとよろしいかと。

http://msdn.microsoft.com/ja-jp/library/7fa522sf.aspx
「念頭においてください」という捨て台詞で終わっている。。。

非派生クラスや列挙体はそのまんま使えるのでラッパ側でクローン宣言しなくていいのですが
継承クラスはだめですかねぇ。
引用返信 編集キー/
■21404 / inTopicNo.4)  Re[3]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (545回)-(2008/07/01(Tue) 17:28:40)
> 非派生クラスや列挙体はそのまんま使えるのでラッパ側でクローン宣言しなくていいのですが
> 継承クラスはだめですかねぇ。

一方、タイプライブラリはラッパだけにしたい(ActiveXオブジェクトはひとつ)、って気持ちもありますが。。。
引用返信 編集キー/
■21408 / inTopicNo.5)  Re[4]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (546回)-(2008/07/01(Tue) 17:46:59)
だめみたいですねぇ。。。

http://msdn.microsoft.com/ja-jp/library/8877bdk6.aspx
「継承階層のエクスポート」

引用返信 編集キー/
■21409 / inTopicNo.6)  Re[4]: 継承マネージクラスのCOMへの公開
□投稿者/ ネタ好き (519回)-(2008/07/01(Tue) 17:48:00)
No21404 (まどか さん) に返信
私もこの件についてあまり詳しくありませんので間違っているかもしれませんが、
どうやら、TLBファイルのクラスインタフェースの定義を上手く使用すれば出来るそうです。
一度派生クラスのクラスインタフェースを覗いてみてください。
問題解決の糸口がつかめるかもしれません。
引用返信 編集キー/
■21429 / inTopicNo.7)  Re[1]: 継承マネージクラスのCOMへの公開
□投稿者/ 渋木宏明(ひどり) (806回)-(2008/07/01(Tue) 19:18:06)
渋木宏明(ひどり) さんの Web サイト
> 基底メンバを派生クラスへ記述して平坦化するしかないという認識でよいのでしょうか。

あるいは、基底クラスと派生クラスの全メンバを含んだインターフェースを定義して、COM からはインターフェース経由でアクセスさせるとか。

そもそもで言うと、COM ならインターフェースの定義から始めるのが本スジです。
引用返信 編集キー/
■21433 / inTopicNo.8)  Re[2]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (547回)-(2008/07/01(Tue) 19:59:48)
> あるいは、基底クラスと派生クラスの全メンバを含んだインターフェースを定義して、COM からはインターフェース経由でアクセスさせるとか。

.NET側はそのままで、該当の型のインターフェースをラッパ側に作りキャストして引き渡すってことですね。
独自型だとプロパティ代入しなければなりませんが、キャストできるので天国と地獄ですね。

参考になりました。


引用返信 編集キー/
■21435 / inTopicNo.9)  Re[3]: 継承マネージクラスのCOMへの公開
□投稿者/ ネタ好き (522回)-(2008/07/01(Tue) 21:30:57)
2008/07/01(Tue) 21:31:18 編集(投稿者)

No21433 (まどか さん) に返信
先程書き忘れておりましたが、TLBファイルを調べるにはOLE/COM Object ViewerにTLBファイルをロードするのがいいそうです。そうすれば、基底クラスのインターフェイスが定義されている事を見ることが出来るそうです。その名前さえ分かれば、多分どうにかなると思います。
※普通はinterface _基底クラスの名前となっているらしいです。
引用返信 編集キー/
■21442 / inTopicNo.10)  Re[4]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (548回)-(2008/07/02(Wed) 09:13:25)
No21435 (ネタ好き さん) に返信
> 先程書き忘れておりましたが、TLBファイルを調べるにはOLE/COM Object ViewerにTLBファイルをロードするのがいいそうです。そうすれば、基底クラスのインターフェイスが定義されている事を見ることが出来るそうです。その名前さえ分かれば、多分どうにかなると思います。

ありがとうございます。
タイプライブラリを直接自作したことはありませんが、なんとなくです。
第三者の保守等考えるとなかなか採用できる方法ではありませんがねぇ。。。

#って、この方法では外のラッパ呼ぶ人へはいいんですが、結局ラッパと本体.NETの間で型の引渡しができませんよね。

解決済み
引用返信 編集キー/
■21443 / inTopicNo.11)  Re[5]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (549回)-(2008/07/02(Wed) 09:37:09)
> #って、この方法では外のラッパ呼ぶ人へはいいんですが、結局ラッパと本体.NETの間で型の引渡しができませんよね。

あれ?
平坦化したインターフェースを作っても.NETでそれを実装していなければ同じことか?>キャストできない

ということは、基底インターフェースと派生側のみインターフェースと双方を継承したインターフェースを作り
前者2つを.NET側に実装し、双方を継承したやつをCOMのインターフェースとするということですね。
やはり.NET側の手直しは必要ですね。>Implementsつけるだけですが。
引用返信 編集キー/
■21444 / inTopicNo.12)  Re[6]: 継承マネージクラスのCOMへの公開
□投稿者/ 魔界の仮面弁士 (774回)-(2008/07/02(Wed) 09:42:09)
No21443 (まどか さん) に返信
> 平坦化したインターフェースを作っても.NETでそれを実装していなければ同じことか?>キャストできない
コンバータ無しで単純キャストできるようにするならば、Implements 必須だと思います。たぶん。

> ということは、基底インターフェースと派生側のみインターフェースと双方を継承したインターフェースを作り
平坦化のために、シャドウイング メソッドを用意する事がありますね。
http://www5.plala.or.jp/atata/net/chap8.html
引用返信 編集キー/
■21446 / inTopicNo.13)  Re[6]: 継承マネージクラスのCOMへの公開
□投稿者/ 渋木宏明(ひどり) (807回)-(2008/07/02(Wed) 10:10:23)
渋木宏明(ひどり) さんの Web サイト
> ということは、基底インターフェースと派生側のみインターフェースと双方を継承したインターフェースを作り
> 前者2つを.NET側に実装し、双方を継承したやつをCOMのインターフェースとするということですね。

そゆことです。
引用返信 編集キー/
■21448 / inTopicNo.14)  Re[7]: 継承マネージクラスのCOMへの公開
□投稿者/ ネタ好き (523回)-(2008/07/02(Wed) 10:16:53)
ひとまず、派生したクラスにたいして、普通にClassInterface(ClassInterfaceType.AutoDual)属性を付けて試してください。今確認できないのですがこれでOKらしいです。
引用返信 編集キー/
■21452 / inTopicNo.15)  Re[7]: 継承マネージクラスのCOMへの公開
□投稿者/ まどか (550回)-(2008/07/02(Wed) 10:28:46)
1.キャスト方式

 ・.NET側の型に依存できる。
 ・.NET側の改修が必要。(インターフェースの作成とImplements)
 ・ラッパ側の中継ロジックが減りシンプルになる。

2.ラッパ側独自方式

 ・.NET側の型と切り離せるので独自のプロパティなどが実装できる。
 ・型の作成と中継プロパティ移送が必要。
 ・ほぼ全メンバにNewがともなうので遅い。

以上、単純Comラッパであればいいという要件と改修量を考慮し検討してみます。

ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -