2008-11-05 79 views

回答

31

雖然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已經可見,或者如果它不是,你有能力重新編譯它。如果這些都不是真的,那麼你可能不得不看其他選項。

祝你好運!

+0

謝謝!我將檢查dll的comVisible屬性以查看是否可以實現此解決方案。 – 2008-11-06 13:01:30

0

如果您使用IronRuby(基於.Net構建的Ruby實現),那麼它應該可以。如果您已經在使用.Net並想嘗試Ruby,那麼您可能需要查看IronRuby。

IronRuby之外我不確定。我自己並沒有使用Ruby,所以我不知道它有什麼樣的能力。

2

如果你想用「正常」的紅寶石(因爲我不認爲IronRuby的充分運行的RoR但)你也許可以通過COM去 - 即

"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects" 

RubyCom

這是一個有點令人費解雖然。

編輯:在回答

1

的另一件事情在其他地方更好的基於COM選項 - 它可能是更好地去想它更從一個面向服務的架構點。你可以拿那個.NET DLL並將它作爲一個服務公開嗎?

在幕後,你可以用C編寫Ruby模塊,這樣你就可以隨時編寫互操作來完成你所需要的。儘管(我還沒有嘗試過Ruby-> Interop-> Mono),但它會限制你的部署到Windows平臺上。

這是我給幾年前的一個演示文件,名爲Ruby for C# Developers。這有點過時了(在John Lam的項目被摺疊到IronRuby之前),但可能會有所幫助。

+0

揭露.NET的DLL作爲SOA服務是很長的路要走,但我得查這樣的安全問題。 – 2008-11-06 13:00:00

0

雖然這是一個死的項目AFAIK,你可能會發現以前的約翰林(他現在負責IronRuby)RubyCLR project一個有趣的。

3

你也可以寫一本機 - > C#包裝DLL使用託管C++

導出所有的功能你要爲C調用該DLL,例如

extern "C" __declspec (dllexport) void CallManagedMethod() { 
    Something^ myManagedObject ... 
} 

然後使用FFI調用該DLL從紅寶石 https://github.com/ffi/ffi