2012-06-29 35 views
16

Tôi muốn sử dụng các tệp .net trong node.js. Điều đó có nghĩa là tôi cần phải thực hiện những dlls sẵn với c/C++ sử dụng 'clr lưu trữ', a la.tiện ích mở rộng gốc của mạng cho node.js

Thật không may ví dụ Creating a nodejs native .Net extension qua tại github là một một chút thất vọng, chỉ cần cuộn xuống bước cuối cùng

Thay đổi tùy chọn "Hỗ trợ ngôn ngữ phổ biến" thành No Common Lan guage RunTime Support

và bạn biết ý tôi là gì. Chỉnh sửa để thực hiện công lý bài viết đó: Nó gợi ý thay đổi tùy chọn thành "Không hỗ trợ thời gian chạy ngôn ngữ chung" chỉ cho tệp SharpAddon.cpp, vì vậy các tệp .cpp khác bạn thêm sẽ bật hỗ trợ CLR (mặc định cho dự án CLR), có nghĩa là bạn có thể sử dụng thực tế. dlls từ các tệp .cpp khác.

Câu hỏi này thực sự là một bản sao của Using a .NET DLL in Node.js/serverside javascript, được viết tại một thời điểm khi thậm chí không có cổng Windows gốc, vì vậy thời gian có thể đã thay đổi, mặc dù google làm tôi nghi ngờ điều đó.

+0

Thật khó để biết liệu nó có đang được phát triển/duy trì tích cực hay không, nhưng nếu bạn không cần 100% khả năng tương thích với node.js, điều này có vẻ thú vị: ht tp: //newcome.wordpress.com/2010/05/08/node-net-node-js-implemented-in-javascript-on-the-net-runtime/. – reuben

+0

@reuben Cảm ơn bạn đã liên kết, nhưng đối với vấn đề ở bàn tay tôi muốn có triển khai ổn định và hiệu quả nhất có thể, vì vậy tôi đoán tôi bị mắc kẹt với bản gốc, đang được phát triển với tốc độ rất nhanh và cũng đang nhận được hơi nước trên nền tảng Windows gần đây. –

Trả lời

11

Cập nhật: nút-gyp có thể thực hiện các bước thủ công dưới đây tự động khi tệp binding.gyp được thiết lập đúng cách. Xem this answer cho quy trình đơn giản này.


Hóa ra là khá dễ dàng. Sau khi đấu tranh với CLR lưu trữ và nhận dữ liệu trong và ngoài của máy chủ trong một thời gian, nó quay ra bạn thực sự có thể kích hoạt/clr cho phần mở rộng nút của bạn không có vấn đề (cho đến nay). Đây là cách:

  • theo hướng dẫn trên http://nodejs.org/api/addons.html để tạo ra các tập tin dự án
  • mở tạo sln trong Visual Studio (Tôi đang trên VS 2010) và cho phép/clr trong các thiết lập dự án
  • nay nó có thể sẽ không xây dựng và bạn phải để cho - trong trường hợp này thực sự khá hữu ích - thông báo lỗi hướng dẫn bạn đến các cờ xung đột với/clr

Những lá cờ mà tôi phải thay đổi để làm cho nó hoạt động:

  • disable/EHsc (C++ ngoại lệ)
  • disable/RTC1 và/RTCsu
  • phát hành: thay đổi/MT đến/MD
  • gỡ lỗi: thay đổi/MTD đến/MDD
  • phát hành: thay đổi/GR - tới/GR

Sau đó, bạn có thể trộn mã được quản lý và không được quản lý như thế này, tham chiếu dll .net của bạn.

#pragma managed 

#using <managed.dll> 

void callManaged() 
{ 
    managed::Class1^ c1 = gcnew managed::Class1(); 
    System::String^ result = c1->Echo("hola"); 
    System::Console::WriteLine("It works: " + result); 
} 

#pragma unmanaged 

Handle<Value> Method(const Arguments& args) { 
    HandleScope scope; 
    callManaged(); 
    return scope.Close(String::New("world")); 
} 

Cập nhật Chỉ cần phát hiện ra liên kết này với một howto dễ dàng: http://joseoncode.com/2012/04/10/writing-your-first-native-module-for-node-dot-js-on-windows/

+0

+1 đẹp. Bây giờ tôi có thêm một cách để viết phần mở rộng gốc cho node.js và tận hưởng sức mạnh của .Net – Viet

+0

@Viet Cần lưu ý rằng việc vượt qua ranh giới bản địa/CLR phải chịu chi phí mỗi khi bạn làm điều đó - và điều đó phụ thuộc vào tần suất * native * gọi vào * .net * (hoặc cách khác xung quanh). Chi phí đó cao đến mức nào, tôi chưa đo được. –

+0

Cảm ơn ghi chú. Một khi bạn chạy chương trình thông qua trình hồ sơ, bạn có thể muốn chia sẻ các phát hiện quá, như trên blog của bạn – Viet

5

Âm thanh như edge.js là câu trả lời mới từ tác giả của iisnode:

Edge.js hỗ trợ sử dụng C# và .NET thay vì viết các phần mở rộng node.js gốc

Các vấn đề liên quan