How to access array in C# via VBS

VBS数据类型

  VBScript 只有一种数据类型,称为 VariantVariant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为 Variant 是 VBScript 中唯一的数据类型,所以它也是 VBScript 中所有函数的返回值的数据类型。

  最简单的 Variant 可以包含数字或字符串信息。Variant 用于数字上下文中时作为数字处理,用于字符串上下文中时作为字符串处理。这就是说,如果使用看起来象是数字的数据,则 VBScript 会假定其为数字并以适用于数字的方式处理。与此类似,如果使用的数据只可能是字符串,则 VBScript 将按字符串处理。

  例如 3.14“baidu”,VBS可以判断为double、string类型

  但数组类型的数据,VBS只能判断为varient()类型,如果在VBS环境下强行给C#中的double[](或者其他参数类型数组)字段赋值,将会出现“类型不匹配”的错误  

C# code

using System;
using System.Runtime.InteropServices;

namespace SinPhasePmeter
{
[ComVisible(true)]
public class Steady
{
private double a;
[ComVisible(true)]
public double A
{
get { return a; }
set { a = value; }
}
private double[] b;
[ComVisible(true)]
public double[] B
{
get { return b; }
set { b = value; }
}
private double d;
private double e;
private double f;
private double g;
[ComVisible(true)]
public double Acsteady()
{
double[] c = new double[b.Length];
for (int i = 0; i < b.Length; i++)
{
c[i] = Convert.ToDouble(b[i]);
}
InteropAssembly1.LabVIEWExports1.ACsteady(a, c, out d, out e, out f, out g);
return f;
}
}
}


VBS code

Dim buffer,myObj
Redim buffer((cint(testChannel.Size)))
Set myObj = CreateObject("SinPhasePmeter.Steady")
myobj.A = 100000
myobj.B = buffer
msgbox(myobj.Acsteady)

ERROR Message 

  我们知道在C#中,object是所有类型的基类,对基类型字段赋值不会报错

  因此将double[] b替换为object[] 

  C# code

        private object[] b;
[ComVisible(true)]
public object[] B
{
get { return b; }
set { b = value; }
}

    重新运行VBScript Code。。。得解

参考:http://stackoverflow.com/questions/9846077/calling-com-in-c-sharp-from-vbscript-with-array



 

  

posted on 2012-04-06 17:01  瘦肉微辣  阅读(290)  评论(0编辑  收藏  举报

导航