.Net Winform按钮作为FoxPro C00005错误的COM

时间:2012-12-07 10:59:02

标签: .net com foxpro visual-foxpro

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

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

所以我们试图重现这个场景。当瞬间释放并释放对象时,我们得到了同样的错误。

我们使用了一个emptry 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,imgeschützten   Speicher zu lesen oder zu schreiben。 DiesisthäufiginHinweis   darauf,dass andererSpeicherbeschädigtist。北   System.Runtime.InteropServices.ComTypes.IAdviseSink.OnViewChange(的Int32   方面,Int32索引)bei   System.Windows.Forms.Control.ActiveXImpl.ViewChanged()bei   System.Windows.Forms.Control.ActiveXImpl.ViewChangedInternal()bei   System.Windows.Forms.Control.OnInvalidated(InvalidateEventArgs e)
  bei System.Windows.Forms.Control.NotifyInvalidate(Rectangle   invalidatedArea)bei   System.Windows.Forms.Control.Invalidate(Boolean invalidateChildren)
  bei System.Windows.Forms.Control.WmUpdateUIState(Message& m)bei   System.Windows.Forms.Control.WndProc(Message& m)bei   System.Windows.Forms.ScrollableControl.WndProc(Message& m)bei   System.Windows.Forms.ContainerControl.WndProc(Message& m)bei   System.Windows.Forms.UserControl.WndProc(Message& m)bei   System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)   北   System.Windows.Forms.Control.ActiveXImpl.System.Windows.Forms.IWindowTarget.OnMessage(消息&安培;   m)bei   System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,   IntPtr wparam,IntPtr lparam)

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

1 个答案:

答案 0 :(得分:1)

我们在生产环境中遇到此错误。

显然,无法从VFP环境中真正发布.NET COM组件:它将保留在内存中,直到应用程序停止。

Rick Strahl为我们遇到的问题提供了一个非常优雅的解决方案:

Hosting the NET Runtime in Visual FoxPro

...链接到讨论问题的其他帖子,总结如下:

  

.NET运行时锁定到VFP:   加载.NET COM组件后,无法完全卸载此组件。这意味着在.NET COM开发期间,您必须关闭Visual FoxPro以重新加载.NET COM组件。

     

.NET组件可能无法卸载相关资源:   .NET垃圾收集器清除运行的.NET实例内的对象和对象状态。这意味着当您删除对象时,实际对象及其相关资源可能会立即卸载。例如,如果加载具有关联内存缓冲区的Bitmap对象,并且只是清除引用,则关联的内存缓冲区数据不会立即释放。使用Dispose()方法(如果可用)可以帮助显式卸载相关资源。

     

并非所有类型都可以在Visual FoxPro中使用:   某些数据类型 - 特别是值类型和一些专门的集合类型 - 在通过COM访问时在Visual FoxPro中不起作用。此外,从COM传递到Visual FoxPro的某些数组类型无法修改并使用新元素或已删除元素发回。

     

将类型从FoxPro传递到.NET通常不是类型安全的:   除非您传递给.NET的VFP COM组件,否则您无法轻松地将在Visual FoxPro中创建的强类型对象传递给.NET。 FoxPro对象作为通用“对象”引用传递,在大多数情况下必须使用Reflection进行访问。