2017-04-13 53 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加载类型“MyAssemblyName.frmInquiryEntry”,版= 1.0.0.0,Culture = neutral,PublicKeyToken = null'

我已阅读与此错误有关的其他问题,但其中大多数都引用了自定义程序集。我已经看过GAC,但我没有看到任何与此应用程序相关的程序集。我已清除bin/x86/debug,以便重新创建所有这些项目。在这个项目中,我甚至没有任何引用超出默认值。有任何想法吗?

+0

'frmInquiryEntry'是你自己创建的一个表单,在同一个项目中? –

+0

是的,这是正确的。 –

+2

“GetType”重载的TypeName需要一个“Assembly Qualified Name”,它具有特殊的格式。请参阅此文档(https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname%28v=vs.95%29.aspx?f=255&MSPPError=-2147217396),了解如何构建一个。 –

回答

1

简单mcve作品只是用Form 1和Form并在Form1的代码中的WinForms项目很好,但与

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

那么,有什么不同?这很可能是名称空间问题。例如,如果窗体2在命名空间Foo定义,那么上面的代码会失败,但这个工程

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

其实,Application.ProductName你的情况正在发生根命名空间的。在我的例子中,WindowsApplication1WindowsApplication1.Foo分别是命名空间。

所以你需要包含名字空间,如果你知道的话。

在我的例子中,电流命名空间(其中表格被定义)可以被发现并使用

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

和碰巧是相同组件名,由默认

enter image description here

但很可能您已经在另一个命名空间中定义了您的子窗体。如果是这种情况,可以谨慎的做法是创建一个表单加载器工厂,其中包含一个保存名称空间的设置。

+0

我的实际程序集名称是'AdQIC Dashboard',我的根名称空间是'AdQIC_Dashboard'。当我用'AdQIC_Dashboard'替换'Application.ProductName'(产生'AdQIC Dashboard')时,其中的两个表格现在的工作方式与我预期的完全相同,但是第三个(在项目中创建的原始表单,其他两个稍后添加)不适用于任何字符串。我如何确定这些表单在哪些名称空间中创建的? –

+0

等一下,没关系。我拼错了第三种形式的名称,这就是gettype没有任何返回的原因。我将此标记为答案。这也解决了当我返回到原始代码时加载的汇编错误。我假设'Application.ProductName'在我找到的例子中起作用的原因是因为它们的'Assembly Name'和它们的'Root Namespace'是相同的。作为一个方面说明,是否有一种方法返回根名称空间,所以我不必硬编码该字符串?哦,谢谢你的帮助! –

+0

并非如此,请参阅http://stackoverflow.com/a/96343/832052。就像我说的,你可以用一个名字空间设置一个表单加载器工厂。设置可以存储在应用程序设置或XML文件或类似的。 – djv

相关问题