似乎随机崩溃的VB.NET和COM互操作问题

3

我正在考虑用VB 6重写一个全新的VB.NET应用程序。

该应用程序在终端服务下运行,并且大量使用COM。

由于某种原因,该应用程序存在随机的异常情况 -

  • 随机访问冲突错误(WinDbg异常分析指向像comdlg32.dll、mscorwks这样的dll)
  • 随机缓冲区溢出错误(同上)
  • 一般的随机错误 - 例如Form.Load中的这行代码有时会抛出异常 - Me.Icon = Resources.MyIcon

我已经遵循了所有可能的资源、垃圾回收、处理模式等方面的建议...但似乎没有任何好处。

我认为这可能是硬件问题。它在一个Win2k3虚拟机下运行,而且还在终端服务下运行。基本服务器操作系统是Win2k3,内存为64GB。服务器上有许多虚拟机,每个都运行自己的“东西”(Exchange等)。

要么是硬件问题,要么是.NET环境并不像人们想象的那样容易编程。

如果硬件得到验证(完全是另一回事),而应用程序仍然表现出这样的情况,那么这是否是一个可行的路线(更接近底层的重写)?

我不是虚拟机的铁粉,也怀疑它们的完整性。(特别是在大型服务器上。)

编辑 - 感谢所有人的回复。问题最终被确定为我的应用程序中的一个.NET .DLL没有针对x86代码进行定位。COM对象都是32位的,操作系统是64位的,因此我的.NET应用程序需要定位到32位。(这就解释了为什么我的示例VB6应用程序总是有效。不是我真的想走这条路。)


把它重写成COBOL语言。这样你所有的问题都能解决了。 - Shog9
@magrok 哇,伙计,你这是为了刺激而做的吗?:P - melaos
@melaos - 不确定你所说的“尖峰”是什么意思 - 如果你指的是在这里得分或其他什么东西,那么答案是否定的,我不在乎它们。 - user62572
@Shog9 - 嗯...是的,我想我会坚持使用VB6。 - user62572
我在虚拟机中使用Windows 2008和SQL 2008时遇到了几个问题,尤其是在SQL2008测试版期间。我们在SQL Server Management Studio中会出现“随机”的访问冲突。我认为这可能是在VMware环境下发生的。建议尝试在另一个虚拟机平台或硬件上运行? - MichaelGG
显示剩余3条评论
3个回答

1

0

所以您正在VM之一的终端服务下运行?同一VM上有多少其他TS用户?我更担心的是终端服务的奇特性而不是VM的奇特性。但是在VM上使用TS可能会受到很大的影响。通常我们会为可移植性/ DR或裸机用于TS机器使用单个VM。

什么COM对象?您肯定会打开更多的性能问题,因为您必须通过COM互操作来进行。如果COM对象本身在终端服务下表现不好...

好的,所以你在一台机器上有多个TS用户(现在暂时忘记VM)。如果那些COM对象表现得像他们拥有机器,因为每次只能有一个用户登录 - 突然发生。例如,假设一个COM对象(特别是像Corel或Word这样巨大的东西,其中COM对象是一个巨大子系统的接口)去读取一些配置文件或形状库之类的东西。通常,它是唯一正在执行此操作的对象,因此它永远不会被锁定或阻止任何东西。现在突然间,你有超过一个用户访问相同的(本地)文件。这与尝试从网络共享运行应用程序的问题类似。几乎可以发生任何本地机器资源可以被垄断的假设,例如配置文件、临时文件等,都必须假定其他用户可能会在相同的区域进行操作,并且具有设置的机器/应用程序区域和用户区域。

这种问题很难通过VB6轻易解决,因为它是第三方子系统内部的问题。你很可能会在单独的终端服务器会话中看到同样的问题 - 这正是为什么最初采用终端服务的早期采用者在许多应用程序方面都遇到了很多困难的原因。我们是重度Citrix用户,并且在一些早期版本中有一些应用程序是不能在Citrix上运行的。即使是表现良好的应用程序,也常常需要根据Citrix或Microsoft或供应商的推荐以特殊的方式进行安装。

主要是CorelDRAW/Illustrator自动化。5-10个用户。是的,TS在其中一个VM下运行。“如果COM对象本身在终端服务下不礼貌…”您能否详细说明一下…我认为这是一个巨大的问题。 - user62572

0

有没有可能您能够使用小应用程序重现问题?不使用虚拟机或终端服务?

现在嫌疑人的数量太多了。您可以得到一些指针,希望您意外地找到问题所在。如果您缩小范围,这里的某个人可能真的能够帮助您。

如果它仍然无法正常工作,那么将其重写为VB6将是一种可怕的浪费...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接