我们为foxpro(带SP的9)创建了一个.net(3.5)COM控件,根据您可以在web上找到的指南(例如,从rick-strahls weblog)
现在,有时在foxpro中,我们在释放对象时会得到C000005。
所以我们试着复制这个sceanrio。当实例化和释放对象成百上千次时,我们得到了相同的错误。
我们使用了一个空的FoxPro SCX表单,以及一个没有任何代码的简单.net按钮。
如果我们不处理.net对象,我们会得到类似的.net异常"试图读取或写入受保护的内存">
".(完整的例外情况见底部)
这里是VFP代码:
Local lnAnzahl as Number, ;
lni as Number
set procedure to DummyProcedure.prg
lnAnzahl = val(inputbox("wie oft", "oft","0"))
for lni = 1 to lnAnzahl
thisform.newobject("cntTest","netcontrol","c0005nativetest.vcx")
thisform.RemoveObject("cntTest")
endfor
.net错误消息
System.AccessViolationException:Es wurde versucht,im geschützten请说清楚。死亡在Hinweisdarauf,根据Speicher beschädigt的说法。beiSystem.Runtime.InteropServices.ComTypes.IAdviseSink.OnViewChange(Int32方面,Int32索引)beiSystem.Windows.Forms.Control.ActiveXImpl.ViewChanged()beiSystem.Windows.Forms.Control.ActiveXImpl.ViewChangedInternal()beiSystem.Windows.Forms.Control.OnInvalidated(InvalidateEventArgs e)
bei System.Windows.Fforms.Control.NotifyInvalidate(矩形无效区域System.Windows.Forms.Control.Invalidate(布尔invalidateChildren)
bei System.Windows.Fforms.Control.WmUpdateUIState(Message&m)beiSystem.Windows.Forms.Control.WndProc(Message&m)beiSystem.Windows.Forms.ScrollableControl.WndProc(Message&m)beiSystem.Windows.Forms.ContainerControl.WndProc(Message&m)beiSystem.Windows.Forms.UserControl.WndProc(Message&m)beiSystem.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&m)beiSystem.Windows.Forms.Control.ActiveXImpl.System.Windows.Fforms.IWindowTarget.OnMessage(消息和amp;m) beiSystem.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&m)
bei System.Windows.Fforms.NativeWindow.Callback(IntPtr hWnd,Int32消息,IntPtr wparam,IntPtr lparam)
这是已知的问题吗?有什么建议我们可以解决吗?
我们在生产环境中遇到过这个错误。
显然,从VFP环境中真正释放.NET COM组件是不可能的:它一直保存在内存中,直到应用程序停止。
Rick Strahl为我们在这里遇到的问题提供了一个非常优雅的解决方案:
在Visual FoxPro 中托管NET运行时
链接到讨论这些问题的其他帖子,总结如下:
.NET运行时锁定到VFP:一旦加载了.NET COM组件,就无法完全卸载该组件。这意味着在.NET COM开发过程中,您必须关闭Visual FoxPro才能重新加载.NET COM组件。
.NET组件可能无法卸载相关资源:.NET垃圾回收器清理正在运行的.NET实例内部的对象和对象状态。这意味着当您删除一个对象时,实际对象及其相关资源可能会立即卸载。例如,如果加载一个具有关联内存缓冲区的位图对象,并简单地清除引用,则关联的内存缓冲区数据不会立即释放。如果可用,使用Dispose()方法可以帮助显式卸载相关资源。
并非所有类型都适用于Visual FoxPro:当通过COM访问时,某些数据类型(特别是值类型和某些专用集合类型)在Visual FoxPro中不起作用。此外,从COM传递给Visual FoxPro的某些数组类型不能修改,也不能与新的或已删除的元素一起发送回。
从FoxPro向.NET传递类型通常是不安全的:除非你有传递给.NET的VFP COM组件,否则你无法轻松地将在Visual FoxPro中创建的强类型对象传递给.NET。FoxPro对象作为通用的"对象"引用传递,在大多数情况下必须使用反射进行访问。