Dot-Net

Ruby 可以導入 .NET dll 嗎?

  • October 16, 2014

我有興趣在必須使用 .NET dll 的項目中使用/學習 RoR。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 )]

將假改為真。如果您不希望程序集中的每個類都暴露給 COM,那麼您可以將其設置為 false AssemblyInfo.cs,而是將其放在您想要暴露的每個類之上,如下所示:

[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”) Ruby那個紅寶石文件,然後!您應該看到文本被寫入c:\log.file.

此解決方案的一個問題是它要求 .NET dll 已經是 Com Visible,或者如果不是,您可以重新編譯它。如果這些都不是真的,那麼您可能需要考慮其他選項。

祝你好運!

引用自:https://stackoverflow.com/questions/265879