2

我尝试为 C# 方法创建 COM 组件,然后尝试使用 javascript 访问此方法。

我已经运行 GACUtil -i 和 Regasm /Codebase 命令来创建共享程序集,并成功注册到注册表中。这是我的 C# 方法,它为此返回一个 int[] 数组,我为此方法创建了一个 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>
4

1 回答 1

1

GetData返回一个数组。JavaScript 代码调用它 15 次,每次都将结果推送到另一个数组,称为nAllData(JavaScript 中的变量名称与 C# 中相同的事实无关紧要 - 它们是不相关的)。结果,您有一个包含 15 个元素的数组,其中每个元素又是一个数组(大概有 5500 个元素 - 无论GetData返回什么)。

实现中的循环GetData是没有意义的——函数在通过该循环的第一次迭代时返回。目前尚不清楚您要在那里实现什么。

最后,我不相信 JavaScript 可以直接使用安全数组(这就是我认为GetData最终由 COM 互操作表示的返回值的方式)。尝试这个:

var data = new VBArray(myComComponent.GetData(index)).toArray();
alert(data.length);
nAllData.push(data);
于 2013-08-20T13:11:46.583 回答