Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当接收对象为C#COM对象且函数以接口作为参数时,VBScript引发异常_C#_Com_Vbscript - Fatal编程技术网

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

当接收对象为C#COM对象且函数以接口作为参数时,VBScript引发异常,c#,com,vbscript,C#,Com,Vbscript,这是我的VBScript代码 Set object= CreateObject("Demo. Object") Set service= CreateObject("Demo.ManageServer ") service.SetObject object 我得到以下信息: 错误:过程调用无效或 参数:“Service.SetObject”代码: 800A005 服务是C#COM对象 [ProgId("Demo.ManageServer")] [Guid("A4F0A0F0-9C0C-4C71

这是我的VBScript代码

Set object= CreateObject("Demo. Object")
Set service= CreateObject("Demo.ManageServer ")
service.SetObject object
我得到以下信息:

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

服务是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) 当我将函数的接口更改为接收对象时,它也会再次工作

您知道为什么在函数签名中使用显式类型时,VBScript会引发异常吗


我已经试过了,但不起作用。 此外 如果接收器是C++ COM对象,我就没有问题来发送管理和非托管对象。 如果接收者是C#COM对象,则只有在使用括号时,我才能传递manage对象

manageServer.PrintType(nativeObject) 如果没有括号,我将收到相同的异常
但如果我试图将非托管对象发送到非托管代码中,则没有任何帮助

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

当您将参数标记为以下内容时,您可能会很幸运:

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

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

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

当您将参数标记为以下内容时,您可能会很幸运:

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

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

请显示
IMyObject
的定义,至少显示
Demo.Object
类的概要。另外,您是否真的有一个空格(“Demo.Object”)?请显示
IMyObject
的定义,至少显示您的
Demo.Object
类的大纲。还有,你真的有空间吗(“Demo.Object”)?我已经试过了,但它不起作用。此外,如果接收器是C++的COM对象,那么如果管理器是C对象,则我可以发送管理和非托管对象。如果我使用括号管理器,打印对象(NATEVEOTION),则可以传递管理对象。如果没有括号,我会收到相同的异常,但如果我试图向非托管代码发送非托管对象nothing Help,我已经尝试过了,但它不起作用。此外,如果接收器是C++的COM对象,那么如果管理器是C对象,则我可以发送管理和非托管对象。如果我使用括号管理器,打印对象(NATEVEOTION),则可以传递管理对象。如果没有括号,我会收到相同的异常,但如果我试图向非托管代码发送非托管对象,则没有任何帮助