c# - 当接收对象是 C# COM 对象并且函数具有接口(interface)作为参数时,VBScript 抛出异常

标签 c# com vbscript

这是我的 VBScript 代码

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

我收到以下消息:

Error: Invalid procedure call or argument: ‘Service.SetObject’ Code: 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) 当我改变接收对象的函数接口(interface)时,它也再次工作。

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

我已经试过了,还是不行。 此外, 如果接收者是 C++ COM 对象,我可以毫无问题地发送管理对象和非托管对象 如果接收者是 C# COM 对象,我只能在使用括号时传递管理对象

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

最佳答案

如果您使用对象,CLR 将接受 VBS 传递的 IDispatch 引用。 当您随后将其转换为您的接口(interface)类型时,CLR 将使用通常的 QueryInterface 方法。

当您这样标记参数时,您可能会很幸运:

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

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

关于c# - 当接收对象是 C# COM 对象并且函数具有接口(interface)作为参数时,VBScript 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6186209/

相关文章:

c# - 我刚刚开始使用 C#,遵循 freeCodeCamp.org 教程,我想知道为什么这段代码不起作用

c++ - com 对象和接口(interface)

c# - 如何调用 tlbexp 命令作为构建后事件以从 Visual Studio 2019 IDE 中的 C# EXE 导出类型库?

perl - XSLT 样式表适用于 vbs 脚本,但不适用于 Perl

c# - 重命名文件Powershell看不到

c# - 当依赖属性收到 xaml 更改时回调

c# - 让两个变量之一随机具有两个选项之一的更简单方法?

c# - 如果文件大小超过 50MB,WebClient 不会完全下载文件

c++ - 通过 IShellFolder 接口(interface)枚举打印机文件夹导致堆分配泄漏

command-line - 通过 VBS 带参数运行命令行