Использование возвращающих значений из AC# .NET создано сборка компонентов как com+

StackOverflow https://stackoverflow.com/questions/4593763

Вопрос

До сих пор я сделал компонент в C# .net 4 и использую System.Enterpriseservices, чтобы сделать его видимым. Я хочу разработать бизнес -методы в C#, но мне все еще нужно получить доступ к ним от Classic 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 для тестирования Portuse.

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 объекта для словаря, например, но этот дикт кажется другим, чем сценарий. Дикция.

Я проверил CodeProject.com и StackOverflow весь день и не нашел никаких намеков, которые были в некоторых потоках на StackOverflow, где кто -то упомянул, что необходимо создать интерфейс Idispatch.

Таким образом, у кого -нибудь была такая же проблема, и он мог помочь мне или дать мне несколько подсказок, с которыми я могу продолжить?

Это было полезно?

Решение

  1. Урок: пусть .NET обрабатывает ваши маршалы :)

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

Это массив, к которому я могу получить доступ от VBScript. Подсказка в том, что должно быть объект [].

Теперь я продолжаю работать над решением для зазубренных массивов и словари ...

Другие советы

Передача массивов Com: Все типы управляемых массивов могут быть переданы в неуправляемый код из управляемого кода. В зависимости от управляемого типа и примененных атрибутов, массив можно получить в виде безопасного массива или массива C-стиля

Взгляните на эту статью:http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.80).aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top