Как передать классический ASP Scripting.Dictionary в библиотеку классов C # COM?

1

Я работаю над классическим ASP-приложением, которое мне было передано, с которым мне нужно работать. Я хотел бы использовать компонент, который находится только в.NET framework. Мне нужно создать библиотеку классов С#, которая может выполнять код.NET, который может быть вызван через COM на классическом ASP.

Я хотел бы перейти в классический словарь ASP в компонент С# com. Лучшим случаем было бы перевести словарь словарей. Я добавил Scripting.Dictionary из ком в качестве ссылки в моем коде на С#.

Вот мой текущий код.

Классический ASP:

Set test = Server.CreateObject("Reporting") 'This is my custom Object
Set dic = Server.CreateObject("Scripting.Dictionary")
dic.Add "Test", 1
test.GetReport 1, dic

С#:

public byte[] GetReport(int Report_Type_Requested, Scripting.DictionaryClass Report_Params)
        {
            try
            {
                return report.GetReport(Report_Params);
            }
            catch (Exception e)
            {               
                throw e;
            }                       
        }

Но когда я запускаю это, я получаю:

Message = "Unable to cast COM object of type 'System.__ComObject' to class type 'Scripting.DictionaryClass'. COM components that enter the CLR and do not support IProvideClassInfo or that do not have any interop assembly registered will be wrapped in the __ComObject ...

Я также пробовал это, и он, похоже, не сработал:

public byte[] GetReport(int Report_Type_Requested, Dictionary Report_Params)
            {
                try
                {
                    return report.GetReport(Report_Params);
                }
                catch (Exception e)
                {               
                    throw e;
                }                       
            }

Я думал, что это может сработать, но это говорит мне, что вы не можете его бросить:

public byte[] GetReport(int Report_Type_Requested, object Report_Params)
                {
                    try
                    {
                        return report.GetReport((Scripting.DictionaryClass)Report_Params);
                    }
                    catch (Exception e)
                    {               
                        throw e;
                    }                       
                }

Как я могу выполнить то, что я пытаюсь сделать?

Спасибо.

РЕДАКТИРОВАТЬ:

Я попытался использовать IDictionary следующим образом: "Invalid Procedure call or argument":

 public byte[] GetReport(int Report_Type_Requested, IDictionary Report_Params)
                    {
                        try
                        {
                            return report.GetReport(Report_Params);
                        }
                        catch (Exception e)
                        {               
                            throw e;
                        }                       
                    }

EDIT 2:

Я попытался использовать Scripting.IDictionary, чтобы указать его лучше. Я получил ту же ошибку "Неверный вызов или аргумент процедуры":

public byte[] GetReport(int Report_Type_Requested, Scripting.IDictionary Report_Params)
                        {
                            try
                            {
                                return report.GetReport(Report_Params);
                            }
                            catch (Exception e)
                            {               
                                throw e;
                            }                       
                        }

ИЗМЕНИТЬ 3:

Я добавил код для получения отчета. Я продолжаю изменять параметр GetReport во все, что я тестирую.

public byte[] GetReport(Scripting.IDictionary Report_Params)
        {
           return null;
        }
  • 0
    Попробуйте Scripting.IDictionary вместо Scripting.DictionaryClass .
  • 0
    Так IDictionary для параметров функции? Затем я приведу его к словарному классу внутри функции или могу использовать его как обычно?
Показать ещё 9 комментариев
Теги:
dll
dictionary
asp-classic
com

2 ответа

0
Лучший ответ

Я исправил его следующим образом:

Похоже, что когда объект передается от классического ASP к COM-объекту, он ДОЛЖЕН быть передан как объект, поэтому окончательное определение:

public byte[] GetReport(int Report_Type_Requested, object Report_Params)

Чтобы передать этот объект объекту словаря, я узнал о классе маршала из googling: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.100).aspx

Создание линии, в которой я нуждался:

Scripting.DictionaryClass Report_Dictionary = (Scripting.DictionaryClass)Marshal.CreateWrapperOfType(Report_Params, typeof(Scripting.DictionaryClass));

Тогда я смог использовать словарь в своем коде.

Я также смог использовать эту технику для добавления ADODB.Recordsets через COM.

1

Следующее должно работать (необходимо, конечно, ссылаться на COM-объект Microsoft Scripting Runtime):

    public byte[] GetReport(int Report_Type_Requested, object Report_Params)
    {
        Scripting.Dictionary dic = (Scripting.Dictionary)Report_Params;
        foreach (string key in dic)
        {
            object value = dic.get_Item(key);
        }
        ...
    }
  • 0
    Это то, что дает мне «Невозможно привести COM-объект типа« System .__ ComObject »к типу класса« Scripting.DictionaryClass ». COM-компоненты, которые входят в CLR и не поддерживают IProvideClassInfo или у которых нет зарегистрированных сборок взаимодействия, будут быть завернутым в ошибку __ComObject ... "
  • 0
    В моем коде нет DictionaryClass
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню