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

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

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

Re[12]: 参照設定をしていない他プロジェクトのインスタンス生成


(過去ログ 65 を表示中)

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

■37732 / inTopicNo.1)  参照設定をしていない他プロジェクトのインスタンス生成
  
□投稿者/ tailer (9回)-(2009/06/29(Mon) 16:19:07)

分類:[.NET 全般] 

参照設定をしていない他プロジェクトのインスタンスを生成することは可能ですか?
Project1、Project2とがあり、互いに相手のプロジェクト内のインスタンスを生成するんですが、循環を起こすので参照設定ができないのです。
システムの仕様で、両者を同一プロジェクトにすることもできません。

よろしくお願いします。
引用返信 編集キー/
■37733 / inTopicNo.2)  Re[1]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ なちゃ (303回)-(2009/06/29(Mon) 16:26:20)
できますけど、その作成したインスタンスをどうやって操作するかとかは考えてますか?

引用返信 編集キー/
■37734 / inTopicNo.3)  Re[2]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (10回)-(2009/06/29(Mon) 16:34:20)
No37733 (なちゃ さん) に返信
> できますけど、その作成したインスタンスをどうやって操作するかとかは考えてますか?
>

現状そのインスタンスはFormなので、Show()やClose()などをつけて操作しようと考えています。
引用返信 編集キー/
■37735 / inTopicNo.4)  Re[1]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ επιστημη (2002回)-(2009/06/29(Mon) 16:36:05)
επιστημη さんの Web サイト
循環参照を解決するのが先でわないかと...

引用返信 編集キー/
■37737 / inTopicNo.5)  Re[2]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (12回)-(2009/06/29(Mon) 16:48:48)
AppDomain.CurrentDomain.GetAssembliesの中のAssemblyを巡回してそのGetTypeで目的のクラスの型を取得しようとしたり、Assembly.LoadFromで相手dllやexeからその型を取得しようとしたりしたんですが、結局どれも相手クラスの参照設定がないと機能しないんです。

循環参照をなくすために両者を同一プロジェクトにすれば手っ取り早いんですが、システムの規則でそれができません。
引用返信 編集キー/
■37738 / inTopicNo.6)  Re[3]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ 渋木宏明(ひどり) (1180回)-(2009/06/29(Mon) 16:54:45)
渋木宏明(ひどり) さんの Web サイト
> 循環参照をなくすために両者を同一プロジェクトにすれば手っ取り早いんですが、システムの規則でそれができません。

インターフェース定義だけを抜き出してクラスライブラリプロジェクトを作成し、それをそれぞれのプロジェクトで参照設定して解決するのがよくある手です。

引用返信 編集キー/
■37739 / inTopicNo.7)  Re[4]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (14回)-(2009/06/29(Mon) 17:05:06)
No37738 (渋木宏明(ひどり) さん) に返信
>>循環参照をなくすために両者を同一プロジェクトにすれば手っ取り早いんですが、システムの規則でそれができません。
>
> インターフェース定義だけを抜き出してクラスライブラリプロジェクトを作成し、それをそれぞれのプロジェクトで参照設定して解決するのがよくある手です。
>

具体的には、各クラス用に各々のインターフェースをつくり、各クラスはそれをImplementsする。
そのインターフェース群をライブラリとして一つのプロジェクトにし、各プロジェクトはそのインターフェースを介して他プロジェクトのインスタンスを作る、ということですか?
引用返信 編集キー/
■37740 / inTopicNo.8)  Re[5]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ επιστημη (2003回)-(2009/06/29(Mon) 17:11:08)
επιστημη さんの Web サイト
asmA ←→ asmB

改め:

Interface-asm
 ↑    ↑
asmA  asmB

ってことで。

引用返信 編集キー/
■37741 / inTopicNo.9)  Re[6]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (16回)-(2009/06/29(Mon) 17:16:28)
No37740 (επιστημη さん) に返信
> asmA ←→ asmB
>
> 改め:
>
> Interface-asm
> ↑ ↑
> asmA asmB
>
> ってことで。
>

すみません、もう少し詳しく聞かせてください。
まず、図の「asm」は何にあたるんですか?
引用返信 編集キー/
■37743 / inTopicNo.10)  Re[7]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ επιστημη (2004回)-(2009/06/29(Mon) 17:19:28)
επιστημη さんの Web サイト
> まず、図の「asm」は何にあたるんですか?

アセンブリ、要するにDLL。


引用返信 編集キー/
■37745 / inTopicNo.11)  Re[8]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (18回)-(2009/06/29(Mon) 17:27:20)
No37743 (επιστημη さん) に返信
>>まず、図の「asm」は何にあたるんですか?
>
> アセンブリ、要するにDLL。
>
>

asmAもasmBも、InterfaceをImplementsしているんですか?
具体的に、asmA内から、asmB内のインスタンスを作るには、どういった手順になるんでしょう?
引用返信 編集キー/
■37751 / inTopicNo.12)  Re[5]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ 渋木宏明(ひどり) (1181回)-(2009/06/29(Mon) 18:03:02)
渋木宏明(ひどり) さんの Web サイト
> 具体的には、各クラス用に各々のインターフェースをつくり、各クラスはそれをImplementsする。

プロジェクトまたぎで呼び出したい各クラスについて、ですね。

> そのインターフェース群をライブラリとして一つのプロジェクトにし、各プロジェクトはそのインターフェースを介して他プロジェクトのインスタンスを作る、ということですか?

インターフェースそのものをインスタンス化することはできないので、オブジェクトインスタンス他の生成は、相棒となるプロジェクトのアセンブリに対して行います。(実装はそこにあるので)

そして、相棒プロジェクトのアセンブリからインスタンス化したオブジェクトインスタンスの参照を(キャストして)定義済みのインスターフェース型の変数に代入して、その変数を介してメソッド呼び出しを行います。
引用返信 編集キー/
■37752 / inTopicNo.13)  Re[9]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ 渋木宏明(ひどり) (1182回)-(2009/06/29(Mon) 18:04:31)
渋木宏明(ひどり) さんの Web サイト
> 具体的に、asmA内から、asmB内のインスタンスを作るには、どういった手順になるんでしょう?

リフレクションを使います。

とりあえず、System.Reflection 名前空間のヘルプと解説をざっと読んでみてください。

引用返信 編集キー/
■37754 / inTopicNo.14)  Re[2]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ Jitta on the way (341回)-(2009/06/29(Mon) 18:17:26)
No37735 (επιστημη さん) に返信
> 循環参照を解決するのが先でわないかと...
>

賛成。
循環するのが単に参照しているという状態だけならいいのですが、生成するインスタンスが循環していそうな予感。


> 結局どれも相手クラスの参照設定がないと機能しないんです。

そんなこと有りません。デバッガーは、どうして参照していないアプリケーションの様々な情報を得ているのでしょうか。

今晩辺り、リフレクションを使ったコードをブログにエントリーする予定なのですが、かなり面倒ですよ。


プロジェクトを分けたいというのは、どういう理由でしょう?それによっては、プロジェクトを1つにする方がよいかも知れません。
引用返信 編集キー/
■37756 / inTopicNo.15)  Re[6]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (20回)-(2009/06/29(Mon) 18:45:59)
No37751 (渋木宏明(ひどり) さん) に返信
>>具体的には、各クラス用に各々のインターフェースをつくり、各クラスはそれをImplementsする。
> 
> プロジェクトまたぎで呼び出したい各クラスについて、ですね。
> 
>>そのインターフェース群をライブラリとして一つのプロジェクトにし、各プロジェクトはそのインターフェースを介して他プロジェクトのインスタンスを作る、ということですか?
> 
> インターフェースそのものをインスタンス化することはできないので、オブジェクトインスタンス他の生成は、相棒となるプロジェクトのアセンブリに対して行います。(実装はそこにあるので)
> 
> そして、相棒プロジェクトのアセンブリからインスタンス化したオブジェクトインスタンスの参照を(キャストして)定義済みのインスターフェース型の変数に代入して、その変数を介してメソッド呼び出しを行います。



次のように作りました。

○構成図
Project1 ┬ Form1
     └ (参照設定:IForm)
Project2 ┬ Form2
     └ (参照設定:IForm)
IForm ┬ IForm1
   └ IForm2


○IForm1
Public Interface IForm1
    Sub Show()
    Sub Close()
End Interface


○IForm2
Public Interface IForm2
    Sub Show()
    Sub Close()
End Interface


○Form1
Public Class Form1
    Implements IForm1

    Private Sub showForm2()
        Dim asm2 As Assembly = Assembly.LoadFrom("IForm.dll")
        Dim frm2 As IForm2 = CType(asm2.CreateInstance("Project2.Form2"), IForm2)  '(*1)
        frm2.Show()
    End Sub
End Class


○Form2
Public Class Form2
    Implements IForm2

    Private Sub showForm1()
        Dim asm1 As Assembly = Assembly.LoadFrom("IForm.dll")
        Dim frm1 As IForm1 = CType(asm1.CreateInstance("Project1.Form1"), IForm1)
        frm1.Show()
    End Sub
End Class


しかし、(*1)のところで、実際にはインスタンスは生成されず、frm2にはNothingしか入りません。
どこが悪いんでしょうか?

引用返信 編集キー/
■37757 / inTopicNo.16)  Re[3]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ tailer (21回)-(2009/06/29(Mon) 20:00:59)
No37754 (Jitta on the way さん) に返信
> ■No37735 (επιστημη さん) に返信
>>循環参照を解決するのが先でわないかと...
>>
> 
> 賛成。
> 循環するのが単に参照しているという状態だけならいいのですが、生成するインスタンスが循環していそうな予感。
> 
> 
>>結局どれも相手クラスの参照設定がないと機能しないんです。
> 
> そんなこと有りません。デバッガーは、どうして参照していないアプリケーションの様々な情報を得ているのでしょうか。
> 
> 今晩辺り、リフレクションを使ったコードをブログにエントリーする予定なのですが、かなり面倒ですよ。
> 
> 
> プロジェクトを分けたいというのは、どういう理由でしょう?それによっては、プロジェクトを1つにする方がよいかも知れません。


このシステムは

Project1 ┬ Form1
     └ (参照設定:Business)
Project2 ┬ Form2
     └ (参照設定:Business)
Business ─ Bus1

という構成をしていて、

○パターン1
Public Class Bus1
    Public Shared Sub openFrm(ByVal clsName As String, dllPath As String)
        Dim asm As Assembly = Assembly.LoadFrom(dllPath) '(*)
        Dim frmType As Type = asm.GetType(clsName)
        Dim frm As Form = CType(Activator.CreateInstance(frmType), GetType(frmType))
        frm.Show()
    End Sub
End Class

Public Class Form1
    Private Sub frm2open()
        Call Bus1.openFrm("Project2.Form2", "Project2.dll")
    End Sub
End Class


○パターン2
Public Class Bus1
    Public Shared Sub openFrm(ByVal clsName As String)
        Dim frmType As Type
        For Each asm As Assembly In AppDomain.CurrentDomain.GetAssemblies
            frmType = asm.GetType(clsName, False)
            If Not myType Is Nothing Then Exit For
        Next

        Dim frm As Form = CType(Activator.CreateInstance(frmType), GetType(frmType)) '(*)
        frm.Show()
    End Sub
End Class

Public Class Form1
    Private Sub frm2open()
        Call Bus1.openFrm("Project2.Form2")
    End Sub
End Class


といったパターンで試行錯誤していました。しかしいずれも、Project1にProject2への参照がないと、(*)のところで「ファイルまた
は依存関係が見つかりません」「(frmTypeに)Nullは設定できません」などとして落ちてしまうのです。参照を追加すると、うまく通
ります。
プロジェクトを分けるのは、管理面からだと思います。100を軽く超える画面数があり、システムの規約で1画面1プロジェクトと定め
られているため、そこに関しては私にはどうすることもできません。

引用返信 編集キー/
■37759 / inTopicNo.17)  Re[7]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ Jitta (581回)-(2009/06/29(Mon) 21:40:19)
No37756 (tailer さん) に返信

> しかし、(*1)のところで、実際にはインスタンスは生成されず、frm2にはNothingしか入りません。
> どこが悪いんでしょうか?

まず。ここ
> Dim frm2 As IForm2 = CType(asm2.CreateInstance("Project2.Form2"), IForm2)
を、分けてみましょう。

Dim ifrm2 As IForm2 = asm2.CreateInstance("Project2.Form2")

これで、ifrm2 が、nothing かどうか、確認を。

