development

Node.js / 서버 측 자바 스크립트에서 .NET DLL 사용

big-blog 2020. 12. 12. 12:08
반응형

Node.js / 서버 측 자바 스크립트에서 .NET DLL 사용


온라인 게임 인 애완 동물 프로젝트가 있는데, 전체 게임 엔진이 C #으로 작성되었으며, 어쨌든 Node.JS를 사용하여 구축 된 솔루션에서 기존 어셈블리 (.dll)의 함수를 호출 할 수 있는지 알고 싶습니다. , Socket.IO, Express 등?

게임 엔진 자체는 매우 완벽합니다. 테스트되고 견고합니다. 너무 많은 오버 헤드없이 기능을 노출 할 수있는 깔끔한 방법이 있기를 바랍니다.

업데이트 :

내 질문에 조금 답하기 위해 .. 나는 내 자신의 웹 소켓 서버 구축을 끝냈다 (최신 웹 소켓 프로토콜 문서를 기반으로). C #으로 작성되고 Mono를 사용하여 컴파일되어 mono를 실행하는 Linux 상자에서 호스팅 될 수 있으므로 (몇 가지 조정으로) 기존 게임 엔진을 사용할 수 있습니다.

업데이트 2 내가 원래 찾고 있던 것을 정확히 수행하는 프로젝트가 현재 존재합니다 -http : //tjanczuk.github.io/edge/#/

새로운 edge-js 패키지로 노드의 마지막 버전과 .net 코어를 지원하는 Edge.js 3 업데이트 .

Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x 지원 Windows / Linux / macOS에서 .NET Core 1.0.1-2.x 지원. Mono 런타임 4.8.x-5.x 지원.

https://www.npmjs.com/package/edge-js 에서 설치할 수 있습니다.


C # 및 .Net으로 프로그래밍하는 동안 경량 HTTP 서버를 가동하는 것뿐이라면 Kayak에게 기회를 주어야합니다. C # 용 경량 HTTP 서버이며 그런 의미에서 node.js와 비슷하게 작동합니다.

카약 http

최신 정보:

웹 요청을 처리 할 경량 HTTP 서버를 찾고 있다면 오늘 몇 가지 대안이 있습니다.

  • ServiceStack (권장)
  • Microsoft WebAPI
  • NancyFx

내가 아는 한 위의 모든 작업은 Mono의 일부 버전에서 작동하므로 Windows 및 Unix 기반 시스템 모두에서 호스팅 할 수 있습니다.


