powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как при позднем связывании подписаться на событие? (C# - COM-OLE)
2 сообщений из 2, страница 1 из 1
Как при позднем связывании подписаться на событие? (C# - COM-OLE)
    #38370771
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как при позднем связывании подписаться на событие? (C# - COM-OLE)

Из этого:
TestEarlyBinding
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
using System;
using System.Runtime.InteropServices;
using AutoCAD;

namespace TestEarlyBinding {
    class Program {
        static void Main(String[] args) {
            AcadApplication acad = (AcadApplication) Marshal.GetActiveObject("AutoCAD.Application");
            acad.BeginCommand += onBeginCommand;
            acad.EndCommand += onEndCommand;

            AcadDocument document = acad.ActiveDocument;
            document.ObjectAdded += onObjectAdded;
            document.ObjectErased += onObjectErased;

            Console.ReadKey();

            document.ObjectAdded -= onObjectAdded;
            document.ObjectErased -= onObjectErased;
            acad.BeginCommand -= onBeginCommand;
            acad.EndCommand -= onEndCommand;
        }

        private static void onObjectAdded(Object objectAdded) {
            if (objectAdded is AcadEntity) {
                Console.WriteLine("Добавлен объект. ID: " + (objectAdded as AcadEntity).ObjectID);
            }
        }

        private static void onObjectErased(int id) {
            Console.WriteLine("Удалён объект. ID  : " + id);
        }

        private static void onBeginCommand(String commandName) {
            Console.WriteLine("Начата команда: " + commandName);
        }

        private static void onEndCommand(String commandName) {
            Console.WriteLine("Закончена команда: " + commandName);
        }
    }
}


Получить что-то вроде этого:
TestLateBinding
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace TestLateBinding {
    class Program {
        static void Main(string[] args) {
            Object acad = Marshal.GetActiveObject("AutoCAD.Application");

            //собственно как написать подобие
            //acad.BeginCommand += onBeginCommand;

            Object document = getProperty(acad, "ActiveDocument");
            
            //document.ObjectAdded -= onObjectAdded;
        }

        #region property
        public static Object getProperty(Object target, String name) {
            return A_TYPE.InvokeMember(name, BindingFlags.GetProperty, null, target, null);
        }

        public static void setProperty(Object target, String name, params Object[] values) {
            A_TYPE.InvokeMember(name, BindingFlags.SetProperty, null, target, values);
        }
        #endregion

        #region invoke
        public static Object invoke(Object target, String name, params Object[] values) {
            return A_TYPE.InvokeMember(name, BindingFlags.InvokeMethod, null, target, values);
        }

        public static Object invoke(Object target, String name, ParameterModifier[] mod, Object[] values) {
            return A_TYPE.InvokeMember(name, BindingFlags.InvokeMethod, null, target, values, mod, null, null);
        }
        #endregion

        #region modifiers
        public static ParameterModifier[] modifiers(params bool[] values) {
            ParameterModifier[] parameterModifiers = new ParameterModifier[values.Length];
            for (int i = 0; i < values.Length; ++i) {
                parameterModifiers[i] = new ParameterModifier(1);
                parameterModifiers[i][0] = values[i];
            }
            return parameterModifiers;
        }

        public static ParameterModifier[] modifiers(int count) {
            ParameterModifier[] parameterModifiers = new ParameterModifier[count];
            for (int i = 0; i < count; ++i) {
                parameterModifiers[i] = new ParameterModifier(1);
                parameterModifiers[i][0] = true;
            }
            return parameterModifiers;
        }
        #endregion

        #region noise
        private static readonly Type A_TYPE = new Object().GetType();
        #endregion
    }
}


Или придётся менять подход?

Хотелось бы сохранить совместимость с MS.Net 2.
Позднее связывание нужно для того чтобы подключаться к разным версиям программы (Автокад).
...
Рейтинг: 0 / 0
Как при позднем связывании подписаться на событие? (C# - COM-OLE)
    #38371234
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал для .net 4 (с динамиками)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
using System;
using System.Runtime.InteropServices;

namespace TestLateBinding {
    class Program {

        static void Main(string[] args) {
            dynamic acad = Marshal.GetActiveObject("AutoCAD.Application");
            var beginCommand = new DelegateBeginCommand(onBeginCommand);
            var endCommand = new DelegateEndCommand(onEndCommand);
            acad.BeginCommand += beginCommand;
            acad.EndCommand += endCommand;

            dynamic document = acad.ActiveDocument;

            var objectAdded = new DelegateObjectAdded(onObjectAdded);
            var objectErased = new DelegateObjectErased(onObjectErased);
            document.ObjectAdded += objectAdded;
            document.ObjectErased += objectErased;

            Console.ReadKey();

            document.ObjectAdded -= objectAdded;
            document.ObjectErased -= objectErased;
            acad.BeginCommand -= beginCommand;
            acad.EndCommand -= endCommand;
        }

        delegate void DelegateObjectAdded(dynamic objectAdded);
        delegate void DelegateObjectErased(int id);
        delegate void DelegateBeginCommand(String commandName);
        delegate void DelegateEndCommand(String commandName);

        private static void onObjectAdded(dynamic objectAdded) {
            Console.WriteLine("Добавлен объект. ID: " + objectAdded.ObjectID);
        }
        
        private static void onObjectErased(int id) {
            Console.WriteLine("Удалён объект. ID  : " + id);
        }
        
        private static void onBeginCommand(String commandName) {
            Console.WriteLine("Начата команда: " + commandName);
        }

        private static void onEndCommand(String commandName) {
            Console.WriteLine("Закончена команда: " + commandName);
        }
    }
}

...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как при позднем связывании подписаться на событие? (C# - COM-OLE)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]