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

我已经看过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’是null或不是对象

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

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

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

Microsoft JScript引擎将JavaScript数组实现为IDispatchEx对象。 从C#开始,它们可以通过reflection或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调用,array.length:3
 array [0]:a
数组[1]:bb
数组[3]:d