2008-12-10 97 views
34

我在構建.NET 3.5應用程序,並需要評估服務器上的JS代碼 - 基本上用戶提供的規則集可以在瀏覽器或服務器上工作。託管JS不是一種選擇,因爲JS代碼將在運行時提供。 Aptana的Jaxer也不是一種選擇。所以我正在研究在我的應用程序中使用V8引擎的構建。從.NET應用程序引用Google的V8引擎

我將源代碼成功構建到DLL中,但該DLL不是託管庫,也不是COM。 V8只是簡單的C++。

有關如何與C#中的這種類型的DLL互操作的任何想法?另外,我願意接受SpiderMonkey或其他JS引擎的其他建議。

在此先感謝。

UPDATE:

我能夠使用瑞安的解決方案。我只是更新了從主幹中獲取最新版本的參考。它效果很好。謝謝瑞恩。

+0

順便說一句,我可以在哪裏獲得已編譯DLL的副本? (因爲我自己懶得編譯它,主要是因爲我沒有VS設置爲執行C++) – 2008-12-10 19:10:08

+0

我更新了我的文章鏈接,下載我創建的測試項目。 – 2008-12-10 21:43:05

+0

對於那些剛剛查找此頁面的用戶,現在還有Codeplex上的V8.NET。 – 2013-06-01 19:32:09

回答

33

我意識到這可能不是您的問題的確切答案,但我想我會把我的2美分價值,因爲我懷疑很多人都試過這個。

我通過使用混合模式C++創建了一個託管包裝來實現它。還有其他方法可以做到這一點,但是我打算嘗試製作一個可以從任何.Net語言使用的完整包裝器。

讓lib編譯成可以包含在混合模式項目中的方式有​​點難度。我必須修改用於/ MD和/ MDd的運行時庫(在SConstruct文件中),以便它與/ clr開關兼容。

到目前爲止,我只有簡單的腳本運行,因爲我沒有實現回調,自定義方法,對象等。

這裏是什麼樣的使用看起來像我的測試應用程序的一個快速示例:

V8DotNet.Shell shell = new V8DotNet.Shell(); 

shell.ExecuteScript(@"print('V8 version is: ' + version());"); 

它可以運行更復雜的腳本,像一個base64編碼器精也。但現在我只能從C++端添加自定義項目。

我願意提供更多的信息+代碼,如果任何人有興趣,因爲我可能從來沒有選擇這個項目備份。但是,恐怕有很多代碼需要在這裏發佈,所以我們必須找到其他一些媒體,比如google代碼或codePlex。

編輯:


OK,我已經上傳的代碼。我必須在此聲明一個免責聲明:該項目非常早,我最好是C++的業餘愛好者,所以不要讓自己的希望過高。此外,這個項目是在chrome發佈之後創建/完成的,因此包含的v8版本可能會比較舊。

這就是說,這裏是:http://ryanscook.com/Files/V8-DotNet.zip(21。5 MB)

在包你會發現感興趣的以下項目:

V8Net庫\ V8.Net \ V8.Net.sln -這 是有解決方案管理 C++包裝程序和一個C#控制檯應用程序 進行測試。

Dependencies \ V8 -這是我用來構建V8庫的V8代碼 。

希望它有幫助!

+0

「我必須修改用於/ MD和/ MDd的運行時庫(在SConstruct文件中),以便它可以與/ clr開關兼容。 「 - 不是一個非常艱難的挑戰! :) – leppie 2008-12-10 19:37:06

0

從我聽說用IJW(Managed C++)編譯它應該可行 - 但我可能真的錯了,我從來沒有碰過MC++。

13

退房v8sharp。它支持在.NET應用程序中執行JS。它還允許您使用v8引擎註冊.NET類型,以便您的JS代碼可以與.NET代碼進行交互。我正在添加對掛鉤功能/代理支持的支持。

18

您可以嘗試使用Javascript .NET:

http://javascriptdotnet.codeplex.com/

它可以讓你創建.NET一個V8上下文和註冊CLI在它的對象,所以你可以操縱他們,並從JavaScript代碼中調用成員。它在運行時編譯Javascript。

檢查出來。

0

您可以嘗試V8.NET爲好。

http://v8dotnet.codeplex.com/

它可以讓您輕鬆地在比許多其他包裝一個較低的水平集成了V8代碼。