如何将经典asp中的整数数组传递给c#COM对象?

时间:2012-09-14 09:38:48

标签: c# com asp-classic

我正在尝试将经典ASP中的整数数组传递给在C#中创建的DLL。

我有以下C#方法:

public int passIntArray(object arr)
{
    int[] ia = (int[])arr;
    int sum = 0;
    for (int i = 0; i < ia.Length; i++)
        sum += ia[i];

    return sum;
}

我已经尝试了很多方法将arr转换为int [],但没有取得任何成功。我的asp代码是:

var arr = [1,2,3,4,5,6];
var x = Server.CreateObject("dllTest.test");
Response.Write(x.passIntArray(arr));

我目前收到以下错误:

Unable to cast COM object of type 'System.__ComObject' to class type 'System.Int32[]'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.

有人能告诉我怎么做或告诉我不能这样做吗?

使用这个非常有用的页面上的代码http://www.add-in-express.com/creating-addins-blog/2011/12/20/type-name-system-comobject/我已经设法发现传递参数的类型是“JScriptTypeInfo”,如果它有用的话。

如果我添加:

foreach (object m in arr.GetType().GetMembers())
    // output m

我得到以下输出:

System.Object GetLifetimeService()
System.Object InitializeLifetimeService()
System.Runtime.Remoting.ObjRef CreateObjRef(System.Type)
System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()

1 个答案:

答案 0 :(得分:1)

SO item I suggested was a duplicate中所述,您可以更改您的ASP代码:

function getSafeArray(jsArr) 
{
  var dict = new ActiveXObject("Scripting.Dictionary");     
  for (var i = 0; i < jsArr.length; i++)     
    dict.add(i, jsArr[i]);     
  return dict.Items(); 
} 
var arr = [1,2,3,4,5,6]; 
var x = Server.CreateObject("dllTest.test"); 
Response.Write(x.passIntArray(getSafeArray(arr))); 

您还应该将C#方法签名更改为:

public int passIntArray(object[] arr) // EDITED: 17-Sept

public int passIntArray([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_I4)]  int[] arr)

关键是你并没有真正尝试从JavaScript到C#,你将从JavaScript转向COM:你只能连接C#DLL,因为它是ComVisible并且在COM注册表中注册了ProgID哪个Server.CreateObject可以查找。通过签名更改,您的DLL的COM公开接口将期望接收非托管SAFEARRAY,并且上面的脚本代码是一种使用COM Scripting.Dictionary作为一种自定义封送程序来提供JavaScript的方法。