2012-06-29 84 views
16

我想在node.js中使用.net dll。這是否意味着我需要提供與C/C++使用 'CLR託管' 這些dll,一拉.net本地擴展爲node.js

不幸的是,例如 Creating a nodejs native .Net extension了在github上是有點失望,只需向下滾動到最後一步

將「公共語言運行時支持」選項更改爲無公共LAN量尺RunTime支持

你明白我的意思了。 更正該文章正義:它建議將該選項更改爲「No Common Language RunTime Support」僅適用於文件SharpAddon.cpp,因此您添加的其他.cpp文件將啓用CLR支持(默認爲CLR項目),這意味着您實際上可以使用來自其他.cpp文件的.net dll。

這個問題實際上是Using a .NET DLL in Node.js/serverside javascript的重複,它是在沒有本地Windows節點端口的情況下編寫的,所以時間可能已經改變,儘管Google讓我懷疑它。

+0

這是很難說,如果它正在積極開發/維護,但如果你不需要用Node.js的100%的兼容性,這看起來很有趣:HT tp://newcome.wordpress.com/2010/05/08/node-net-node-js-implemented-in-javascript-on-the-net-runtime/。 – reuben

+0

@reuben感謝您的鏈接,但手頭的問題,我想有最穩定和執行實施的可能,所以我想我堅持用原來的,這是在一個非常快速的步伐正在開發也越來越最近在Windows平臺上運行。 –

回答

11

更新:當binding.gyp文件設置正確時,node-gyp可以自動執行以下手動步驟。有關此簡化過程,請參閱this answer


原來相當簡單。經過CLR託管和數據進出主機一段時間後,事實證明你實際上可以啓用/ clr爲你的節點擴展沒問題(到目前爲止)。具體方法如下:

  • 遵循http://nodejs.org/api/addons.html說明生成項目文件
  • 打開在Visual Studio(我在VS 2010中)產生的.sln,並在項目設置中啓用/ CLR
  • 現在它可能不會建立,你必須讓 - 在這種情況下實際上很有幫助 - 錯誤信息引導你到與/ clr衝突的標誌

我必須改變它以使其工作的標誌:

  • 禁用/ EHSC(C++異常)
  • 禁用/ RTC1和/ RTCsu
  • 推出:改變/ MT到/ MD
  • 調試:改變/ MTD到/ MDD
  • 推出:變化/ GR - 至/ GR

然後,您可以像這樣混合託管和非託管代碼,引用您的.net dll。

#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")); 
} 

更新只是發現了一個簡單的HOWTO此鏈接:http://joseoncode.com/2012/04/10/writing-your-first-native-module-for-node-dot-js-on-windows/

+0

+1不錯。現在我有一個更編寫的Node.js原生擴展,享受淨 – Viet

+0

的動力方式@Viet應該牢記的是,雖然穿越原生/ CLR邊界每次你這樣做時招致的成本 - 這取決於* native *調用* .net *的頻率(或其他方式)。成本有多高,我還沒有測量。 –

+0

感謝您的注意。一旦通過分析器運行該程序,您可能也想分享研究結果,例如在您的博客上 – Viet

5

聽起來edge.js是iisnode的作者的新的答案:

Edge.js支持使用C#和.NET而不是編寫本地的node.js擴展