Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM-объектами / 5 сообщений из 5, страница 1 из 1
02.02.2017, 12:12
    #39397128
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с COM-объектами
Покритикуйте обертку:
Код: 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.
    public class ComWrapper : IDisposable
    {
        public dynamic Obj { get; }

        public ComWrapper(string progId)
        {
            var typeFromProgId = Type.GetTypeFromProgID(progId);
            Obj = Activator.CreateInstance(typeFromProgId);
        }

        public void Dispose()
        {
            Marshal.ReleaseComObject(Obj);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var cw = new ComWrapper("Com.ProgId"))
            {
                cw.Obj.MakeSomeThing();
            }
        }
    }



Правильно освобождается COM объект? Какие еще проблемы могут здесь быть?
...
Рейтинг: 0 / 0
02.02.2017, 12:50
    #39397169
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с COM-объектами
refreg,

Неправильная реализация.

1. В Dispose необходимо проверять, что Dispose был уже ранее вызван и не выполнять ReleaseComObject
2. Свойство Obj должно проверять, не выполнялся ли Dispose, если выполнялся, выбросить исключение.
3. Не самая удачная идея, получать COM-объект в конструкторе, лучше сделать фабричный метод ComWrapper.Create, а конструктор сделать приватным.
...
Рейтинг: 0 / 0
03.02.2017, 11:08
    #39397914
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с COM-объектами
hVostt,

Взял диспоуз паттерн, добавил sealed, выкинул лишнее...
Вот что получилось:
Код: 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.
    public sealed class ComWrapper : IDisposable
    {
        public dynamic Obj { get; set; }

        private ComWrapper(string progId)
        {
            var typeFromProgId = Type.GetTypeFromProgID(progId);
            Obj = Activator.CreateInstance(typeFromProgId);
        }

        public static ComWrapper Create(string progId)
        {
            return new ComWrapper(progId);
        }
        
        private void Cleanup()
        {
            if (Obj == null)
                return;

            Marshal.ReleaseComObject(Obj);
            Obj = null;
        }

        public void Dispose()
        {
            Cleanup();
            GC.SuppressFinalize(this);
        }

        ~ComWrapper()
        {
            Cleanup();
        }
    }
...
Рейтинг: 0 / 0
03.02.2017, 13:29
    #39398118
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с COM-объектами
refreg,

Поправил:

Код: 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.
    public sealed class ComWrapper : IDisposable
    {
        private bool _disposed;
        private readonly dynamic _obj;

        public dynamic Obj 
        { 
           get 
           {
              if(_disposed) throw new ObjectDisposedException();
              return _obj;
           }
        }

        private ComWrapper(object obj)
        {
            _obj = obj;
        }

        public static ComWrapper Create(string progId)
        {
            var typeFromProgId = Type.GetTypeFromProgID(progId);
            var obj = Activator.CreateInstance(typeFromProgId);
            return new ComWrapper(obj);
        }
        
        private void Cleanup()
        {
            if(!_disposed)
            {
               _disposed = true;
               Marshal.ReleaseComObject(_obj);
            }
        }

        public void Dispose()
        {
            Cleanup();
            GC.SuppressFinalize(this);
        }

        ~ComWrapper()
        {
            Cleanup();
        }
    }
...
Рейтинг: 0 / 0
03.02.2017, 16:23
    #39398324
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с COM-объектами
hVostt,

Спасибо.

Правильно, я понимаю, что инициализация вынесена из конструктора, по причине возможного исключения. И, чтобы это иключение было не в конструкторе.
Или есть другие причины?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM-объектами / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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