【发布时间】:2014-04-30 17:24:03
【问题描述】:
我在 VBSript 中定义了一个类:
Class Foo
Public i
End Class
我想将一个实例传递给用 C# 编写的 COM 对象:
Dim oCOMTEST : Set oCOMTEST = CreateObject("COMTests.Class1")
Dim oFoo : Set oFoo = new Foo
oFoo.i = 42
Call oCOMTEST.M(oFoo)
方法M定义为:
public void M(ref object foo)
目前该方法需要object,但我宁愿使用该方法
采用 C# 等效类型 Foo。其中,我尝试过更改object
到Foo,与
[StructLayout(LayoutKind.Sequential)]
public class Foo
{
[MarshalAs(UnmanagedType.U4)]
public int i;
}
但没有成功。因此我的问题是:
VBScript 类型 Foo 的封送 C# 版本的外观如何?
--
这是我的最小测试用例。
using System.Runtime.InteropServices;
namespace COMTests
{
[ComVisible(true)]
[Guid("4624071F-2D98-4ECC-8898-558F4D24EEC9")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IClass1
{
void M(ref object foo);
}
[ComVisible(true)]
[Guid("9F2B6958-742F-4E5D-A5F3-D6BDC6C841DB")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("COMTests.Class1")]
public class Class1 : IClass1
{
public void M(ref object foo)
{
System.Diagnostics.Debugger.Launch();
}
}
}
还有下面的VBScript:
Dim oCOMTEST : Set oCOMTEST = CreateObject("COMTests.Class1")
Dim oFoo : Set oFoo = new Foo
oFoo.i = 42
Call oCOMTEST.M(oFoo)
Class Foo
Public i
End Class
【问题讨论】:
-
好问题。在 VB6 中,除了在幕后为您创建 CLSID 之外,VB 还自动为您创建的每个类创建一个接口。您的
Foo类将获得一个自动的_Foo接口和一个关联的IID__Foo标识符(注意两个下划线)。我会假设 VBScript 会做类似的事情。 -
不能,脚本引擎只支持后期绑定。使用 dynamic 关键字是最好的。