Object Variable or With Block Variable Not Set”(未设置对象变量或 With 块变量)
在 Microsoft Visual Basic .NET 中设置 Microsoft 组件对象模型 (COM) 组件的公用对象变量时,您可能会看到以下错误消息:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in microsoft.visualbasic.dll
Additional information:Object variable or With block variable not set
原因
在满足以下所有条件时可能会发生这种情况:
定义了 COM 组件中的公用变量。
变量为 Object 类型。
您可以在 Visual Basic .NET 中使用后期绑定引用此 COM 组件。
当您使用后期绑定访问该公用对象时,Visual Basic .NET 无法正确设置 BindingFlags 枚举。
BindingFlags 枚举用于指定一些标记,以控制绑定以及通过反射搜索成员和类型的方式。
替代方法
要解决此问题,请使用下列方法之一:
在 Visual Basic .NET 中使用早期绑定
在 Visual Basic .NET 客户端应用程序中使用早期绑定。由于您无须重建 COM 组件,所以这是最简单的解决方案。要在 Visual Basic .NET 中使用早期绑定,请使用设置对该组件的引用时生成的互操作程序集的类型名称定义对象变量。不要使用 Object 类型定义它。
当您使用“重现此问题的步骤”一节中的 Visual Basic .NET 代码示例时,请使用以下代码示例定义对象变量。
Dim obj1 As Project1.Class1
Set obj1 = New Project1.Class1
不要使用以下代码示例:
Dim obj1 As Object
Set obj1 = New Project1.Class1
在 COM 组件中定义公用属性过程
修改 Microsoft Visual Basic 6.0 COM 组件以使用公用属性过程设置并返回对象。而不要使用全局Object 变量。由于您必须修改原始的 Visual Basic 6.0 组件,所以此解决方案执行起来比较困难。为此,您可能不得不中止组件的二进制兼容性。
当您使用“重现此问题的步骤”一节中的 Visual Basic 6.0 代码示例时,使用以下代码示例在 Class1 类中定义公用属性过程以设置和检索对象变量。
Option Explicit
Private obj1 As Object
Public Property Get Obj() As Object
Set Obj = obj1
End Property
Public Property Let Obj(Object As Object)
Set obj1 = Object
End Property
状态
Microsoft 已经确认这是在“适用于”一节中列出的 Microsoft 产品中存在的错误。
更多信息
温馨提示:内容为网友见解,仅供参考