使用来自c#.net的返回值使组件构建为com +

时间:2011-01-04 12:50:34

标签: c# asp.net com+ servicedcomponent

到目前为止,我在C#.NET 4中创建了一个组件,并使用System.EnterpriseServices使其可见。我想用C#开发业务方法,但我仍然需要从经典ASP(vbscript)访问它们。

到目前为止一切顺利,一切正常(exept函数重载:))。 现在我做了一个测试类,以获得更多的返回代码。

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文件,用cscript.exe运行它来测试porpuse。

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个对象,例如但这个词典似乎与Scripting.Dictionary不同。

我整天检查了codeproject.com和stackoverflow,并没有找到任何提示在stackoverflow上执行某些线程,其中有人提到需要创建一个IDispatch接口。

所以任何人都有同样的问题,可以帮助我或给我一些提示,我可以继续吗?

2 个答案:

答案 0 :(得分:1)

  1. 课程:让.NET处理你的MarshalAs:)

    public object[] Read()    {      var retVal = new object[] {1,2,3};      return retVal;    }
    
  2. 这是一个我可以从vbscript访问的数组。线索是必须是对象[]。

    现在我继续研究锯齿状数组和字典的解决方案......

答案 1 :(得分:0)

  

将数组传递给COM:全部托管   数组类型可以传递给非托管   来自托管代码的代码。取决于   托管类型和属性   适用于它,阵列可以   作为安全数组或C风格访问   阵列

看看这篇文章: http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.80).aspx