【发布时间】:2014-11-10 21:04:13
【问题描述】:
我们有一个基于 .NET 4 的服务,它自己托管一个带有回调的 WCF 服务。我们将此服务封装在公开 COM 对象的 .NET 4 dll 中。该服务被多种客户端使用,其中大多数是基于 .NET 的。
不幸的是,我们有一些无法更改的 VB6 客户端,并且在调用某些回调方法时会收到 AccessViolationExceptions。
服务的结构方式如下图所示。
MethodA由 VB6 客户端调用,通过 .NET dll 代理到 WCF 服务(尚未返回)
WCF CallbackA 调用提供枚举状态值
可能会调用 WCF CallbackB,需要 VB6 客户端进一步输入(此信息在 MethodA 开始时无法获取,会影响 MethodA 的结果)
方法A返回
CallbackA(效果很好,没有异常!)它是一个提供枚举的 OneWayOperation,VB 应用程序当前正在将此值写入 RichTextbox。
CallbackB(导致 AccessViolationException)是一种提供对象并期望返回具有两个基于值的属性的不同对象的方法。
我觉得这是尝试在与主线程不同的线程上创建 COM 对象时出现的某种问题(因为它当前挂在 MethodA 上)。不幸的是,我不确定如何纠正这个问题。我们可以控制服务中的代码、封装的 dll,我们可以就 VB6 客户端中的代码提供建议。
我们有自己的 VB6 测试应用程序,我们可以绕过 AccessViolation 错误....但它涉及注释掉回调方法中的任何代码(请参见下面的代码)我已经突出显示了如果留在其中导致异常的行“
Private Function ITerminalCallbackComClient_VerifySignature() As Long
Dim result As Long
'Not-Authorized = 0 and Authorized = 1'
result = 0
Dim msgResponse As Long
msgResponse = MsgBox("Signature Accepted?", vbYesNo + vbQuestion, "Signature Verification")
If msgResponse = vbYes Then
result = 1
End
End If
ITerminalCallbackComClient_VerifySignature = result
End Function
2014 年 11 月 13 日更新
回调在 Visual Studio 6 中调试时起作用。但只要我们“制作”示例项目,它就会在执行回调时崩溃。如果我们删除对 MsgBox 的引用并只映射回一个静态值,它会按预期工作。
我们已更新 COM 互操作的签名以删除所有对象引用,而不仅仅是返回 0 或 1 以避免对象命名问题。
我已经更新了上面的VB6回调代码。
回调合约
[CallbackBehaviorAttribute(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public abstract class PS_Terminal_Link_Callback : ITerminalCallback
{
public abstract long VerifySignature();
}
服务合同
[ServiceContract(CallbackContract=typeof(ITerminalCallback))]
public interface ITerminal
{
*MethodA*
}
【问题讨论】:
-
如果在
End If之后移动Dim request As New...行并从赋值中拆分声明(即,将Dim request As New...更改为Dim request As PS_Terminal...后跟Set request = New PS_Terminal...)会发生什么? -
我会尝试,但如果我删除所有对“请求”对象的引用,即使只使用 MsgBox 代码,它仍然会失败。如果我将所有涉及“请求”对象和 MsgBox 的行注释掉,该方法将执行并返回没有错误......不幸的是,这不是一个有效的修复。
-
谢谢。我认为只是将代码从
intResponse = MsgBox...注释到End If仍然失败?另外,定义ITerminalCallbackComClient.VerifySignature的代码(大概是.NET或COM)是什么? -
还是遇到这个问题,感谢建议,我已经添加了我在VB6端运行的更新代码以及Service合约和回调的定义。
标签: c# wcf vb6 com-interop sta