从/向C#(非C)COM组件加载和传递JScript数组

时间:2014-01-06 02:17:35

标签: c# arrays com activex

我已经查看过jscript数组的教程,但还没有看到它。我看到类似问题,但涉及Win32代码而不是.NET。

想知道,如何在JScript和C#COM组件之间来回传递数组?

例如,我在C#COM中定义了两个属性,它们返回字符串和整数数组:

string[] HeaderLines { get; set; }
int[] ImagePixels { get; set; }

在我的test.js文件中:

...

var T = new ActiveXObject("Imager.Reader"); 
...    
var headerLines = T.HeaderLines;
WScript.StdOut.WriteLine("First HeaderLine:" + headerLines[0]);
var pixels = T.ImagePixels;
WScript.StdOut.WriteLine("First Pixel: " + pixels[0]);

错误是写出headerLines [0]的地方:C:\ temp \ test.js(12,1)Microsoft JScript运行时错误:'headerLines.0'为null或不是对象

如果我删除了test.js中的headerLines,那么我得到这个错误(基本上相同但是对于整数数组):C:\ temp \ test.js(12,1)Microsoft JScript运行时错误:'pixels。 0'为空或不是对象

我可以从非数组属性获得结果,也可以将值传递给其他方法,但不能传递给数组。我还需要将字符串和整数数组传递到我的C#COM组件中定义的方法:

bool Write(string filename, string[] headerLines, int[] pix, int width, int height);

我正在使用Visual Studio Express 2012 for Desktop在C#中创建COM部分。如果需要任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

Microsoft JScript引擎将JavaScript数组实现为IDispatchEx个对象。从C#开始,它们可以通过反射或dynamic对象(dynamic)进行操作,只能访问lengthpush()等属性和方法,但不能按指数参考实际要素)。例如:

<强> JavaScript的:

var T = new ActiveXObject("MySimulator.World"); 

var ar = ["a", "b", "c"];

T.MyFunction(ar);

<强> C#:

public void MyFunction(object array)
{
    dynamic dynArray = array;
    int length = dynArray.length;
    dynArray.push("d");

    SetAt(array, 1, "bb"); 

    Console.WriteLine("MyFunction called, array.length: " + length);
    Console.WriteLine("array[0]: " + GetAt(array, 0));
    Console.WriteLine("array[1]: " + GetAt(array, 1));
    Console.WriteLine("array[3]: " + GetAt(array, 3));
}

static object GetAt(object array, int index)
{
    return array.GetType().InvokeMember(index.ToString(),
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetProperty,
        null, array, new object[] { });
}

static object SetAt(object array, int index, object value)
{
    return array.GetType().InvokeMember(index.ToString(),
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetProperty,
        null, array, new object[] { value });
}

<强>输出:

MyFunction called, array.length: 3
array[0]: a
array[1]: bb
array[3]: d