1

根据您可以在网上找到的指南(例如来自 rick strahls 博客),我们为 foxpro(9 和 SP)创建了一个 .net (3.5) COM 控件

现在有时在 foxpro 中,我们在释放对象时会得到 C000005。

所以我们试图重现这个场景。当实例化和释放对象一百/千次时,我们得到了同样的错误。

我们使用一个空的 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 Speicher zu lesen oder zu schreiben。Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist。在 System.Runtime.InteropServices.ComTypes.IAdviseSink.OnViewChange(Int32 aspect, Int32 index) 在 System.Windows.Forms.Control.ActiveXImpl.ViewChanged() 在 System.Windows.Forms.Control.ActiveXImpl.ViewChangedInternal() 在 System. Windows.Forms.Control.OnInvalidated(InvalidateEventArgs e)
北 System.Windows.Forms.Control.NotifyInvalidate(矩形 invalidatedArea) 北 System.Windows.Forms.Control.Invalidate(Boolean invalidateChildren)
北 System.Windows.Forms.Control.WmUpdateUIState(Message& m) 北 System.Windows.Forms.Control.WndProc(Message& m) 北 System.Windows.Forms.ScrollableControl.WndProc(Message& m) 北 System.Windows.Forms.ContainerControl .WndProc(Message& m) 在 System.Windows.Forms.UserControl.WndProc(Message& m) 后面是 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ActiveXImpl.System.Windows 后面.Forms.IWindowTarget.OnMessage(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

这是一个已知问题吗?任何建议我们如何解决它?

4

1 回答 1

1

我们在生产环境中遇到过这个错误。

显然,从 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 对象作为通用“对象”引用传递,并且在大多数情况下必须使用反射访问。

于 2015-01-09T16:57:38.637 回答