として作成しました。私は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インターフェイスを作成する必要があります。
誰も同じ問題を抱えていて、私が助けてくれるか、私に何かヒントを教えてもらえますか?
私は全然、私は常にCOMオブジェクトは常にHRESULT'とそのC#の戻り値は、背後に変換します '返すと思っ動作することを驚いていますパラメータ内のシーン。 – Blindy
あなたは、文字列、intなどが機能することを意味しますか?私はちょうど何が起こったのか試してみました。それ以外の場合は、byvalまたはbyreferenceパラメータを使用して簡単にC#メソッドを呼び出すことができます。 – YvesR