【问题标题】:VBScript throw exception when the receiving object is C# COM object and the function has interface as parameter当接收对象是 C# COM 对象并且函数有接口作为参数时,VBScript 抛出异常
【发布时间】:2011-09-05 09:14:34
【问题描述】:

这是我的 VBScript 代码

Set object= CreateObject("Demo. Object")
Set service= CreateObject("Demo.ManageServer ")
service.SetObject object

我收到以下消息:

错误:无效的过程调用或 参数:'Service.SetObject' 代码: 800A005

Demo.Service 是 C# COM 对象

[ProgId("Demo.ManageServer")]
[Guid("A4F0A0F0-9C0C-4C71-AD58-A36F750D92FE")]
[ComVisible(true)]
public class MyServer :IMyServer
{
    public void SetObject (IMyObject obj) { … }     
}

界面:

[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
[Guid("B3ACBCAD-5ED3-4113-B9D2-FC67FA49012B")]
public interface IMyServer
{
     [DispId(1)]
     void SetObject (IMyObject obj);
}

注意:

1) 当我将“Nothing”作为参数发送给函数时,它可以正常工作

2) 当我改变函数的接口来接收对象时,它也再次起作用。

你知道为什么在函数签名中使用显式Type,VBScript会抛出异常吗?

我已经尝试过了,但它不起作用。 此外, 如果接收者是 C++ COM 对象,我可以同时发送管理对象和非托管对象 如果接收者是 C# COM 对象,我只能在使用括号时传递管理对象

manageServer.PrintType (nativeObject) 没有括号,我收到相同的异常 但是,如果我尝试将非托管对象发送到非托管代码中,则无济于事

【问题讨论】:

  • 请显示IMyObject 的定义以及至少您的Demo.Object 类的概要。另外,你那里真的有空间吗(“Demo.Object”)?

标签: c# com vbscript


【解决方案1】:

如果您使用 Object,CLR 将接受 VBS 正在传递的 IDispatch 引用。 然后,当您将其转换为您的接口类型时,CLR 将使用通常的 QueryInterface 方法。

当您将参数标记为这样时,您可能会走运:

 [DispId(1)]
 void SetObject ([UnmanagedType.Interface]IMyObject obj);

这应该告诉 CLR 它将接收与 IUnknown 兼容的内容,并且应该尝试使用 QueryInterface 将其转换为您的接口类型。

【讨论】:

  • 我已经尝试过了,但它不起作用。此外,如果接收者是 C++ COM 对象,我可以同时发送管理和非托管对象如果接收者是 C# COM 对象,我只能在使用括号 manageServer.PrintType (nativeObject) 时传递管理对象同样的异常但是如果我尝试将非托管对象发送到非托管代码中,则无济于事
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2011-06-27
  • 1970-01-01
  • 2016-10-12
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多