2012-06-20 2 views
3

Теперь, когда в одном окне могут быть две CLR, как они могут «разговаривать» друг с другом?Как две .NET CLR, загруженные в один процесс, разговаривают друг с другом?

Предположим, что GUI работает под .NET 2.0 CLR и, например, существует сценарий, работающий на .NET 4.0 CLR, есть способ изменить основанный на 2.0 GUI из среды 4.0?

У меня именно этот вопрос, когда я использую эту технику, чтобы придать среду # REPL .NET C в другой процесс .net: Video: Injecting C# DLLs into Managed (C#) and Unmanaged (C++) processes


Примечание: Я задавал подобный question at Reddit and that version contains large number of references который будет полезен, если вы заинтересованные в теме параллельного выполнения и хоста CLR

+0

Лучше иметь правильный ответ правильно? –

+0

По ссылке, которую вы предоставляете, у меня есть первая проблема, которая заключается в доступе к одному CLR другому (обратите внимание, что я управляю только одним из них) –

ответ

1

Theres два основных способа: один из них слабо связан или плотно связан.

В слабосвязанной системе вы должны были бы использовать некоторые формы привязок (JSON, XML, SOAP) для передачи данных взад и вперед. Преимущество этой системы в том, что вы можете использовать другие программы в будущем, о которых вы, возможно, и не подумали, взаимодействовать с приложениями.

Другие способы жесткой связи вы можете использовать плагины или играть с помощью насоса сообщений Windows для отправки сообщений туда и обратно. Также обратите внимание на Windows Communication Framework

+0

Обратите внимание, что у меня нет доступа к приложению 2.0, то есть я не могу изменить его код (у меня есть полный контроль над кодом 4.0). Тем не менее, я мог бы создать эту среду, если бы мне удалось запустить код под 2,0 clr. –

7

Как правило, внутрипроцессорный хостинг двух отдельных CLR выполняется только в мире COM. Когда вы используете COM для расширения и т. Д., Загружается соответствующая среда выполнения. В этом случае объекты CLR могут «разговаривать» друг с другом через COM, так как COM все об интероперабельности.

Чистые управляемые приложения всегда будут в конечном итоге работает в 4.0 CLR - так 4.0 приложения, загружающего сборку 2.0 будет в конечном итоге выполнения сборки 2.0 в CLR 4.

Для получения дополнительной информации см CLR Inside Out: In-Process Side by Side статью, в которой описывается это подробно.

Что касается ваших конкретных примеров:

Допустим, что GUI работает под .NET 2.0 CLR и есть скрипт работает на .NET 4.0 CLR, например, есть способ изменить основанный на 2.0 GUI из среды 4.0?

Если вы попытаетесь загрузить сборку 4.0 непосредственно, это провалится. Вам нужно будет использовать COM-взаимодействие, чтобы загрузить это, и в этом случае вся связь происходит через COM. Приложение 4.0 GUI может загрузить 2.0 "скрипт", но он загружен в среду выполнения 4.0.

+0

Я видел эту статью (которую я также связал по аналогичному вопросу, который я задал в Reddit: http://www.reddit.com/r/dotnet/comments/vawqp/how_can_two_net_clr_loaded_in_the_same_process/), но там нет образца кода , Знаете ли вы, как на практике может случиться так, как может взаимодействовать COM? Обратите внимание, что я не пытаюсь загружать сборки в каждой из CLR, я пытаюсь запустить код в CLR 2.0 из 4.0 CLR (например, изменить название элемента управления формой) –

+0

@DinisCruz Как вы загружаете сборку 2.0? (Это важно ...) –

+0

2.0 CLR уже запущен, то, что я делаю, это вставить в него 4.0 dll (который запустит 4.0 CLR). Видео, связанное с моим вопросом, показывает, что в действии –