내가 시작한 edge.js 프로젝트 ( http://tjanczuk.github.com/edge )를 확인하세요 . .NET 및 node.js 코드를 프로세스에서 실행하기위한 메커니즘을 제공합니다. Edge.js를 사용하면 node.js에서 .NET 코드를 호출하고 .NET에서 node.js 코드를 호출 할 수 있습니다. .NET과 node.js간에 데이터를 마샬링하고 다중 스레드 CLR과 단일 스레드 V8 간의 스레딩 모델을 조정합니다.

edge.js를 사용하면 시나리오와 일치하는 것으로 보이는 node.js에서 기존 .NET 코드의 섬에 액세스 할 수 있습니다.


최근에 동일한 문제에 직면했습니다 (node.js javascript에서 C # 코드를 호출해야 함). 자바 스크립트로 이식하고 싶지 않은 수천 줄의 복잡한 C # 코드가있었습니다.

다음과 같이 해결했습니다.

  • 관련 C # 코드는 기본적으로 DLL 어셈블리의 1-2 클래스입니다.
  • C # 클래스 인터페이스의 하위 집합 인 COM 인터페이스를 정의하고 해당 인터페이스를 C # 클래스에 구현했습니다. 따라서 DLL은 In-process COM 서버가되었습니다.
  • 표준 Win32 COM API를 사용하여 내 C # COM 클래스를 인스턴스화하고 COM 인터페이스를 사용하여 node.js javascript에서 C # 코드로 메서드 호출을 라우팅하는 node.js 확장 DLL을 구현했습니다.

이것은 한 방향으로 만 전화를 걸고 싶은 경우 문제를 해결합니다. 또한 C #에서 javascript로 호출해야하는 요구 사항이있었습니다. 이것은 훨씬 더 어렵습니다. 하나는 :

  • node.js 확장 DLL에서 COM 개체 구현 (ATL은 여기에서 도움이 됨)
  • 이 COM 개체의 인터페이스 참조를 C # 코드로 전달 (COM Interop)
  • COM 개체를 통해 호출을 node.js의 V8 개체로 라우팅

시간이 좀 더 있다면 이것으로 예제 프로젝트를 만들 수도 있습니다.


.Net 애드온을 작성할 수 있습니다. 간단히 말해 일반 네이티브 애드온을 작성하고 CLI / C ++ 호출을 통해 .Net dll에 대한 .Net 호출을 추가합니다.

실제로는 일반적으로 C # dll 라이브러리를 만든 다음 CLI / C ++ 노드 애드온 프로젝트에서 호출합니다. 실제 노드 추가 정의 파일이 CLR 지원없이 컴파일되어 노드가 올바르게로드 할 수 있도록하는 것과 같은 약간의 섬세함이 있습니다.

당신은 체크 아웃 할 수 있습니다 https://github.com/saary/node.net를 이 달성 할 수있는 방법의 예를 들어.


다음 답변은 오래되었지만 첫 번째 릴리스에서 Node.js를 이해하는 데 여전히 도움이됩니다.
Node.js는 이제 nodejs.org에서 Windows 용으로 기본적으로 제공됩니다. cygwin 요구 사항 또는 기타 사항이 없습니다.

우선, 현재 Node.js의 기본 Windows 포트가 없으며 cygwin 버전 만 있습니다 (하지만 이미 알고있는 것 같습니다).

네이티브 라이브러리를 호출하기위한 래퍼를 제공하는 GitHubs 어딘가에 노드 모듈이 있었지만 .solibs 에서만 작동하는 iirc가 있었습니다.

따라서 C # DLL을 사용하려면 먼저 네이티브 Node.js 확장을 인터페이스로 작성해야합니다.
https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native -확장자 /

해당 확장에서 DLL을로드하고 Node.js의 호출을 C # 코드로 래핑해야합니다. 즉, 저수준 C / C ++ 코드를 작성하고 C # 값을 V8 항목으로 변환해야합니다.

난 단지 C와 경험을 가지고 ++ 및 코드 예제도없는 C ++ 클래스를 포장, 비트 스파 스이기 때문에 V8, 그것은 조금 어려운 시작하는 데있어 사소한. 그러나 나는 C ++ OpenGL 백엔드를 사용하는 작은 JS 게임 엔진 종류를 썼습니다 . 그것은 미완성입니다 (그리고 거의 코멘트가 없습니다). 그러나 그것은 당신에게 몇 가지 아이디어를 줄 수 있습니다.

참고 : V8에 자동으로 래퍼를 생성하는 일부 프로젝트가 있지만 C ++ 전용입니다.

결론적으로 C # 래퍼가 작동하도록하는 것이 매우 모험적이라고 생각하지만 가능해야합니다.


You might have some luck with this project, which is a port of Node.js to .NET. I haven't used it myself, but with a native .NET implementation you theoretically should be able to do what you need to.

You might also want to go the other direction and try to port (aka: recompile unless you're hooked deep into Windows) your C# game engine to Mono and see if you can then build wrappers off of that.


I know it's an old question, but wanted to throw in a current answer. With IIS 7.5 and .Net 4.x Websockets are supported, though use of the SignalR library will likely be the path of least resistance. It's similar to the socket.io library for NodeJS.

As to accessing .Net code via NodeJS, your best options are Edge.js, building a mixed native assembly with C/C++, exposing your .Net code either via a command line application (best to use pipes for input/output) or via a service (TCP or other).

I find Edge.js to be very limited, and not offer much over a piped console interface.. and feel that a service may be best for a more complex interface. At which point you may be best doing the rest of the project in .Net, unless you have an investment in NodeJS that supersedes said difficulties.


Edge.js supporting node's last versions and .net core with a new edge-js package.

Support for Node.Js 6.x, 7.x, 8.x, 9.x, 10.x, 11.x Support for .NET

Core 1.0.1 - 2.x on Windows/Linux/macOS. Support for Mono runtime

4.8.x - 5.x.

Can be installed (npm i edge-js) from https://www.npmjs.com/package/edge-js

참고URL : https://stackoverflow.com/questions/4653433/using-a-net-dll-in-node-js-serverside-javascript

반응형