我有興趣在項目中使用/學習RoR,我必須使用.NET dll。 Ruby能夠導入.NET dll嗎?Ruby可以導入.NET DLL嗎?
回答
雖然IronRuby會盡力與您的.NET dll交談(它實際上完全沒有代碼),但它被微軟放棄了,它從來沒有得到足夠大的開源社區來保持它的發展那個事件。我現在不會推薦它
關於COM解決方案,這實際上可能是一個好方法。
你不需要RubyCOM庫 - 可以讓其他COM對象調用ruby代碼。要從ruby加載COM對象,您只需要使用win32ole
庫,它是Windows ruby標準庫的一部分。
無論你是否可以從COM加載DLL將取決於.NET DLL是否構建爲'COM Visible'。 .NET框架定義了一個ComVisibleAttribute
,它可以應用於整個程序集或程序集中的特定類。如果它對於整個程序集或任何類都設置爲true,那麼DLL就已經可以從COM調用,而不需要任何包裝代碼。
這是我做的一個測試。
創建一個新的.NET dll項目(類庫)。下面是我用一個例子類:
using System;
using System.IO;
namespace ComLib
{
public class LogWriter
{
public void WriteLine(string line)
{
using(var log = new StreamWriter(File.OpenWrite(@"c:\log.file")))
{
log.WriteLine(line);
}
}
}
}
現在,Visual Studio項目下,有一個叫Properties
目錄包含AssemblyInfo.cs
。在此文件中,將出現以下內容
[assembly: ComVisible(false)]
將false更改爲true。如果你不想做暴露於COM組件中的每類,那麼你可以將它留在AssemblyInfo.cs
設置爲false,而是把它要公開每類以上,像這樣:
[ComVisible(true)]
public class LogWriter ....
現在右鍵單擊dll項目本身,然後從彈出菜單中選擇「屬性」。在部分列表中,選擇Build
向下滾動,並勾選'註冊COM互操作'複選框。現在當你編譯這個DLL的時候,visual studio會做一些必要的事情來將COM信息加載到註冊表中。注意,如果你在Vista上,你需要以管理員身份運行VS以使其工作。
現在完成了,重新編譯你的dll,然後創建一個新的ruby文件。
在這個ruby文件,這樣做:
require 'win32ole'
lib = WIN32OLE.new('[Solution name].ComLib.LogWriter')
lib.WriteLine('calling .net from ruby via COM, hooray!')
其中[解決方案名稱]是由您剛剛創建的解決方案的名稱來代替(默認: 「ClassLibrary1的」)
紅寶石是紅寶石文件,並presto!你應該看到文字被寫入c:\log.file
。
該解決方案的一個問題是它需要.NET DLL已經可見,或者如果它不是,你有能力重新編譯它。如果這些都不是真的,那麼你可能不得不看其他選項。
祝你好運!
如果您使用IronRuby(基於.Net構建的Ruby實現),那麼它應該可以。如果您已經在使用.Net並想嘗試Ruby,那麼您可能需要查看IronRuby。
IronRuby之外我不確定。我自己並沒有使用Ruby,所以我不知道它有什麼樣的能力。
如果你想用「正常」的紅寶石(因爲我不認爲IronRuby的充分運行的RoR但)你也許可以通過COM去 - 即
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
這是一個有點令人費解雖然。
編輯:在回答
的另一件事情在其他地方更好的基於COM選項 - 它可能是更好地去想它更從一個面向服務的架構點。你可以拿那個.NET DLL並將它作爲一個服務公開嗎?
在幕後,你可以用C編寫Ruby模塊,這樣你就可以隨時編寫互操作來完成你所需要的。儘管(我還沒有嘗試過Ruby-> Interop-> Mono),但它會限制你的部署到Windows平臺上。
這是我給幾年前的一個演示文件,名爲Ruby for C# Developers。這有點過時了(在John Lam的項目被摺疊到IronRuby之前),但可能會有所幫助。
揭露.NET的DLL作爲SOA服務是很長的路要走,但我得查這樣的安全問題。 – 2008-11-06 13:00:00
雖然這是一個死的項目AFAIK,你可能會發現以前的約翰林(他現在負責IronRuby)RubyCLR project一個有趣的。
如果你有興趣在ASP.NET MVC與IronRuby的在一起,你可能會發現自己檢查出從吉米這個源代碼 - http://github.com/jschementi/ironrubymvc/tree/master
享受!
你也可以寫一本機 - > C#包裝DLL使用託管C++
導出所有的功能你要爲C調用該DLL,例如
extern "C" __declspec (dllexport) void CallManagedMethod() {
Something^ myManagedObject ...
}
然後使用FFI調用該DLL從紅寶石 https://github.com/ffi/ffi
- 1. IronPython可以直接調用.net dll嗎?
- 2. 我可以從c#.net dll中調用vb.net dll嗎?
- 3. 我們可以在.Net V2.0中引入另一個內置.Net V4.5的DLL嗎?
- 4. 我可以在.net 3.5中調用.net 2.0 dll嗎?
- 5. JPG可以導入MapPoint嗎?
- 6. 我可以得到單獨的DLL來分別解析其導入的DLL嗎?
- 7. Jscript .Net和PDF Duo - 如何導入DLL?
- 8. 使用SortedDictionary for .net(從C#.dll導入)
- 9. MS Outlook可以添加呼叫.Net dll嗎?
- 10. 您可以在3.5項目中使用.NET 4.0 dll嗎?
- 11. 可以使用Javascript或JScript.NET創建.NET DLL嗎?
- 12. 我可以在「Delphi 2007 for Win32」中使用.NET DLL嗎?
- 13. .NET web應用程序可以只運行dll和configs嗎?
- 14. 我可以找到.NET dll構建的目標文件嗎?
- 15. 我可以在4.0應用程序中引用.NET 3.5 .DLL嗎?
- 16. 我可以在Android應用程序中使用Net Dll嗎?
- 17. [PHP]:可以通過PHP訪問.NET DLL嗎?
- 18. 可以vb6 dll使用.net com可見dll是gac
- 19. VB6項目可以使用.Net .dll
- 20. node.js可以取代Ruby嗎?
- 21. 使用Ruby 1.8.5可以嗎?
- 22. CanScript可以導入CommonJS模塊嗎?
- 23. SQL文件可以導入到Basic4Android嗎?
- 24. python可以做「從包導入module.symbol_name」嗎?
- 25. Java導入可以很慢嗎?
- 26. XMLCatalog可以用於模式導入嗎?
- 27. 我可以用php導入sql嗎?
- 28. 可以導入用於Jakefiles嗎?
- 29. Ruby Ruby可以在Mac上運行嗎?
- 30. 侵入.Net庫,可能嗎?
謝謝!我將檢查dll的comVisible屬性以查看是否可以實現此解決方案。 – 2008-11-06 13:01:30