我尝试为C#方法创建COM组件,然后尝试使用javascript访问此方法。
我已经为创建共享程序集运行了GACUtil -i和Regasm / Codebase命令,并且还成功注册到了Registry中。 这是我为此返回int []数组的C#方法我为此方法创建了一个COM组件。 nChannelsCount = 15 ,用于for循环
[Guid("4794D615-BE51-4a1e-B1BA-453F6E9337C4")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IComOjbect))]
public class MyComObject : IComOjbect
{
}
[Guid("4B3AE7D8-FB6A-4558-8A96-BF82B54F329C")]
[ComVisible(true)]
public interface IComOjbect
{
[DispId(0x10000009)]
int[] GetData(int index);
}
但是当我在javascript中访问这个方法时,它只给了我15个,但我希望在Quick Watch中显示5500个计数。我不知道如何在javascript中执行此操作以获得此代码,但我仍然尝试以下javascript代码
<html>
<head>
<title>My Com Component</title>
<object id="myComComponent" name="myComComponent" classid="clsid:4794D615-BE51-4A1E-B1BA-453F6E9337C4">
</object>
<script language="javascript" type="text/javascript">
function MyComComponent_onload()
{
try {
var nAllData = [];
for (var index = 0; index < 15; index++)
{
nAllData.push(myComComponent.GetData(index));
}
alert(nAllData.length);
}
catch (err) {
alert(err.message);
}
}
</script>
</head>
<body onload="MyComComponent_onload();" onunload="MyComComponent_onunload();">
</body>
</html>
答案 0 :(得分:1)
GetData
返回一个数组。 JavaScript代码调用它15次,并且每次将结果推送到另一个名为nAllData
的数组(事实上,JavaScript中的变量名与C#中的相同是无关紧要的 - 它们是无关的)。结果,你有一个包含15个元素的数组,其中每个元素又是一个数组(大概是5500个元素 - 无论GetData
返回什么)。
GetData
实现中的循环是没有意义的 - 函数在通过该循环的第一次迭代时返回。目前尚不清楚你在那里想要达到的目标。
最后,我不相信JavaScript可以直接使用safearrays(我认为GetData
的返回值最终由COM interop表示)。试试这个:
var data = new VBArray(myComComponent.GetData(index)).toArray();
alert(data.length);
nAllData.push(data);