2010-03-14 2 views
7

Я работаю с приложением, и я могу сделать сценарии C# для работы в этой среде. Я могу импортировать DLL любого типа в эту среду. Моя проблема в том, что я хотел бы включить обмен данными между этими сценариями. Поскольку среда контролируется, и у меня нет доступа к исходному коду приложения, я не понимаю, как это сделать.C# связь между процессами

Вещи, которые я пробовал:

  • File I/O: Просто писать сообщения, которые я хотел бы каждый читать файлы .txt и с другой его прочитать. Проблема в том, что мне нужны эти сценарии для работы довольно быстро, и это заняло слишком много времени.

  • nServiceBus: Я пробовал это, но я просто не мог заставить его работать в среде, с которой я имею дело. Я не говорю, что этого не может быть сделано, только I не может сделать это.

Кто-нибудь знает простой способ сделать это, это тоже довольно быстро?

+5

C# - это язык, который создает программы, а не скрипты. –

ответ

3

Ответ прост;

Поскольку вы можете импортировать любую DLL в скрипт, вы можете создать пользовательскую DLL, которая будет осуществлять связь между процессами любым способом: разделяемой памятью, именованным каналом, TCP/UDP.

+1

Многие из этих ответов были очень хорошими, и большинство из них я пытался реализовать раньше. Это закончилось тем, что я мог бы сделать то, что я действительно не думал, что смогу, и это было просто создать класс и поместить весь мой код связи туда и включить этот класс в обе другие стратегии. Дело не в том, что ваш ответ был очень информативным, а скорее заставило меня понять, что я слишком усложняю ситуацию. Спасибо. –

3

Вы можете использовать форму Interprocess Communication, даже в рамках одного и того же процесса. Относитесь к своим сценариям как к отдельным процессам и обменивайтесь таким образом.

Именованные трубы могут быть хорошим вариантом в этой ситуации. Они очень быстрые и довольно просты в использовании в .NET 3.5.

В качестве альтернативы, если скрипты загружаются в один AppDomain, вы можете использовать статический класс или singleton в качестве службы связи. Однако, если сценарии загружаются изолированно, это может быть невозможно.

2

Ну, не зная подробностей вашей среды, я не могу предложить действительно много. Вы используете термин «скрипты C#» ... Я не совсем уверен, что это значит, поскольку C# обычно является скомпилированным языком.

Если вы используете обычный C#, посмотрели ли вы в WCF с помощью именных труб? Если ваши сборки работают на одной физической машине, вы должны иметь возможность легко и быстро создавать некоторые службы WCF, размещенные с привязкой к именам. Именованные каналы обеспечивают простой, эффективный и быстрый механизм передачи сообщений в локальном контексте. Сам WCF довольно прост в использовании и является родным компонентом платформы .NET.

1

Вы можете использовать PipeStream. Которые быстрее, чем диск IO, поскольку они выполняются с использованием основной памяти.

4

Ваш метод межпроцессного взаимодействия должен зависеть от того, насколько важно, чтобы каждое сообщение обрабатывалось.

Например, если процесс A сообщает процессу B, скажем, отправить электронное письмо вашему ИТ-специалисту, говоря, что сервер выключен, это очень важно.

Если, однако, вы передаете аудио, отдельные сообщения (пакеты) не имеют решающего значения для производительности приложения и могут быть удалены.

Если первое, вам следует использовать постоянное хранилище, такое как база данных для хранения сообщений, и пусть каждый процесс опросит базу данных, чтобы получить свои собственные сообщения. Таким образом, если процесс завершается или теряет связь с другими процессами временно, он сможет извлекать все сообщения, которые он пропустил, когда он снова запустится.

+0

Спасибо, Дэвид, ты придумал несколько вещей, которые у меня не было, хотя об этом мне следовало бы. В конечном счете, это действительно помогло мне понять, какое решение было лучше для меня. –

2

Поскольку у вас уже есть файловый ввод-вывод, вы можете получить достаточную скорость, разместив его на RAM-диске. Если сегодня вы проводите опрос на изменение, FileSystemWatcher может помочь получить более отзывчивое общение.

1

Еще один простой способ - открыть TCP-разъем на предопределенном порту, подключиться к нему из другого процесса и обмениваться данными.

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