我已经查看过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部分。如果需要任何其他信息,请告诉我。
答案 0 :(得分:1)
Microsoft JScript引擎将JavaScript数组实现为IDispatchEx
个对象。从C#开始,它们可以通过反射或dynamic
对象(dynamic
)进行操作,只能访问length
,push()
等属性和方法,但不能按指数参考实际要素)。例如:
<强> 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