2012-09-14 61 views
2

我想傳遞一個整數數組從經典ASP到在C#中創建的DLL。如何將傳統asp的整數數組傳遞給c#COM對象?

我有下面的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() 
+0

由於int []被Com Interop作爲SAFEARRAY編組,所以它基本上是以下副本:http://stackoverflow.com/questions/5910538/how-to-create-a-safearray-in-windows-jscript –

+0

如果它是重複的,那麼我不明白它,因爲我不知道如何採取答案,使我的代碼工作 – Graham

回答

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特性並使用ProgID在COM註冊表中註冊,Server.CreateObject可以查找。通過簽名更改,您的DLL的COM暴露的接口將期望收到非託管的SAFEARRAY,上面的腳本代碼是一種讓JavaScript提供一個的方法,使用COM Scripting.Dictionary作爲一種自定義封送拆收器。

+0

感謝您解釋它,但它不起作用。我收到錯誤: Microsoft.JScript運行時錯誤'800a000d' 類型不匹配 在Response.Write行。我把這一行分成了幾部分,它是導致錯誤的x.passIntArray位。將safearray變成一個變量可以正常工作。 – Graham

+0

按照上面我編輯的方法嘗試修改後的C#方法簽名,並查看是否成功調用了C#方法。然後您必須在方法內將元素轉換爲「int」。 (或者,您可以通過將您的C#方法參數歸屬於'[MarshalAs(UnmanagedType)'來幫助編組人員做正確的事情。SafeArray,SafeArraySubType = VT_I4)]') –

+0

我在哪裏放置屬性 - 我已經把它放在方法之前,它似乎很高興,但它不喜歡VT_I4 - 在當前的情況下不存在 – Graham