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

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

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

Re[4]: 拡張プロバイダの実装とReflection


(過去ログ 126 を表示中)

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

■74963 / inTopicNo.1)  拡張プロバイダの実装とReflection
  
□投稿者/ nopnop (1回)-(2015/02/13(Fri) 18:17:54)

分類:[VB.NET/VB2005 以降] 

毎々参考にさせて頂いております。
nopnopと申します。

少し困ったことになってしまったのでお力を拝借させて頂きたく。。

前提・環境等
やりたい事
・拡張Providerを使用してコントロールへプロパティを後付で追加

面倒な前提
a.Mainのプロジェクトと、参照しているHoge.dllが存在。
b.対象となるコントロールはMain側、Hoge.dllの両方に存在。
c.開発言語はVB.NET(2005)

お聞きしたい事
1.こういった対象が複数のプロジェクトへ渡る場合、
  拡張Providerは、Main側とHoge.dll側のどちらに配置を考えられますか?
2.現在 今後もコントロールが増えることを踏まえ、
  Hoge.dll側に配置しようと下記の方法で実装しておりますが、2.4で詰まってしまっています。
  
  2.1 インターフェースを切り出すためのIHoge.dll を作成。Main、Hoge.dllはそれぞれIHoge.dllを参照
  2.1 IHoge.dll へ、CanExtendで対象コントロールを切り分ける処理を行う為の
      インターフェースIStyleCollectorとそのインスタンスを作成するIStyleFactoryを作成
  2.2 IStyleCollectorFactory の実装クラスStyleCollectorFactoryをMainへ実装
  2.3 Reflectionを使用してHoge.dll側からStyleCollectorFactoryをインスタンス化
  2.4 ExStyleCollector を IExStyleCollectorへキャストして処理を実施

このキャスト部分で、Main.StyleCollectorFactory を IHoge.IExStyleCollector へキャスト出来ないというエラーが発生してしまいます。

要は参照しているDLL側からMain側のクラスをインスタンス化して使える様にしたいのですが、この考え方自体が不味いのでしょうか・・・?

問題のキャスト部分のソース(抜粋)
Public Function getFactoryInstance() As IHoge.IStyleCollectorFactory
	Dim ass As Assembly = Nothing
	Dim facType As Type = Nothing
	ass = Assembly.LoadFrom("Main.exe")   ' 実際はExeファイルのフルパス
	facType = ass.GetType("Main.StyleCollectorFactory")
	Return CType(
			facType.InvokeMember(Nothing, System.Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing), _
			IHoge.IStyleCollectorFactory)   ' ここでエラー
End Function

以上、よろしくお願いいたします。

引用返信 編集キー/
■74964 / inTopicNo.2)  Re[1]: 拡張プロバイダの実装とReflection
□投稿者/ Azulean (437回)-(2015/02/13(Fri) 22:53:21)
No74963 (nopnop さん) に返信
> 2.1 インターフェースを切り出すためのIHoge.dll を作成。Main、Hoge.dllはそれぞれIHoge.dllを参照
> 2.1 IHoge.dll へ、CanExtendで対象コントロールを切り分ける処理を行う為の
> インターフェースIStyleCollectorとそのインスタンスを作成するIStyleFactoryを作成
> 2.2 IStyleCollectorFactory の実装クラスStyleCollectorFactoryをMainへ実装
> 2.3 Reflectionを使用してHoge.dll側からStyleCollectorFactoryをインスタンス化
> 2.4 ExStyleCollector を IExStyleCollectorへキャストして処理を実施

なぜ、Hoge から Main を見ないと解決できないのでしょうか?
その背景・理由が見えていません。

特定のコントロールだけ、拡張プロパティを提供したいのであれば、IHoge.dll に空のインターフェースでも公開させておいて、それを継承しているコントロールのみ拡張可能とするだけで事足りるように感じられます。
こういった単純なことではないのであれば、それが読み取れるように説明を加えていただきたいです。
(IStyleColelctor などの登場人物がどんな役割なのか不明であるため)

また、リフレクションで他のアセンブリを見るということはやめた方が良いです。
拡張プロパティということは、デザイナで実行される恐れのあるコードですから、Main.exe が正しく参照できるとは限りません。
デザイナで実行されるアセンブリは一時ディレクトリに勝手にコピーされるなど、ややこしいことがあるため。
引用返信 編集キー/
■75007 / inTopicNo.3)  Re[2]: 拡張プロバイダの実装とReflection
□投稿者/ nopnop (2回)-(2015/02/17(Tue) 19:53:32)
No74964 (Azulean さん) に返信

Azulean様
ご返信ありがとうございます。
間が空いてしまい、失礼いたしました。


> なぜ、Hoge から Main を見ないと解決できないのでしょうか?
> その背景・理由が見えていません。

ご指摘の通り対象コントロールに共通したIFを作って継承させてしまえば話が早いのですが、
いろいろと積み重なってきているプロジェクトであるため、旧来のコントロールに手を加えたくないという背景がありました。
(基底となるインターフェースやクラスにも存在理由が明確でない物が多いのです。。)

その代りにIStyleColector が対象コントロール別の処理クラスとなり、コントロールの情報収集と拡張機能を実装しています。
後はデザイナで起動する関係上、可能な限りDLLに収めた方がよいのでは、と思いMain側のクラスをインスタンスできないものかと試行錯誤していた次第です。

> また、リフレクションで他のアセンブリを見るということはやめた方が良いです。
> 拡張プロパティということは、デザイナで実行される恐れのあるコードですから、Main.exe が正しく参照できるとは限りません。
> デザイナで実行されるアセンブリは一時ディレクトリに勝手にコピーされるなど、ややこしいことがあるため。

やはりそうなのですね。。。リフレクションでのインスタンス生成は辞めておきます。
拡張プロバイダ自身をMain側に実装するのには(根拠のない)抵抗があるのですが、何か問題がありますでしょうか??



引用返信 編集キー/
■75008 / inTopicNo.4)  Re[3]: 拡張プロバイダの実装とReflection
□投稿者/ Azulean (438回)-(2015/02/17(Tue) 22:05:52)
No75007 (nopnop さん) に返信
>>また、リフレクションで他のアセンブリを見るということはやめた方が良いです。
>>拡張プロパティということは、デザイナで実行される恐れのあるコードですから、Main.exe が正しく参照できるとは限りません。
>>デザイナで実行されるアセンブリは一時ディレクトリに勝手にコピーされるなど、ややこしいことがあるため。
>
> やはりそうなのですね。。。リフレクションでのインスタンス生成は辞めておきます。
> 拡張プロバイダ自身をMain側に実装するのには(根拠のない)抵抗があるのですが、何か問題がありますでしょうか??

規模や構成次第ではないかと思います。
一般論として書けるものはない認識です。
引用返信 編集キー/
■75035 / inTopicNo.5)  Re[4]: 拡張プロバイダの実装とReflection
□投稿者/ nopnop (3回)-(2015/02/20(Fri) 18:45:55)
No75008 (Azulean さん) に返信
> 規模や構成次第ではないかと思います。
> 一般論として書けるものはない認識です。

Azulean 様
ご回答ありがとうございます。毎々レスが遅くて申し訳ございません。

結局DLL側のコントロール用の拡張プロバイダとMain側の拡張プロバイダを切り分けました。
Main側のコントロールに対しては独自処理が必要であるため、一旦これで良しとします。
後々開発されるコントロールに対しては、空のインターフェースを用意し、
共通処理で問題ないコントロールであればそちらを継承するようにしています。

一旦これにて解決にしたいと思います。ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -