Использование .NET DLL в Node.js/serverside javascript - программирование
Подтвердить что ты не робот

Использование .NET DLL в Node.js/serverside javascript

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

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

ОБНОВЛЕНИЕ:

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

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

ОБНОВЛЕНИЕ 3 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.

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

4b9b3361

Ответ 1

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

kayakhttp

Update:

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

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

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

Ответ 2

Проверьте проект 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, который, по-видимому, соответствует вашему сценарию.

Ответ 3

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

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

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

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

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

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

Ответ 4

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

На практике вы обычно создаете библиотеку библиотек С#, которую вы затем вызываете из проекта аддона CLI/С++ node. Существует немного деликатесов, таких как обеспечение того, чтобы фактический файл node add on definition был скомпилирован без поддержки CLR, поэтому node может загрузить его правильно.

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

Ответ 5

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

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

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

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

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

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

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

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

Ответ 6

Возможно, вам удастся с этим проектом, который является портом Node.js для .NET. Я не использовал его сам, но с собственной .NET-реализацией вы теоретически должны иметь возможность делать то, что вам нужно.

Вы также можете пойти в другом направлении и попытаться выполнить перенос (aka: перекомпилировать, если вы не подключены глубоко в Windows), ваш движок игры С# к Mono и посмотреть, можете ли вы затем отложить обертку от этого.

Ответ 7

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

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

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

Ответ 8

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 я edge-js) с https://www.npmjs.com/package/edge-js