Zac*_*ach 5 c# vb6 appdomain out-of-memory crystal-reports
这是重现错误的示例应用程序的链接:http : //sdrv.ms/17j2Ale
我有三个项目。一个是.NET 2.0 Windows Forms应用程序(.NET App),一个是VB6 Standard EXE应用程序(VB App),另一个是VB6 ActiveX DLL(VB DLL)。.NET 应用程序引用已注册的 VB DLL。这个 VB DLL 本质上是启动 Crystal Reports。VB 应用程序通过 Shell() 命令启动 .NET 应用程序。这是发生的事情:
如果我直接运行 .NET App,我可以毫无问题地打开 Crystal Reports 文档。但是,当 VB 应用程序通过 Shell() 命令启动 .NET 应用程序时,当 .NET 应用程序尝试打开 Crystal Reports 文档时,出现内存不足错误。
现在是关键 - 这在 Windows XP 上有效,但是当我们尝试在 64 位 Windows 7 中启动它时,我们遇到了这个问题。我相信一定有一个简单的解决方案。有接班人吗?
您可以跳到更新 5,我在那里缩小了问题的范围。
更新:我还尝试创建第二个 .NET 2.0 Windows 窗体应用程序(.NET Launcher),并通过以下方式启动 .NET 应用程序:
Process.Start(@"C:\Path\OtherApp.exe");
Run Code Online (Sandbox Code Playgroud)
当我尝试在 .NET 应用程序中打开 Crystal Reports 文档时,它仍然给我同样的内存不足错误。
更新2:由于更新 4 删除
更新3:所以今天我发现 .NET 应用程序在直接启动时能够打开报表的原因是因为我在 Visual Studio 中启动它。当我在 Visual Studio 之外尝试可执行文件时,错误返回。我注意到,从 2005 年开始,Visual Studio 开始使用 vshost.exe 来启动 Windows 应用程序以加快调试启动:http : //blogs.msdn.com/b/dtemp/archive/2004/08/17/215764。 aspx 当我禁用 vshost 功能时,返回内存不足错误。所以我想问题是,这个 vshost 进程在做什么使它可以在 Windows 7 上工作?
更新4:我能够使用调试信息编译 VB6 DLL,并将源代码和调试信息加载到 Visual Studio 中,并在 .NET 应用程序执行 VB6 代码时单步执行。Out of Memory 异常来自这一行:
Dim myForm As frmTheForm
Set myForm = New frmTheForm 'OOM Error right here
Run Code Online (Sandbox Code Playgroud)
所以在 vshost.exe 中,这个表单可以初始化,但不能没有它。
更新5:我已将问题缩小到 Crystal Reports ActiveX 查看器。我从头开始了一个新的 VB ActiveX DLL 项目,并且只从一个表单开始。这在各个方面都有效。然后我添加了 Crystal ActiveX Report Viewer Library 11.5 - 错误返回!它绝对是报表查看器。我听说这个问题可以通过简单的注册表调整来解决。
更新6:我使用了 Sysinternals 的 Procmon.exe 并生成了一个日志文件,可以在这里找到:
我找到了解决内存不足错误的解决方案;然而,这不是一个允许的解决方案。显然,这个问题在 crviewer.dll 的未来版本中得到了解决,但 Uher 先生在回答我的问题时非常明确地表示: http: //scn.sap.com/thread/3405856我们不允许使用由于许可限制,11.5 之后的版本。这似乎是他收到的一个常见问题。不幸的是,我们被迫接受将应用程序升级到.NET 的答复。如果其他人有足够的冒险精神尝试解决内存不足异常,我很乐意将上面的示例项目提供给任何希望尝试的人。祝其他感受到 CR 11.5 互操作支持痛苦的人好运。