Комментарии 12
Ну хаброкат же.
Кажется, вы забыли убрать под кат
Я <cut /> поставил
Спойлер в студию
Добавил вывод типов для дженерик методов
Теперь можно не выводить отдельно метод
Теперь можно не выводить отдельно метод
// public T ДженерикМетод<V, T>(V param1, T param2, V param3)
Сообщить(Тест.ДженерикМетод(1,"Привет",3));
//
//public V ДженерикМетод2<K, V>(Dictionary<K, V> param1, K param2, V param3)
Словарь= ъНовый("System.Collections.Generic.Dictionary`2[System.Int32,System.String]");
Сообщить(Тест.ДженерикМетод2(Словарь.ПолучитьСсылку(),3,"Привет2"));
// public K ДженерикМетод3<K>(IList<K> param1, int param2, K param3)
List=ъНовый("System.Collections.Generic.List`1[System.String]");
Сообщить(Тест.ДженерикМетод3(List.ПолучитьСсылку(),3,"Привет3"));
Добавил поддержку объектов с поддержкой IDynamicMetaObjectProvider
Для теста создад ExpandoObject
И наследника DynamicObject
Теперь можно вызвать на 1С
Для теста создад ExpandoObject
public object ПолучитьExpandoObject()
{
dynamic res = new ExpandoObject();
res.Имя = "Тест ExpandoObject";
res.Число = 456;
res.ВСтроку = (Func<string>)(() => res.Имя);
res.Сумма = (Func<int, int, int>)((x, y) => x + y);
return res;
}
И наследника DynamicObject
class TestDynamicObject : DynamicObject
{
public override bool TrySetMember(SetMemberBinder binder, object value)
{
return true;
}
// получение свойства
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
// вызов метода
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var res = new StringBuilder("{0}(");
var param = new object[args.Length + 1];
param[0] = binder.Name;
if (args.Length > 0)
{
Array.Copy(args, 0, param, 1, args.Length);
for (int i = 0; i < args.Length; i++)
{
res.AppendFormat("{{{0}}},", i + 1);
}
res.Remove(res.Length - 1, 1);
}
res.Append(")");
result = String.Format(res.ToString(), param);
return true;
}
}
Теперь можно вызвать на 1С
Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
// Это аналог структуры, но с поддержкой методов
РасширяемыйОбъект=ъ(Тест.ПолучитьExpandoObject());
Сообщить("ВСтроку="+РасширяемыйОбъект.ВСтроку());
Сообщить("Сумма=" + РасширяемыйОбъект.Сумма(1, 2));
Сообщить(РасширяемыйОбъект.Имя);
Сообщить(РасширяемыйОбъект.Число);
РасширяемыйОбъект.Имя="Новое Имя";
РасширяемыйОбъект.Число=768;
// Добавим новое свойство
РасширяемыйОбъект.НовоеСвойство="Новое Свойство";
Сообщить(РасширяемыйОбъект.Имя);
Сообщить(РасширяемыйОбъект.Число);
Сообщить(РасширяемыйОбъект.НовоеСвойство);
НовыйРеквизит=ъ(Врап.Новый("System.Dynamic.ExpandoObject, System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));
НовыйРеквизит.Имя="Новый Реквизит";
НовыйРеквизит.Значение=123;
РасширяемыйОбъект.НовыйРквизит=НовыйРеквизит.ПолучитьСсылку();
Сообщить(ъ(РасширяемыйОбъект.НовыйРквизит).Имя);
TestDynamicObject=ъТип("TestDllForCoreClr.TestDynamicObject, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
ДинамикОбъект=ъНовый(TestDynamicObject.ПолучитьСсылку());
ДинамикОбъект.УстановимЛюбоеСвойство="Чего то там";
Сообщить( ДинамикОбъект.ПолучитТоЧтоПередали);
Сообщить(ДинамикОбъект.ПолучитТоЧтоПередалиСПараметрами(1,3.45,ТекущаяДата()));
Сделал поддержку внешнего события
В классе создадим пле типа Action<string, string, string>
В 1С.
И не забыть в Переменных модуля установить
В классе создадим пле типа Action<string, string, string>
public class Тестовый
{
public Action<string, string, string> ВнешнееСобытие1С;
// И сделаем эмуляцию события.
public async void TestВнешнегоСобытия()
{
for(int i=0;i<100; i++)
{
var значение = i.ToString();
Task.Run(async() =>
{
await Task.Delay(1000).ConfigureAwait(false);
this?.ВнешнееСобытие1С("Тестовый", "ТестовоеСообщение", значение);
});
await Task.Delay(50).ConfigureAwait(false);
}
}
В 1С.
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Вставить содержимое обработчика.
Сообщить("Источник="+Источник);
Сообщить("Событие="+Событие);
Сообщить("Данные="+Данные);
КонецПроцедуры
Процедура ТестВнешнегоСобытияНажатие(Элемент)
// Вставить содержимое обработчика.
Тестовый=ъТип("TestDllForCoreClr.Тестовый, TestDllForCoreClr, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Тест=ъ(Врап.Новый(Тестовый.ПолучитьСсылку()," Свойство из Конструктора"));
Делегат=Ъ(Врап.ПолучитьДелегатВнешнегоСобытия1C());
Тест.ВнешнееСобытие1С=Делегат.ПолучитьСсылку();
Тест.TestВнешнегоСобытия();
КонецПроцедуры
И не забыть в Переменных модуля установить
Перем Тест;
В VS 2015 апдейт 3 появилась возможность создавать библиотеки и приложения под .Net Core
Вкладка
Шаблоны->Windows->.Net Core
Такой проект отличается от портативного.
В тестах добавил пример создания JObject и сериализации его в Json
Вкладка
Шаблоны->Windows->.Net Core
Такой проект отличается от портативного.
В тестах добавил пример создания JObject и сериализации его в Json
Про установку SDK и прочее можно посмотреть здесь
http://metanit.com/sharp/aspnet5/1.2.php
http://metanit.com/sharp/aspnet5/1.2.php
Добавил поддержку параметров по умолчанию
// Тест вызова метода с параметрами по умолчанию
// Тест вызова метода с параметрами по умолчанию
//public static int OptionalParam(int x, int y, int z = 5, int s = 4,string str="Привет")
// {
// return x + y + z + s;
// }
Сообщить("OptionalParam(int x, int y)="+Тестовый.OptionalParam(1,2));
Сообщить("OptionalParam(int x, int y, int z = 5)="+Тестовый.OptionalParam(1,2,3));
Сообщить("OptionalParam(int x, int y, int z = 5, int s,string str)="+Тестовый.OptionalParam(1,2,3,4,"ХаХа"));
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux