2011-01-04 8 views
1

として作成しました。私はC#でビジネスメソッドを開発したいが、それでも従来のASP(vbscript)からアクセスする必要がある。私はC#.NET 4でコンポーネントを作成し、System.EnterpriseServicesを使用してCOMを可視にするために、C#.NET製コンポーネントビルドからの戻り値をcom +

これまでのところ、すべて正常に動作します(exept関数のオーバーロード:))。 戻りコードでより多くのexpirienceを取得するためのテストクラスを作成しました。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.EnterpriseServices; 
using System.Management; 

namespace iController 
{ 
    /// <summary> 
    /// The tools class provides additional functions for general use in out of context to other classes of the iController. 
    /// </summary> 
    public class tools :ServicedComponent 
    { 

    #region publich methods 

    public bool TestBoolean() 
    { 
     return true; 
    } 

    public string TestString() 
    { 
     return "this is a string"; 
    } 

    public int TestInteger() 
    { 
     return 32; 
    } 

    public double TestDouble() 
    { 
     return 32.32; 
    } 

    public float TestFloat() 
    { 
     float ret = 2^16; 
     return ret; 
    } 

    public string[] TestArray() 
    { 
     string[] ret = {"0","1"}; 
     return ret; 
    } 

    public int[][] TestJaggedArray() 
    { 
     int[][] jaggedArray = new int[3][]; 
     jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 }; 
     jaggedArray[1] = new int[] { 0, 2, 4, 6 }; 
     jaggedArray[2] = new int[] { 11, 22 }; 
     return jaggedArray; 
    } 

    public Dictionary<string, string> TestDictionary() 
    { 
     Dictionary<string, string> ret = new Dictionary<string,string>(); 
     ret.Add("test1","val1"); 
     ret.Add("test2","val2"); 
     return ret; 
    } 

    #endregion 

    } 
} 

次に、単純なvbscriptファイルを作成して、ppuseをテストするためにcscript.exeを実行しました。

Dim oTools : Set oTools = CreateObject("iController.tools") 

WScript.StdOut.WriteLine TypeName(oTools.TestBoolean()) & " - " & oTools.TestBoolean() 
WScript.StdOut.WriteLine TypeName(oTools.TestString()) & " - " & oTools.TestString() 
WScript.StdOut.WriteLine TypeName(oTools.TestInteger()) & " - " & oTools.TestInteger() 
WScript.StdOut.WriteLine TypeName(oTools.TestDouble()) & " - " & oTools.TestDouble() 
WScript.StdOut.WriteLine TypeName(oTools.TestFloat()) & " - " & oTools.TestFloat() 

test = oTools.TestArray() 
WScript.StdOut.WriteLine TypeName(test) 
WScript.StdOut.WriteLine UBound(test) 

For i = 0 To UBound(test) 
    WScript.StdOut.WriteLine test(i) 
Next 

For Each item IN test 
    WScript.StdOut.WriteLine item 
Next 

test = oTools.TestJaggedArray() 
WScript.StdOut.WriteLine TypeName(test) 
For Each item IN test 
    WScript.StdOut.WriteLine test & " - " & test.Item(item) 
Next 

test = oTools.TestDictionary() 
WScript.StdOut.WriteLine TypeName(test) 
For Each item IN test 
    WScript.StdOut.WriteLine test & " - " & test.Item(item) 
Next 

何正常に動作します:

string, int, foat, double 

それは、配列、jaggedarrayや辞書に来るとき、私は型の不一致を取得します。 VarTypeは辞書の13オブジェクトです。このdictは、Scripting.Dictionaryとは異なるようです。

私はcodeproject.comとstackoverflowを一日中チェックしましたが、ヒントが見つかりませんでした。stackoverflowでいくつかのスレッドを実行しましたが、誰かがそこで言及したところでは、IDispatchインターフェイスを作成する必要があります。

誰も同じ問題を抱えていて、私が助けてくれるか、私に何かヒントを教えてもらえますか?

+0

私は全然、私は常にCOMオブジェクトは常にHRESULT'とそのC#の戻り値は、背後に変換します '返すと思っ動作することを驚いていますパラメータ内のシーン。 – Blindy

+0

あなたは、文字列、intなどが機能することを意味しますか?私はちょうど何が起こったのか試してみました。それ以外の場合は、byvalまたはbyreferenceパラメータを使用して簡単にC#メソッドを呼び出すことができます。 – YvesR

答えて

1
  1. レッスン:.NETは、あなたのMarshalAsを処理しましょう:)

    public object[] Read() {  var retVal = new object[] {1,2,3};  return retVal; } 
    

これは、vbscriptからアクセスできる配列です。手がかりは、オブジェクト[]でなければならないということです。今

私はギザギザの配列や辞書のためのソリューションに仕事に行く...

+0

良い方法:)。あなたは答えを受け入れたものとして設定するべきです – honibis

0

COMへの配列を渡す:すべて 配列型は、マネージコードからアンマネージド コードに渡すことができます管理。 マネージ型とそれに適用された属性 によっては、アレイは、セーフ配列として をアクセスすることができますまたはC-スタイル 配列

は、この記事を見てみましょう: http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.80).aspx

+0

私はこのことについてちょっとした作業をしました。これまでJaggedArraysはサポートされていません。しかし、通常のarrraysでは、私はそれらをvbscriptで動作させることはできませんでした。 VyrType = 8200はvbscriptではサポートされていません。だから、R&Dは続行しています... Dictionary をJSONハッシュ配列{:key => "value"}に変換する小さな関数DictToHashArrayを少し書いたので、誰かが興味があれば投稿できます。 – YvesR

+0

私の問題は実際にはもう少し特別なようです。 vbscriptエンジンはサポートしていません[返信:MarshalAs(UnmanagedType.SafeArray、SafeArraySubType = VarEnum.VT_BSTR)]公共オブジェクト[] TestArray() – YvesR

関連する問題