Каталог решений - Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF

Быстрое создание Внешних Компонент на C#. Примеры использования Глобального Контекста, IAsyncEvent, IExtWndsSupport, WinForms и WPF

Быстрое создание Внешних Компонент на 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 позволяет использовать больший функционала, особенно при применении управляемого приложения.


Стоит отметить, что если для обычного приложения проходил такой код

 

has been added to your cart:
Оформление заказа