Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.
Здравствуйте, Аноним, Вы писали:
А>Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.
Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: .NET object --> _ComObject
От:
Аноним
Дата:
18.03.10 10:23
Оценка:
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, Аноним, Вы писали:
А>>Как привязать объект к текущему потоку? Я обрабатываю вызов в потоке выполнения неуправляемого кода, но хочу вернуть реализацию интерфейса, которая будет автоматически синхронизирована с другим .NET потоком.
TK>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель.
Все подобное уже перепробовал. На выходе — исходный .NET object.
Здравствуйте, Аноним, Вы писали:
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 не будет пытаться проверить "а что же там находится")
Непонятно как этот объект после отдать в вызывающий код.
Сигнатура метода —
Здравствуйте, Аноним, Вы писали:
TK>>Вам надо сделать marshal в исходном потоке, после этого, сделать unmarshal в вызывающем и вернуть полученный указатель. А>Все подобное уже перепробовал. На выходе — исходный .NET object.
Возможно причина в том, что Вы выполняете маршаллинг и демаршаллинг в потоках, входящих в один апартамент. Попробуйте выпонить маршаллинг в STA-потоке, а демаршаллинг — в другом STA или MTA.
Здравствуйте, 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 — что-то интересное, но проблему не решает, не привязывается он к создающему потоку. Попробую еще его вручную отмаршалить, но врядли будет результат.