2010-05-31 5 views
1

Я пытаюсь реализовать одноэлементный класс, содержащий внутри него объект com. Класс реализует интерфейс IDisposable, но когда я пытаюсь реализовать метод финализации, я получаю исключение из доступа к ком-объекту из другого потока.Завершение объекта COM

Это происходит потому, что clr использует другой поток при завершении объектов.

Есть ли способ реализовать такую ​​вещь или, может быть, я просто делаю что-то неправильно?

ответ

3

Вам нужно всего лишь реализовать финализатор, если класс diectly управляет не управляемым ресурсом. COM-объект обернут в RCW (оболочка, вызываемая вызовом), поэтому уже существует управляемый тип между вашим типом и указателем интерфейса COM.

+0

Вы сказали, что вам нужно всего лишь реализовать финализатор, если ваш класс напрямую управляет не управляемым ресурсом. Вы также должны реализовать финализатор, если ваш класс содержит любой объект, который реализует IDisposable. – dewald

+0

hm давайте рассмотрим примеры Я использую Office.Interop для доступа к возможностям проверки орфографии Word , когда я закончил, мне нужно закрыть Word-приложение, поэтому я внедрил класс, содержащий экземпляр WordApplication, и хочу, чтобы он метод закрытия вызова при удалении или завершении, а проблема не в ресурсах, а в вызове метода закрытия экземпляра текстового приложения –

+0

@dewald: неверно. В этом случае реализуйте IDisposable, чтобы позволить вызывающим абонентам очищаться без ожидания GC. Но вы * не нуждаетесь в финализаторе: GC завершит вашу привязку к исходным ресурсам для ссылок (это является следствием правила, которое в финализаторе вы не можете использовать ссылочные управляемые объекты, потому что GC, возможно, уже уничтожил их). – Richard

Смежные вопросы