.NET object --> _ComObject
От: Аноним  
Дата: 17.03.10 17:18
Оценка:
Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.
Re: .NET object --> _ComObject
От: TK Лес кывт.рф
Дата: 17.03.10 20:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.


Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: .NET object --> _ComObject
От: Аноним  
Дата: 18.03.10 10:23
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Аноним, Вы писали:


А>>Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.


TK>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.

Все подобное уже перепробовал. На выходе — исходный .NET object.
Re[3]: .NET object --> _ComObject
От: TK Лес кывт.рф
Дата: 18.03.10 11:39
Оценка:
Здравствуйте, Аноним, Вы писали:

TK>>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.

А>Все подобное уже перепробовал. На выходе — исходный .NET object.

А вы делайте unmarshal не в Object, а в IntPtr (тогда, .net не будет пытаться проверить "а что же там находится")
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: .NET object --> _ComObject
От: Аноним  
Дата: 19.03.10 10:44
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Аноним, Вы писали:


TK>>>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.

А>>Все подобное уже перепробовал. На выходе — исходный .NET object.

TK>А вы делайте unmarshal не в Object, а в IntPtr (тогда, .net не будет пытаться проверить "а что же там находится")

Непонятно как этот объект после отдать в вызывающий код.
Сигнатура метода —
ISomeInterface XYZ()


Менять на глухой указатель — .
Re[3]: .NET object --> _ComObject
От: Jolly Roger  
Дата: 19.03.10 11:12
Оценка:
Здравствуйте, Аноним, Вы писали:

TK>>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.

А>Все подобное уже перепробовал. На выходе — исходный .NET object.

Возможно причина в том, что Вы выполняете маршаллинг и демаршаллинг в потоках, входящих в один апартамент. Попробуйте выпонить маршаллинг в STA-потоке, а демаршаллинг — в другом STA или MTA.
"Нормальные герои всегда идут в обход!"
Re[5]: .NET object --> _ComObject
От: TK Лес кывт.рф
Дата: 19.03.10 15:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Менять на глухой указатель — .


Без "глухого указателя" вряд-ли выйдет. При выполнении unmarshal в "object" .net определит, что это managed объект и все вернется туда, откуда начали.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: .NET object --> _ComObject
От: Jolly Roger  
Дата: 19.03.10 17:54
Оценка:
Здравствуйте, TK, Вы писали:

А если унаследовать от StandardOleMarshalObject и создавать в STA-потоке, не поможет?
"Нормальные герои всегда идут в обход!"
Re[7]: .NET object --> _ComObject
От: TK Лес кывт.рф
Дата: 20.03.10 00:03
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>А если унаследовать от StandardOleMarshalObject и создавать в STA-потоке, не поможет?


Попробуйте. Вопрос только в какой момент COM поймет что, объект из другого потока и все вызовы надо маршалить.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: .NET object --> _ComObject
От: Аноним  
Дата: 23.03.10 17:32
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, Аноним, Вы писали:


TK>>>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.

А>>Все подобное уже перепробовал. На выходе — исходный .NET object.

JR>Возможно причина в том, что Вы выполняете маршаллинг и демаршаллинг в потоках, входящих в один апартамент. Попробуйте выпонить маршаллинг в STA-потоке, а демаршаллинг — в другом STA или MTA.

Пробовал, конечно же. Подозреваю, что CLR использует информацию, которую сам же отдает через IMarshal. Как не крутил-вертел — в самом .NET-е получить прокси не получилось.

А вот StandardOleMarshalObject — что-то интересное, но проблему не решает, не привязывается он к создающему потоку. Попробую еще его вручную отмаршалить, но врядли будет результат.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.