为什么对COM组件的调用仅使用VisualStudio QuickWatch窗口返回值?

时间:2011-11-21 14:53:39

标签: c# asp.net-mvc-3 com-interop

我目前在使用我的C#MVC3项目的com组件时遇到了一点点奇怪。

COM组件(名为YVPCUST)包含以下vb6例程:

Public Function GetDocument(ByVal a_sCode As Variant, ByRef a_sLocation As Variant, ByRef a_sDestination As Variant, ByRef a_sSuffix As Variant) As Integer
    Dim oSystem     As System

    Set oSystem = CreateObject("qtcsl32.System")
    GetDocument = oSystem.GetDocumentByRef(a_sCode, a_sLocation, a_sDestination, a_sSuffix)
    Set oSystem = Nothing

End Function

C#MVC3项目是使用COM组件层构建的,该组件层直接引用名为YVPCUST的组件:

qtcsl32.YVPCUST yvpCust = new qtcsl32.YVPCUST();

object code = (object)"RAAG";
object minimumAge = 0;
object maximumAge = 0;
object suffix = (object)string.Empty; //not to be used

int returnCode;

returnCode = yvpCust.GetDocument(code, minimumAge, maximumAge, suffix);

GetDocument()例程应该获得所提供代码的最大和最小年龄。但是,当我以编译或调试模式运行应用程序并跳过最后一行时,minimumAge和maximumAge值未正确设置,它们被设置为默认值0(无论重新执行此行的次数如何)。

但是,(在调试模式下)如果我在最后一行中断代码而不是使用QuickWatch运行该行,当我从QuickWatch窗口返回代码时,值将被设置为正确的最小和最大年龄。我将鼠标悬停在它们上面。

有没有人知道为什么会这样?

此COM组件用于应用程序中的其他各个位置(但不是此rountine),没有问题。

1 个答案:

答案 0 :(得分:0)

我意识到COM组件的C#包装器具有以下声明:

short GetDocument(object a_sCode, ref object a_sLocation, ref object a_sDestination, ref object a_sSuffix);

然后我意识到应该编写代码行(包括ref):

returnCode = yvpCust.GetDocument(code, ref minimumAge, ref maximumAge, suffix);

这并不能解释为什么它使用QuickWatch窗口,但我已设法获得所需的结果。