无法加载类型' XYZ'从装配

时间:2017-04-13 17:01:20

标签: vb.net

我写了一个相当简单的应用程序,它是一个MDI窗体。我为将要加载的不同表单动态构建菜单项。在单击菜单项时,我调用一个名为ShowForm的方法,将表单名称作为字符串传递。然后我尝试使用以下代码打开表单:

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'来自assembly' MyAssemblyName,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'

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

1 个答案:

答案 0 :(得分:1)

一个简单的mcve适用于带有Form1和Form2的winforms项目以及Form1中的代码,但带有

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

那有什么不同?很可能是名称空间问题。例如,如果在命名空间Foo中定义了Form2,那么上面的代码就会失败,但这可以正常工作

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

实际上,您的案例中的Application.ProductName取代了根命名空间。在我的示例中,WindowsApplication1WindowsApplication1.Foo分别是命名空间。

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

在我的示例中,可以找到并使用当前的Namespace(其中定义了Form)

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

并且恰好与程序集名称相同,默认情况下为

enter image description here

但您可能已在另一个命名空间中定义了您的子表单。如果是这种情况,那么创建一个带有保存命名空间的设置的表单加载器工厂可能是明智的。