Я работаю над классическим 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;
}
Я исправил его следующим образом:
Похоже, что когда объект передается от классического 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.
Следующее должно работать (необходимо, конечно, ссылаться на 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);
}
...
}
Scripting.IDictionary
вместоScripting.DictionaryClass
.