在.NET COM互操作中传递强类型参数

时间:2011-01-25 13:04:00

标签: c# .net com com-interop

我有两个通过COM互操作公开的.NET类 - 让我们说Foo和Bar,我需要将类型为Foo的参数传递给Bar中定义的方法。像这样:

[ComVisible(true)]
public class Foo
{
    // whatever
}

[ComVisible(true)]
public class Bar
{
    public void Method(Foo fff)
    {
        // do something with fff
    }
}

当我运行以下VBS(使用cscript.exe)时:

set foo = CreateObject("TestCSProject.Foo")
set bar = CreateObject("TestCSProject.Bar")
call bar.Method(foo)

我收到错误:

D:\test.vbs(3, 1) Microsoft VBScript runtime error: Invalid procedure call or argument: 'bar.Method'

但是,如果我将Method声明更改为:

    public void Method(object o)
    {
        Foo fff = (Foo)o;
        // do something with fff
    }
一切正常。我尝试了一些关于接口,属性等的魔法,但到目前为止还没有运气。

有什么见解?

非常感谢

2 个答案:

答案 0 :(得分:6)

确保定义GUID属性,如果你创建一个QueryInterface(VB可能),这是必需的。您必须为每个可见类生成一个新的唯一GUID。

[Guid("77777777-3333-40df-9C0D-2B580E7E1F3B")]
[ComVisible(true)]
public class Foo
{
}

然后我强烈建议为COM对象编写接口,并将ClassInterface设置为None,因此不会显示内部。你的类型库会以这种方式更加清晰。

[Guid("88888888-ABCD-458c-AB4C-B14AF7283A6B")]
[ComVisible(true)]
public interface IFoo
{
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("77777777-3333-40df-9C0D-2B580E7E1F3B")]
[ComVisible(true)]
public class Foo : IFoo
{
}

答案 1 :(得分:3)

在对同一个问题进行了一段时间的努力之后,我发现通过引用而不是通过值传递argments存在问题。见这里:

http://msdn.microsoft.com/en-us/library/ee478101.aspx

所以我只是将圆括号添加到VB Script中传递的参数中,它似乎解决了这个问题。所以在你的例子中,只是这样做:

Set foo = CreateObject("TestCSProject.Foo")
Set bar = CreateObject("TestCSProject.Bar")
Call bar.Method((foo))

应该按预期工作,而不必设置ClassInterface属性,也不使用Interfaces。