Очень сложно ответить на этот вопрос без отладки реального кода, но я расскажу вам об одной проблеме, с которой я сталкивался в прошлом при взаимодействии с COM.
Одна возможность, которую вы можете захотеть развлечь, заключается в том, что сборщик событий освобождается GC. Когда вы присоединяете событие к объекту, это событие обычно выводит ссылку на атташе, и оба объекта не будут очищены GC, но когда у вас есть COM-объект, GC не обязательно знает об этой ссылке, и он может убрать один из предметов. Я сталкивался с этим в прошлом с автоматизацией Office через .net. Чтобы решить эту проблему, нужно сохранить ссылку на COM-объект и прикрепить к нему.
Например, это плохо:
public class Foo
{
public Foo(ICOMObject obj)
{
obj.Changed += OnChanged;
}
private void OnChanged(object arg)
{
}
}
Это будет прекрасно работать, если obj
является объектом .net. Событие останется подключенным до тех пор, пока на один из объектов останутся ссылки. Однако это не будет работать с COM-объектом. С COM-объектом, событие, кажется, просто перестает работать в какой-то момент времени, обычно довольно быстро.
Вместо этого попробуйте это:
public class Foo
{
ICOMObject obj;
public Foo(ICOMObject obj)
{
this.obj = obj;
this.obj.Changed += OnChanged;
}
private void OnChanged(object arg)
{
}
}
Я не уверен, что это ваша проблема, но это может быть. Удачи!