在VBA中使用AppDomain持久化自定义类对象

下面的想法形成这个答案我试图创build一个通用的持久性存储在Excel中使用VBA,但是在VBA重置后存储对象从存储检索存在问题。

作为一个简单的例子,假设我想持久化一个自定义类“MyClass”的实例:

'MyClass Public someText as String 

存储的简化版本:

 Public Sub Save() Dim x As MyClass: Set x = New MyClass x.initialized = True Dim domain As mscorlib.AppDomain Set domain = GetAppDomain() domain.SetData "x", x End Sub Public Sub Load() Dim y As MyClass 'alternative: Object Dim domain As mscorlib.AppDomain Set domain = GetAppDomain If IsObject(domain.GetData("x")) Then Set y = domain.GetData("x") 'Type mismatch error End If Debug.Print y.initialized 'Run-time error '-2147418105 (80010007)' End Sub Public Function GetAppDomain() As mscorlib.AppDomain Dim host As New mscoree.CorRuntimeHost host.Start Dim Unk As IUnknown host.GetDefaultDomain Unk Set GetAppDomain = Unk End Function 

当我连续运行保存和加载子我得到所需的输出(“真”)。 但是,如果我重置应用程序(在VBE中运行>重置),我得到一个types不匹配的错误。 当我将y的types更改为Object时,当尝试打印y.initialized时,出现“自动化”错误(运行时错误“-2147418105(80010007)”)

最初我试图有一个持续的字典在上面的链接,在这种情况下,我能够从字段回到字典,关键仍然在那里,但我无法将包含的对象回到它的原始类。

任何想法如何解决?