【问题标题】:.Net Winform Button as COM for FoxPro C00005 Error.Net Winform 按钮作为 FoxPro C00005 错误的 COM
【发布时间】:2012-11-25 13:13:51
【问题描述】:

根据您可以在网络上找到的指南(例如来自 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 方面,Int32 索引) bei System.Windows.Forms.Control.ActiveXImpl.ViewChanged() 贝 System.Windows.Forms.Control.ActiveXImpl.ViewChangedInternal() 贝 System.Windows.Forms.Control.OnInvalidated(InvalidateEventArgs e)
北 System.Windows.Forms.Control.NotifyInvalidate(矩形 无效区域) bei System.Windows.Forms.Control.Invalidate(布尔 invalidateChildren)
北 System.Windows.Forms.Control.WmUpdateUIState(Message& m) 北 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(消息& m) 北 System.Windows.Forms.Control.ActiveXImpl.System.Windows.Forms.IWindowTarget.OnMessage(消息& m) 贝 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)
北 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

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

【问题讨论】:

  • 看起来您在表单上使用了 ActiveX 控件。看起来它是越野车。请联系控件的供应商或作者以获得支持。
  • 我同意,可能是 activeX 控件的问题。如果您创建了此控件,请尝试将一些日志记录到该控件中,以查看是否可以捕获错误或问题。
  • 它的基本 .net 按钮只使comvisible 并设置适当的属性。
  • 你提到了 Rick 的博客。您可以编辑您的问题并粘贴一个链接供我查看。过去,我为 Web 目的构建了许多 VFP COM 控件,但不知道您尝试执行的上下文基础。

标签: .net com foxpro visual-foxpro


【解决方案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 实例内的对象和对象状态。这意味着当您删除对象时,实际对象及其相关资源可能会立即卸载。例如,如果您加载具有关联内存缓冲区的位图对象,并简单地清除引用,则关联的内存缓冲区数据不会立即释放。使用 Dispose() 方法(如果可用)可以帮助显式卸载相关资源。

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

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

【讨论】:

  • 经过大量的调查和与其他开发人员的大量讨论和测试,我们发现这个问题确实无法解决。我们还添加了一些改进行为的 Marshall.ReleaseCOMObject 代码。但与某些 .net 和 windows 版本有关的问题仍然存在。 Imo 作为总结最好的解决方案是结束使用 FoxPro。由于它不再受支持,因此没有任何新的错误修复,同时存在潜在的安全风险。
  • “最好的解决方案是停止使用 FoxPro” 同意 :) 但在产品开发会议上并不总是顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多