2010-12-21 43 views
3

我们一直在解决以下问题,并且正在寻找一些新的想法或攻击角度。COM Interop和.NET 3.5的问题 - 调试和发布模式下的不同行为

第一种方案:

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

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

当Web应用程序构建在发布模式下时,每次调用这些传统VB6组件时,遗留代码都会在子程序堆栈深处抛出错误。它通常是这样的:

错误91对象变量或带块变量未设置[组件名称:ClassName.cls:方法名]

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

第二种情况:

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

如果.NET应用程序是以发布模式构建的,则对EXE的方法调用不会引发错误(据我所知),但未收到ActiveX EXE中应引发的用于指示成功的事件由.NET应用程序。

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

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

+0

我不知道如果你还在这个还是不挣扎,但如果你在这里是一些尝试。本页面:http://www.hanselman.com/blog/PermaLink.aspx?guid=a40c0d4f-66d0-4704-94f6-0efda4a44465讨论了如何更改调试和发布构建过程的属性。尝试使版本更像调试,并查看它是否有效,如果是的话,一次只更改一次。 – 2011-03-16 20:30:39

回答