微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当接收对象是C#COM对象并且函数具有接口作为参数时,VBScript引发异常

如何解决当接收对象是C#COM对象并且函数具有接口作为参数时,VBScript引发异常

| 这是我的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) 没有括号,我会收到同样的异常 但是,如果我尝试将非托管对象发送到非托管代码中,则无济于事     

解决方法

        如果使用对象,则CLR将接受VBS传递的IDispatch参考。 然后将其转换为接口类型时,CLR将使用常规的QueryInterface方法。 当您将参数标记为这样时,可能会很幸运:
 [DispId(1)]
 void SetObject ([UnmanagedType.Interface]IMyObject obj);
这应该告诉CLR,它将收到与IUnknown兼容的内容,并且应尝试使用QueryInterface将其转换为您的接口类型。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。