Использование a.NET DLL в узле.JS / serverside javascript
У меня есть любимый проект, который является онлайн-игрой, весь игровой движок написан на C#, и я хотел бы знать, есть ли в любом случае я могу вызвать функции этой существующей сборки (.dll) из решения, построенного с использованием узла.Яш, гнездо.ИО, Экспресс и т. д?
сам игровой движок довольно полный; проверенный и надежный. Я надеюсь, что есть какой-то аккуратный способ раскрыть его функциональность без слишком больших накладных расходов.
обновление:
ответить мой вопрос немного..
Я закончил создание собственного сервера веб-сокетов (на основе самого последнего документа протокола веб-сокетов). Он написан на C# и скомпилирован с использованием Mono, так что он может быть размещен на Linux box под управлением mono, и поэтому (с несколькими настройками) я могу использовать свой существующий игровой движок.
обновление 2
Проект, который делает именно то, что я изначально искал, теперь существует -http://tjanczuk.github.io/edge/#/
7 ответов:
Если все, что вы хотите сделать, это раскрутить легкий HTTP-сервер, все еще программируя с помощью C# и .Net, вы должны дать Kayak шанс. Это легкий HTTP-сервер для C# и ведет себя как узел.JS в этом смысле.
обновление:
Если вы ищете легкий HTTP-сервер для обработки web-запросов у вас есть несколько альтернатив сегодня:
- ServiceStack (рекомендуется)
- Microsoft WebAPI
- NancyFx
насколько мне известно, все вышеперечисленное работает на некоторой версии Mono, поэтому вы все еще можете размещать их как в Windows, так и в Unix-системах.
недавно я столкнулся с той же проблемой (требование вызвать код C# из узла.в JS и JavaScript). У меня было 1000 строк сложного кода C#, который я действительно не хотел переносить на javascript.
Я решил, если в следующем.
- соответствующий код C# - это в основном 1-2 класса в сборке DLL
- определил COM-интерфейс, который является подмножеством интерфейса класса C# и реализовал этот интерфейс в классе C#. Таким образом, DLL стала внутрипроцессный COM-сервер.
- реализован узел.DLL расширения js, которая создает экземпляр моего класса C# COM с помощью стандартного Win32 COM API и маршрутизирует вызовы методов из узла.JS javascript для кода C# с использованием com-интерфейса.
Это решает проблему, если вы хотите только совершать звонки в одном направлении. У меня также было требование совершать вызовы с C# на javascript. Это намного сложнее. Нужно:
- реализовать COM-объект в узле.JS расширение DLL (ATL помогает здесь)
- передайте ссылку на интерфейс этого COM-объекта в код C# (com Interop)
- маршрутизация вызовов через COM-объект к объектам V8 в узле.js
может быть, если у меня есть дополнительное время, я мог бы сделать пример проекта из этого.
Проверьте края.JS проект я начал (http://tjanczuk.github.com/edge). он обеспечивает механизм для запуска .NET и узла.JS код в процесс. Край.js позволяет вызывать .NET-код из узла.js и узел.JS-код из. NET. It маршалирует данные между .NET и узлом.js так же, как примиряет продевая нитку модели между многопоточным CLR и однопоточным V8.
через край.js вы можете получить доступ к островам уже существующего кода .NET из узла.JS, что кажется соответствует вашему сценарию.
.NET аддоны могут быть написаны, короче говоря, вы пишете обычный собственный аддон и добавляете вызовы .Net через вызовы CLI/C++ в библиотеки DLL .Net.
на практике вы обычно создаете библиотеку dll C#, которую затем вызываете из проекта аддона узла CLI/C++. Существует несколько деликатесов, таких как проверка того, что фактический файл определения узла add on компилируется без поддержки среды CLR, чтобы узел мог правильно его загрузить.
вы можете проверить:https://github.com/saary/node.net для пример того, как это может быть достигнуто.
следующий ответ устарел, но все еще полезен для понимания узла.JS из первого выпуска
Узел.js теперь также доступен изначально для Windows по адресу nodejs.org. отсутствие требования к cygwin или в противном случае.во-первых, на данный момент нет собственного порта Windows узла.js, есть только версия cygwin (но я подозреваю, что вы уже это знали).
там был модуль узла, плавающий вокруг где-то в GitHubs, которые предоставляли обертки для вызова в родные библиотеки, но iirc, который работал только с
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions/.solibs.из этого расширения вы должны загрузить DLL и обернуть вызовы из узла.js к коду C#, это означает, что вы должны напишите некоторый низкоуровневый код C / C++ и преобразуйте значения C# в материал V8.
у меня есть только опыт работы с C++ и V8, это немного трудно начать, так как примеры кода немного разрежены, а также обертывание классов C++ не это тривиально. Но я действительно написал маленький JS игровой движок вид вещи, который использует C++ OpenGL backend, он не завершен (и вряд ли есть какие-либо комментарии), но это может дать вам некоторые идеи.
Примечание: есть некоторые проекты в дикой природе, которые обеспечивают несколько автоматическую генерацию оболочек для V8, но это только C++.
Итак, чтобы закончить, я думаю, что это будет довольно авантюрно, чтобы обертки C# работали, но это должно быть возможно.
возможно, Вам ПОВЕЗЕТ с проектом, который является портом узла.js to. NET. я не использовал его сам, но с родной реализацией .NET вы теоретически должны быть в состоянии делать то, что вам нужно.
вы также можете пойти в другом направлении и попытаться перенести (aka: перекомпилировать, если вы не подключены глубоко в Windows) ваш игровой движок C# в Mono и посмотреть, сможете ли вы затем построить обертки от этого.
Я знаю, что это старый вопрос, но хотел бы добавить текущий ответ. С IIS 7.5 и .Net 4.поддерживаются X Websockets, хотя использование библиотеки SignalR, скорее всего, будет путем наименьшего сопротивления. Это похоже на то, что socket.io библиотека для NodeJS.
Что касается доступа к .Net-коду через NodeJS, ваши лучшие варианты-Edge.js, создание смешанной собственной сборки с C / C++, предоставление вашего кода .Net либо через приложение командной строки (лучше всего использовать каналы для ввода/вывода), либо через сервис (TCP или другой).
Я нахожу края.js должен быть очень ограниченным и не предлагать много по интерфейсу конвейерной консоли.. и чувствую, что сервис может быть лучше для более сложного интерфейса. В этот момент Вы можете лучше всего сделать остальную часть проекта в .Net, если у вас нет инвестиций в NodeJS, которые заменяют указанные трудности.
Comments