Используя возвращаемые значения из aC# .net сделал сборку компонента как com+
До сих пор я сделал компонент в C# .NET 4 и использую System.EnterpriseServices, чтобы сделать его видимым COM. Я хочу разрабатывать бизнес-методы на C#, но мне все еще нужен доступ к ним из классического ASP (vbscript).
Пока все хорошо, все работает нормально (кроме перегрузки функций:)). Теперь я сделал тестовый класс, чтобы получить больше опыта с кодом возврата.
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 объект для словаря, например, но этот dict, кажется, отличается от Scripting.Dictionary.
Я проверил codeproject.com и stackru весь день и не нашел никаких подсказок, кроме какого-то потока в stackru, где кто-то упомянул о необходимости создания интерфейса IDispatch.
Таким образом, у кого-то когда-либо была такая же проблема, и она может помочь мне или дать мне несколько советов, с которыми я могу продолжить?
2 ответа
Урок: пусть.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