COM Interop和.NET 3.5的问题 - 调试和发布模式下的不同行为

时间:2010-12-21 19:28:45

标签: c# .net vb6 activex com-interop

我们一直在对以下内容进行故障排除,并正在寻找一些新的想法或攻击角度。

第一种情况:

我们有一个ASP.NET Web应用程序 - .NET 3.5,C#,内置定位x86 - 在IIS7 / Windows Server 2008 R2(64位)上运行。 ASP.NET Web应用程序在默认应用程序池下运行,启用了32位应用程序。

此Web应用程序利用一些用VB6编写的遗留组件并构建为ActiveX DLL。 DLL使用regsvr32注册。这些组件的引用被添加到Web应用程序项目(Visual Studio 2008)中,我们正在使用生成的Interop类。

当Web应用程序在发布模式下构建时,每次调用这些旧版VB6组件时,遗留代码都会在子例程堆栈中相当深地抛出错误。它通常类似于:

错误91对象变量或未设置块变量[ComponentName:ClassName.cls:MethodName]

当在调试模式下构建相同的Web应用程序代码时,会发生相同的错误,但它们是间歇性的。如果在Web应用程序中重复相同的操作10次(相同的输入,其他一切都相同),我们将大约一次看到问题。

第二种情况:

除了Web应用程序,我们还有一个针对x86构建的.NET 3.5 C#应用程序,该应用程序在Windows Server 2008 R2(64位)上作为Windows服务运行。此服务调用与网站使用的DLL相关的ActiveX EXE(常见的遗留遗产和依赖项)。使用/ regserver开关注册ActiveX EXE,并将引用添加到.NET项目中。使用生成的Interop类。与ActiveX EXE的本质一样,方法调用在它们自己的线程中异步执行,并使用事件通知调用者完成。

如果.NET应用程序是在发布模式下构建的,那么对EXE的方法调用不会引发错误(据我所见),但是在ActiveX EXE中应该引发的事件表明成功不会被.NET应用程序。

如果在调试模式下构建相同的.NET应用程序代码,则事件由EXE引发并由.NET应用程序接收/处理。

我将这些问题一起发布,因为它们都随着调试版本和发布版本而改变,我的预感是原因是相关的。目前,我们专注于垃圾收集的潜在问题以及ActiveX EXE完成的进程外工作以及Web应用程序中的线程问题。关于我们应该调查的领域的任何想法都将受到欢迎

1 个答案:

答案 0 :(得分:0)