あとは、この辺
http://www.bing.com/search?q=%E6%96%87%E5%AD%97%E5%88%97+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9+vb&form=QBRE&filt=all
引用返信 編集キー/
■37764 / inTopicNo.18)  Re[4]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ なちゃ (304回)-(2009/06/29(Mon) 22:14:56)
まず、今回のはFormのShowやCloseを使うだけのようですから、自分でインターフェイスを作成する必要はありません。
共通のインターフェイスの役割は、System.Windows.Forms.Formがはたすことができます。
※考え方としては同じです。

共通の操作はFormクラスで行えますので、キャストはFormにする必要があります。
共通の型にキャストすることで、参照しなくても操作することができます。

普通は、
Dim frmType As Type = Type.GetType("Project2.Form2, Project2")
Dim frm As Form = DirectCast(Activator.CreateInstance(frmType), Form)
frm.Show()
みたいな感じになります。

アセンブリ(dll)のロードと分けて書くなら、
Dim asm As Assembly = Assembly.Load("Project2")
Dim frmType As Type = asm.GetType("Project2.Form2")
Dim frm As Form = DirectCast(Activator.CreateInstance(frmType), Form)
frm.Show()
こんな感じです(別に分ける必要はありません)。

あと、特に理由がなければ、Assembly.LoadFrom(dllのパス)ではなく、
Assembly.Load(アセンブリ名)の方が無難です。


>あとは、この辺
http://www.bing.com/search?q=%E6%96%87%E5%AD%97%E5%88%97+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9+vb&form=QBRE&filt=all

何かあんまり参考にしない方が良いような…

引用返信 編集キー/
■37766 / inTopicNo.19)  Re[5]: 参照設定をしていない他プロジェクトのインスタンス生成
□投稿者/ なちゃ (305回)-(2009/06/29(Mon) 22:45:37)
>まず、今回のはFormのShowやCloseを使うだけのようですから、自分でインターフェイスを作成する必要はありません。

と書きましたが、インターフェイス云々の話が無意味だとか余計だという意味で書いたのではありませんので、念のため。
考え方は同じで、まず基本として身につけておくべき考え方です。
今回のはたまたまFormが共通インターフェイスの役割を果たせるので、自分で明示的に作成しなくてもすむ、というだけです。

引用返信 編集キー/
■37768 / inTopicNo.20)  Re[6]: 参照設定をしていない他プロジェクトのインスタンス生成
 
□投稿者/ tailer (23回)-(2009/06/30(Tue) 09:20:40)
No37766 (なちゃ さん) に返信
> >まず、今回のはFormのShowやCloseを使うだけのようですから、自分でインターフェイスを作成する必要はありません。
>
> と書きましたが、インターフェイス云々の話が無意味だとか余計だという意味で書いたのではありませんので、念のため。
> 考え方は同じで、まず基本として身につけておくべき考え方です。
> 今回のはたまたまFormが共通インターフェイスの役割を果たせるので、自分で明示的に作成しなくてもすむ、というだけです。
>


ご回答、ありがとうございます。アセンブリのロードから記述しました。
やはり、今の構成だと、未参照ではAssembly.Loadのところで「依存関係が見つかりません」と言われてしまいます。参照を加えると、解決します。
思うに、Assembly.Loadは、自プロジェクトのexeがあるフォルダ内から対象のアセンブリをロードしようとしているのではないかと思うのです。未参照の状態だと自プロジェクトフォルダ内に対象dllが作られないため、ロードできないのではないかと。なので、参照したとたん、ロードできるようになるのではないかと…
Assembly.LoadFileなどで、直接対象プロジェクトのフォルダ内のexeを絶対パスで指定すれば参照なしでも動きますが、プログラムでそのパスを固定指定するわけにもいきません。
結局、参照しないとリフレクションの機能は使えない?と感じました。正しいですか?間違ってますか?


あと、Show()などの定義があるインターフェースなんですが、どこかのサイトには「Formを継承したクラスなら、Show()などのメソッドはすでに実装済みということになる」とあったんですが、実際にformxxx.Designer.vbにImplementsすると、「Show()を実装する必要があります」とエラーが出て、

Public Overloads Show() Implements IForm.Show()
MyBase.Show()
End Sub

といったものを記述しなければならなくなります。これは、正しいですか?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -