Использование .NET DLL в Node.js / серверный JavaScript - PullRequest
58 голосов
/ 11 января 2011

У меня есть проект для домашних животных, который представляет собой онлайн-игру, весь игровой движок написан на C #, и я хотел бы знать, могу ли я в любом случае вызывать функции этой существующей сборки (.dll) из решения, созданного с использованиемNode.JS, Socket.IO, Express и т. Д.?

Сам игровой движок довольно полный;проверено и надежноЯ надеюсь, что есть какой-то аккуратный способ показать его функциональность без лишних затрат.

ОБНОВЛЕНИЕ :

Чтобы немного ответить на свой вопрос ... Я закончил сборкумой собственный сервер веб-сокетов (на основе самого последнего документа протокола веб-сокетов).Он написан на C # и скомпилирован с использованием Mono, так что он может быть размещен на Linux-боксе, работающем под управлением mono, и поэтому (с несколькими настройками) я могу использовать свой существующий игровой движок.

UPDATE 2 Проект, который делает именно то, что я искал, теперь существует - http://tjanczuk.github.io/edge/#/

ОБНОВЛЕНИЕ 3 Edge.js, поддерживающий последние версии узла и ядро ​​.net с новым краем-js пакет.

Поддержка Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Поддержка .NET Core 1.0.1 - 2.x вWindows / Linux / MacOS.Поддержка Mono runtime 4.8.x - 5.x.

Может быть установлен с https://www.npmjs.com/package/edge-js

Ответы [ 8 ]

27 голосов
/ 26 марта 2013

