Вызов .NET из Perl - PullRequest
       3

Вызов .NET из Perl

3 голосов
/ 03 августа 2010

У меня есть сценарий Perl, и мне нужно было вызвать метод, который находится в сборке .NET. Я нашел эту технику , но она довольно сложна для одноразового сценария Perl, поэтому я ее не использовал. В итоге я написал тривиальное консольное приложение .NET в качестве оболочки для нужного мне вызова, и мой Perl-скрипт связывался с оболочкой, используя Console.In / Console.Out / IPC::Open2.

Это оказалось проблематичным, потому что метод .NET StreamReader.ReadToEnd не смог определить конец файла на Console.In, даже после того, как мой Perl-скрипт закрыл свой конец канала!

В итоге я взломал решение, которое работало для моих целей, но есть ли лучший способ вызвать .NET из Perl?

1 Ответ

3 голосов
/ 03 августа 2010

"Метод StreamReader.ReadToEnd не смог определить конец файла в Console.In"

Похоже, вы могли взаимодействовать с .NET. Но вы вызвали StreamReader.ReadToEnd на консольном входе. Это может быть проблематично, даже без Perl. Отрывок того, почему это так:

ReadToEnd предполагает, что поток знает, когда он достиг конца. За интерактивные протоколы, в которых сервер отправляет данные только по запросу за это и не закрывает Соединение, ReadToEnd может заблокировать до бесконечности и его следует избегать.

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

Edit:

«В итоге я написал тривиальное консольное приложение .NET в качестве оболочки»

Мне кажется, что вы пытаетесь общаться между ними (Perl и .NET). Выбранный протокол (Console.In/Out) может работать, но вы должны использовать StreamReader.Read или StreamReader.ReadLine в своем приложении .NET в цикле, чтобы вы могли легко определить, когда поток закрыт. Операции чтения вернутся null, когда они в EOF.

Кроме того, вы можете использовать любой метод, который вам нравится в Perl, и вызывать его из .NET. Т.е. вы переворачиваете логику, и .NET просто запрашивает взаимодействие с вашим Perl-кодом для ввода. Тогда вы можете придерживаться Perl для вашей основной задачи программирования. Вы можете сделать это, используя PerlSharp .

...