Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
_>>>Ты в этом примере демонстрируешь вообще другое. Возможность вызова .net кода из 1C. Ну так понятно что с этим нет проблем, если в 1C это специально предусмотрели. И с другими языками/платформами может быть аналогично. Непонятно что ты этим хотел показать.
S>> Нет это не в 1С предусмотрели, а в Net. http://infostart.ru/public/238584/
S>>А вот теперь покажи как можно использовать классы С++ раз это можно сделать аналогично.
S>>Я к тому, что написать код аналогично 1С на C# нет проблем.
_>Аааа, так оно ещё и через COM это делается... ) Тогда уж точно никакой разницы с другими языками нет, причём уже прямо сейчас. Т.е. банально реализуем соответствующий COM интерфейс и без проблем используем его в 1C. Не знаю правда зачем, но делается это тривиально. )))
Тебе нужно делать обертку Idispatch над объектом, типом. В Net это делается через Reflection к любому типу, объекту
Раз это элементарно забацайка. В той статье класс оборачивает любой объект, тип. Поддержка энумераторов.
Давай прямо сейчас.
Это еще раз подтверждение того, что ты невнимательно читаешь ссылки
Что было понятно то основной метод такой обертки для вызова свойства метода реального объекта.
public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] argsOrig, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters)
{ // Unwrap any AutoWrap'd objects (they need to be raw if a paramater)
if (name == "[DISPID=-4]")
{
return new EnumVariantImpl(((IEnumerable)O).GetEnumerator());
}
object[] args = ПолучитьМассивРеальныхОбъектов(argsOrig);
culture = CultureInfo.InvariantCulture;
// Invoke whatever needs be invoked!
object obj;
try
{
if (T.IsEnum && !((invokeAttr & BindingFlags.InvokeMethod) == BindingFlags.InvokeMethod))
return ОбернутьОбъект(Enum.Parse(T, name));
// if (ЭтоСемерка)
ПроверитьНаДоступКПолям(ref invokeAttr, args.Length);
if (ЭтоТип)
obj = T.InvokeMember(name, invokeAttr, binder, null, args, modifiers, culture, namedParameters);
else
obj = T.InvokeMember(name, invokeAttr, binder, O, args, modifiers, culture, namedParameters);
}
catch (Exception e)
{
ПоследняяОшибка = e;
string Ошибка = "Ошибка в методе " + name + " " + e.Message + " " + e.Source;
if (e.InnerException != null)
Ошибка = Ошибка + "\r\n" + e.InnerException.ToString();
if (ВыводитьСообщениеОбОшибке)
{
MessageBox.Show(Ошибка);
MessageBox.Show(e.StackTrace);
MessageBox.Show(invokeAttr.ToString());
}
throw new COMException(Ошибка);
}
// Так как параметры могут изменяться (OUT) и передаются по ссылке
// нужно обратно обернуть параметры
УстановитьИзмененияВМассиве(argsOrig, args);
return ОбернутьОбъект(obj);
}