Ознакомьтесь с проектом edge.js, который я начал (http://tjanczuk.github.com/edge).. Он предоставляет механизм для запуска кода .NET и node.js внутри процесса. Edge.js позволяет вам вызывать код .NET из node.js.и код node.js из .NET. Он сортирует данные между .NET и node.js, а также согласовывает модели потоков между многопоточным CLR и однопоточным V8.

Используя edge.js, вы можете обращаться к островамранее существовавшего кода .NET из node.js, который соответствует вашему сценарию.

25 голосов
/ 15 января 2012

Недавно я столкнулся с той же проблемой (требование вызова кода C # из node.js javascript). У меня было 1000 строк сложного кода на C #, который я действительно не любил портировать на javascript.

Я решил, если следующим образом.

  • Соответствующий код C # в основном состоит из 1-2 классов в сборке DLL
  • Определен интерфейс COM, который является подмножеством интерфейса класса C #, и реализован этот интерфейс в классе C #. Таким образом, DLL стала внутрипроцессным COM-сервером.
  • Реализована DLL-библиотека расширения node.js, которая создает экземпляр моего класса C # COM с использованием стандартного Win32 COM API и направляет вызовы методов из javascript node.js в код C # с помощью интерфейса COM.

Это решает проблему, если нужно совершать звонки только в одном направлении. У меня также было требование совершать звонки из C # в JavaScript. Это намного сложнее. Нужно:

  • Реализация COM-объекта в DLL-библиотеке расширения node.js (здесь помогает ATL)
  • Передать ссылку на интерфейс этого COM-объекта в код C # (COM Interop)
  • Маршрутизация вызовов через объект COM к объектам V8 в node.js

Может быть, если у меня будет дополнительное время, я мог бы сделать из этого пример проекта.

17 голосов
/ 26 января 2011

Если все, что вы хотите сделать, это развернуть легкий HTTP-сервер, продолжая программировать на C # и .Net, вы должны дать Kayak шанс.Это облегченный HTTP-сервер для C #, и в этом смысле он ведет себя как node.js.

kayakhttp

Обновление:

Если вы ищете легкий HTTP-сервер для обработки веб-запросов, у вас есть несколько вариантов сегодня:

  • ServiceStack (рекомендуется)
  • Microsoft WebAPI
  • NancyFx

Насколько мне известно, все вышеперечисленное работает на некоторых версиях Mono, поэтому вы все равно можете размещать их в системах на базе Windows и Unix.

8 голосов
/ 23 ноября 2011

.Net дополнения могут быть написаны, короче говоря, вы пишете обычное собственное дополнение и добавляете вызовы .Net через вызовы CLI / C ++ .Net dll.

На практике вы обычно создаете библиотеку C # dll, которую затем вызываете из аддон-проекта узла CLI / C ++. Есть немного деликатесов, таких как обеспечение того, что фактическое добавление узла в файле определения компилируется без поддержки CLR, чтобы узел мог загрузить его правильно.

Вы можете проверить: https://github.com/saary/node.net для примера того, как этого можно достичь.

7 голосов
/ 11 января 2011

Следующий ответ устарел, но все же полезен для понимания Node.js из первого выпуска
Node.js теперь также доступен дляWindows на nodejs.org.Нет требований к cygwin или иным образом.

Прежде всего, на данный момент нет собственного порта Windows для Node.js, есть только версия cygwin (но я подозреваю, что вы уже это знали).

Где-то на GitHubs находился модуль узла, который предоставлял оболочки для вызова нативных библиотек, но iirc, который работал только с .so libs.

Поэтому, если вы хотите использовать C #DLL, вам сначала нужно написать собственное расширение Node.js в качестве интерфейса:
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/

Из этого расширения вы должны загрузить DLL и обернуть вызовы из Node.js в C #код, это означает, что вам нужно написать какой-нибудь низкоуровневый код C / C ++ и преобразовать значения C # в материал V8.

У меня есть только опыт работы с C ++ и V8, начать довольно сложно, так как примеры коданемного разреженный, также обертывание классов C ++ не является , что тривиально.Но я написал небольшой игровой движок JS , который использует бэкэнд C ++ OpenGL, он не закончен (и вряд ли есть какие-либо комментарии), но он может дать вам некоторые идеи.

Примечание: Есть некоторые проекты в дикой природе, которые обеспечивают несколько автоматическое создание оболочек для V8, но это только C ++.

Итак, в заключение, я думаю, что будет довольно рискованно получить C #Обертки для работы, но это должно быть возможно.

2 голосов
/ 25 января 2011

Возможно, вам повезет с этим проектом , который является портом Node.js для .NET.Я не использовал его сам, но с нативной реализацией .NET вы теоретически должны быть в состоянии делать то, что вам нужно.если только вы не подключены к Windows), ваш игровой движок C # переходит на Mono и посмотрите, сможете ли вы тогда создать из этого оболочки.

1 голос
/ 18 апреля 2013

Я знаю, что это старый вопрос, но хотел добавить текущий ответ.В IIS 7.5 и .Net 4.x Websockets поддерживаются, хотя использование библиотеки SignalR, вероятно, будет путем наименьшего сопротивления.Она похожа на библиотеку socket.io для NodeJS.

Что касается доступа к .Net-коду через NodeJS, ваши лучшие варианты - это Edge.js, создающий смешанную нативную сборку с C / C ++, которая также предоставляет ваш .Net-кодчерез приложение командной строки (лучше всего использовать каналы для ввода / вывода) или через службу (TCP или др.).

Я считаю, что Edge.js очень ограничен и не предлагает много возможностей по сравнению с консольным интерфейсом... и чувствую, что сервис может быть лучше для более сложного интерфейса.В этот момент вы можете лучше всего выполнить остальную часть проекта в .Net, если у вас нет инвестиций в NodeJS, который заменяет указанные трудности.

0 голосов
/ 20 мая 2019

Edge.js с поддержкой последних версий узла и ядра .net с новым пакетом edge-js .

Поддержка Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Поддержка .NET

Core 1.0.1 - 2.x в Windows / Linux / macOS. Поддержка Mono runtime

4.8.x - 5.x.

Может быть установлен (npm i edge-js) с https://www.npmjs.com/package/edge-js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...