Использование .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
Ответы
Ответ 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