Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF
В большинстве случаев хватает и обычного COM объекта, учитывая, что в 8.х можно использовать события. Но иногда нужно использовать Глобальный Контекст для вызова глобальных функций, таких как Сообщить, NewObject и т.д. Кроме того, для использования форм нужен дескриптор окна 1С.
Это продолжение статей
Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент. http://infostart.ru/public/238584/
Там же лежат и исходники
.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия
http://infostart.ru/public/417830/
1C Messenger для отправки сообщений, файлов и обмена данными между пользователями 1С, вэб страницы, мобильными приложениями а ля Skype, WhatsApp
http://infostart.ru/public/434771/
Использование классов .Net в 1С для новичков
http://infostart.ru/public/448668/
- Описание
- Подробнее
Описание
Написанием ВК я занимаюсь давно. Но никогда не писал напрямую.
Я никогда не понимал, зачем нужен IlanguageExtender, когда есть IDispatch.
Давным-давно сделал ВК, которая загружает Объект Автоматизации, поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender.
Смысл её в том, что пишем обычный COM класс, но для превращения её в ВК добавляем только один метод InitFrom1C. Например
public void InitFrom1C(object Object1C)
{
try
{
EventTo1C = Object1C as IAsyncEvent;
if (SynchronizationContext.Current == null)
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
Sc = SynchronizationContext.Current;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
throw e;
}
}
И вызов из 1С
Сообщить(ПодключитьВнешнююКомпоненту("AddIn.AddInFromITypeInfo"));
РаботаССоккетом = новый("AddIn.AddInFromITypeInfo");
// Соккет=New COMОбъект("ДляОбменаДаннмиЧерезTCP");
// РаботаССоккетом.LoadOleObject(Соккет);
РаботаССоккетом.LoadOleObject("ДляОбменаДаннмиЧерезTCP");
Если ИспользоватьКПК Тогда
Попытка
РаботаССоккетом.ОткрытьАйПиПортСНомеромПорта(ТСПАйПиНомерПорта);
Исключение
Сообщить("Нужно подключить новую TCPConnectTo1C.dll");
РаботаССоккетом.ОткрытьАйПиПорт();
КонецПопытки;
Сообщить(РаботаССоккетом.Команда);
Сообщить(РаботаССоккетом.ДанныеДляКоманды);
Если в 1С 7.7 через COMОбъект объект нельзя было в параметрах передавать объекты 1С и использовать out и ref параметры, то в восьмерке таких ограничений нет. И можно отказаться от обертки и передавать в Com объект только объект, передаваемый при вызове Init интерфейса IInitDone
public void Init([MarshalAs(UnmanagedType.IDispatch)]
object connection)
{
глобальныйКонтекст = connection;
Marshal.GetIUnknownForObject(глобальныйКонтекст);
}
Вот как это выглядит в 1С
врап=новыйCOMОбъект("NetObjectToIDispatch45");
Попытка
//Проверим зарегистрирована ли нужная версия NetObjectToIDispatch45
тест=НовыйCOMОбъект("AddIn.GlobalContext1C");
тест=Неопределено;
Исключение
ФайлNetObjetToIDispatch45=ЗаписатьМакет("NetObjectToIDispatch","NetObjetToIDispatch45");
ЗарегистрироватьDLL(ФайлNetObjetToIDispatch45);
КонецПопытки;
ФайлТестВК=ЗаписатьМакет("ТестВК");
Если ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C") Тогда
объект=Новый ("AddIn.GlobalContext1C");
ГлобальныйКонтекст=объект.ГлобальныйКонтекст;
AppDispatch=ГлобальныйКонтекст.AppDispatch;
AppDispatch.Сообщить("Привет");
Сообщить(AppDispatch.СтатусСообщения.Важное);
иначе
сообщить("Компонента не загружена");
КонецЕсли;
Кроме того, в 1С нельзя лего использовать Глобальный Контекст через AppDispatch
То есть AppDispatch.Сообщить(value)
ТипГК = ГК1С.GetType();
App1C = ГК1С.AppDispatch;
result = ТипГК.InvokeMember(binder.Name, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, App1C, new object[]{value}););
Для простоты использования я сделал оберку через
DynamicObject
Теперь можно легко использовать
public dynamic Новый( paramsobject[] Параметры)
{
return ГК.NewObject(Параметры);
}
public dynamic ПолучитьОписаниеТиповСтроки(int ДлинаСтроки)
{
return Новый(«ОписаниеТипов», «Строка», null, Новый(«КвалификаторыСтроки», ДлинаСтроки, ГК.ДопустимаяДлина.Переменная));
} // ПолучитьОписаниеТиповСтроки()
ГК.Сообщить(«Привет из ВК», ГК.СтатусСообщения.Важное);
Вот пример использования ГК и окон
Сборка=Врап.ЗагрузитьСборку(ФайлТестВК);
ТестВК=Сборка.GetType("ТестВК.ТестВК");
ТВК=Врап.СоздатьОбъект(ТестВК,ГлобальныйКонтекст);
Сообщить(ТВК.СоздатьОкно());
Использование окон WinForms и в особенности WPF позволяет использовать больший функционала, особенно при применении управляемого приложения.
Стоит отметить, что если для обычного приложения проходил такой код
