我有两个通过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
}
一切正常。我尝试了一些关于接口,属性等的魔法,但到目前为止还没有运气。
有什么见解?
非常感谢
答案 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。