以下是重现错误的示例应用程序的链接:
http://sdrv.ms/17j2Ale
我有三个项目.一个是.NET 2.0 Windows窗体应用程序(.NET App),一个是VB6标准EXE应用程序(VB App),另一个是VB6 ActiveX DLL(VB DLL). .NET App引用已注册的VB DLL.这个VB DLL基本上启动了Crystal Reports. VB App通过Shell()命令启动.NET App.这是发生的事情:
如果我直接运行.NET应用程序,我可以毫无问题地打开Crystal Reports文档.但是,当VB App通过Shell()命令启动.NET App时,当.NET App尝试打开Crystal Reports文档时,出现Out of Memory错误.
现在这里是踢球者 – 这适用于Windows XP,但是当我们尝试在Windows 7 64位中启动它时,我们遇到了这个问题.我确信必须有一个简单的解决方案.任何接受者?
您可以跳转到Update 5,在那里我缩小了问题范围.
更新:我还尝试创建第二个.NET 2.0 Windows窗体应用程序(.NET Launcher),并通过以下方式启动.NET App:
Process.Start(@"C:\Path\OtherApp.exe");
当我尝试在.NET App中打开Crystal Reports文档时,它仍然给了我相同的Out of Memory错误.
更新2:由于更新4而被删除
更新3:所以今天我发现.NET App在直接启动时能够打开报表的原因是因为我在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
所以在vshost.exe中,这个表单能够初始化但不能没有它.
更新5:我已将问题缩小到Crystal Reports ActiveX Viewer.我从头开始创建一个新的VB ActiveX DLL项目,只从一个表单开始.这在每个方面都有效.然后我添加了Crystal ActiveX Report Viewer Library 11.5 – 并返回错误!它绝对是报告查看器.我被告知这个问题可以通过简单的注册表调整来解决.
更新6:我使用了来自Sysinternals的Procmon.exe并生成了一个日志文件,可以在这里找到:
解决方法:
不确定这些信息是否有帮助,但过去我遇到过类似的问题,包括水晶和Web窗体应用程序.我通过确保应用程序池选中了“启用32位应用程序”选项来解决它?您可以在高级设置下找到它 – >一般….