2017-04-13 5 views
3

私はかなり簡単なアプリケーションを書いています。これはMDIウィンドウフォームです。私は動的に読み込まれるさまざまなフォームのメニュー項目を構築します。メニュー項目のクリックでも、ShowFormというメソッドを呼び出し、フォーム名を文字列として渡します。私は二行目の実行、次のエラーを取得アセンブリからタイプ 'XYZ'を読み込めませんでした

Dim strFullname As String = Application.ProductName & ".frm" & strFormName 
Dim typForm As Type = Type.GetType(strFullname, True, True) 
Dim CSFEMDIChild As Form = CType(Activator.CreateInstance(typForm), Form) 

:私は、次のコードを使用してフォームを開こうと

タイプをロードできませんでした「MyAssemblyName.frmInquiryEntry」アセンブリ「MyAssemblyName、バージョンから= 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null '

このエラーに関するその他の質問がありますが、そのほとんどはカスタムアセンブリへの参照があります。私はGACを見てきましたが、私はこのアプリケーションに関連しているようなアセンブリは見ません。 bin/x86/debugをクリアして、これらのアイテムをすべて再作成します。私はこのプロジェクトで既定のものを超えた参照はありません。何か案は?

+0

'frmInquiryEntry'はあなたが同じプロジェクトで自分で作成したフォームですか? –

+0

はい、正しいです。 –

+2

'GetType'のそのオーバーロードのTypeNameは、特別なフォーマットを持つ" Assembly Qualified Name "が必要です。この[documentation](https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname%28v=vs.95%29.aspx?f=255&MSPPError=-2147217396)を参照してください。 。 –

答えて

1

のWinFormsのForm1とForm2を持つプロジェクトとForm1の中にあなたのコードでうまくシンプルmcve作品が、

Dim strFullname As String = Application.ProductName & ".Form2" 

と何が違いますの?おそらくそれはネームスペースの問題です。 Form2のは、名前空間Fooで定義されている場合たとえば、その後、上記のコードは失敗したが、これは、ルート名前空間の行われている、あなたのケースで実際に

Dim strFullname As String = Application.ProductName & ".Foo.Form2" 

Application.ProductNameに動作します。私の例では、それぞれ WindowsApplication1WindowsApplication1.Fooが名前空間です。

それを知っているなら、名前空間を含める必要があります。

私の例では、(フォームが定義されている)現在の名前空間を見つけることができ、デフォルト

enter image description here

により、

Dim currentNamespace = GetType(Form1).Namespace 
Dim strFullname As String = currentNamespace & ".Foo.Form2" 

を使用し、アセンブリ名と同じであることを起こります

ただし、別の名前空間で子フォームを定義している可能性があります。この場合、名前空間を保持する設定でフォームローダーファクトリを作成することが賢明かもしれません。

+0

私の実際のアセンブリ名は 'AdQIC Dashboard'で、私のルートネームスペースは' AdQIC_Dashboard'です。 'AdQIC Dashboard'を作成した' Application.ProductName'を 'AdQIC_Dashboard'に置き換えたとき、2つのフォームは、私が期待したとおりに動作するようになりましたが、3つ目(プロジェクトで作成された元のフォーム、 )はいずれの文字列でも機能しません。どのようにこれらのフォームが作成された名前空間を決定するのですか? –

+0

待ち、気にしないでください。私はgettypeが何も返さなかった理由である3番目の形式の名前のスペルミスを犯しました。私はこれを答えとしてマークしています。これはまた、元のコードに戻ったときのアセンブリエラーのロードを解決しました。彼らの 'Assembly Name'と' Root Namespace'が同じであったため、私が見つけた例で働いた 'Application.ProductName'の理由が仮定されています。ちなみに、ルートネームスペースを返すメソッドがあるので、その文字列をハードコードする必要はありませんか?ああ、助けてくれてありがとう! –

+0

実際には、http://stackoverflow.com/a/96343/832052を参照してください。私が言ったように、あなたの名前空間のための設定でフォームローダーファクトリを作ることができます。設定はアプリケーションの設定やxmlファイルなどに保存できます。 – djv

関連する問題