COM Interop 和 .NET 3.5 的问题 - 调试和发布模式下的不同行为
Posted
技术标签:
【中文标题】COM Interop 和 .NET 3.5 的问题 - 调试和发布模式下的不同行为【英文标题】:Issues with COM Interop and .NET 3.5 - different behaviors in Debug and Release mode 【发布时间】:2011-05-29 00:52:00 【问题描述】:我们一直在对以下问题进行故障排除,并正在寻找一些新的想法或攻角。
第一个场景:
我们有一个 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) 中,我们正在使用生成的互操作类。
当 Web 应用程序以发布模式构建时,每次调用这些旧版 VB6 组件时,旧版代码都会在子例程堆栈中相当深的位置引发错误。通常是这样的:
ERROR 91 Object variable or With block variable not set [ComponentName:ClassName.cls:MethodName]
当在调试模式下构建相同的 Web 应用程序代码时,会发生相同的错误,但它们是间歇性的。如果在 Web 应用程序中重复相同的操作 10 次(相同的输入,其他一切都相同),我们大约会看到一次问题。
第二种情况:
除了 Web 应用程序之外,我们还有一个针对 x86 构建的 .NET 3.5 C# 应用程序,它在 Windows Server 2008 R2(64 位)上作为 Windows 服务运行。此服务调用与网站使用的 DLL 相关的 ActiveX EXE(常见的遗留遗产和依赖项)。 ActiveX EXE 是使用 /regserver 开关注册的,并且引用添加到 .NET 项目。使用生成的互操作类。与 ActiveX EXE 的本质一样,方法调用在它们自己的线程中异步执行,并使用事件通知调用者完成。
如果 .NET 应用程序是在发布模式下构建的,对 EXE 的方法调用不会引发错误(据我所知),但是应该在 ActiveX EXE 中引发以指示成功的事件没有被.NET 应用程序。
如果在调试模式下构建相同的 .NET 应用程序代码,则该事件由 EXE 引发并由 .NET 应用程序接收/处理。
我将这些问题放在一起发布,因为它们都随着调试和发布版本的变化而变化,我的直觉是原因是相关的。目前,我们专注于垃圾收集的潜在问题和 ActiveX EXE 完成的进程外工作以及 Web 应用程序中的线程问题。欢迎任何关于我们应该调查的领域的想法。
【问题讨论】:
我不确定您是否还在为此苦苦挣扎,但如果您在这里,可以尝试一下。此页面:hanselman.com/blog/… 讨论了如何更改调试和发布构建过程的属性。尝试使发布更像调试,看看它是否有效,如果可以,一次将更改退回。 【参考方案1】:试试这个: BUG: "Object variable or With block variable not set" on ms support
【讨论】:
以上是关于COM Interop 和 .NET 3.5 的问题 - 调试和发布模式下的不同行为的主要内容,如果未能解决你的问题,请参考以下文章
COM Interop和Outlook - 让Outlook可见?
我在 .net 应用程序中找不到 microsoft.office.interop.excel
无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型