2

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()
4

1 に答える 1

1

私が提案した SO 項目で説明したように、重複していたので、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 に SAFEARRAY を提供させる方法です。

于 2012-09-14T14:33:01.040 に答える