Può Ruby importare una dll .NET?

Sono interessato all’utilizzo / apprendimento del RoR in un progetto in cui devo utilizzare una DLL .NET. Ruby è in grado di importare una dll .NET?

Mentre IronRuby farà un breve lavoro di conversazione con la tua DLL .NET (non sarà letteralmente affatto un codice), è stata abbandonata da Microsoft, e non ha mai avuto una community open source abbastanza grande da continuare a funzionare dopo quell’evento. Non lo consiglierei in questi giorni

Per quanto riguarda la soluzione COM, questa potrebbe essere una buona strada da percorrere.

Non hai bisogno della libreria RubyCOM – che consente ad altri oggetti COM di chiamare in codice ruby. Per caricare oggetti COM da ruby, è sufficiente la libreria win32ole , che fa parte della libreria standard di Windows Ruby.

Se è ansible caricare o meno la DLL da COM dipenderà se la DLL di .NET è stata creata per essere “Visibile”. .NET framework definisce un ComVisibleAttribute , che può essere applicato a un intero assembly oa classi specifiche all’interno di un assembly. Se è impostato su true per l’intero assembly o per qualsiasi class, la dll sarà già richiamabile da COM senza alcun codice wrapper.

Ecco un test che ho fatto.

Creare un nuovo progetto DLL dll (libreria di classi). Ecco un esempio di class che ho usato:

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

Ora, sotto il progetto Visual Studio, c’è una directory chiamata Properties che contiene AssemblyInfo.cs . In questo file, ci sarà il seguente

 [assembly: ComVisible( false )] 

Cambia il falso in vero. Se non vuoi che ogni class nell’assembly venga esposta a COM, puoi lasciarla impostata su false in AssemblyInfo.cs e invece metterla sopra ogni class che vuoi esporre, in questo modo:

 [ComVisible( true )] public class LogWriter .... 

Ora fai clic con il pulsante destro del mouse sul progetto DLL e dal menu popup seleziona “Proprietà”. Nell’elenco delle sezioni, scegli Build

Scorri verso il basso e seleziona la casella di controllo “Registra per interoperabilità COM”. Ora quando si compila questa DLL, Visual Studio farà le cose necessarie per caricare le informazioni COM nel registro. Nota se sei su Vista devi eseguire VS come amministratore affinché funzioni.

Ora che ciò è fatto, ricompilare la DLL e quindi creare un nuovo file ruby.

In questo file ruby, fai questo:

 require 'win32ole' lib = WIN32OLE.new('[Solution name].ComLib.LogWriter') lib.WriteLine('calling .net from ruby via COM, hooray!') 

Dove [nome soluzione] deve essere sostituito dal nome della soluzione appena creata (impostazione predefinita: “ClassLibrary1”)

Ruby che file di ruby, e presto! dovresti vedere che il testo viene scritto in c:\log.file .

Un problema con questa soluzione è che richiede che .NET dll sia già visibile a Com, oppure, se non lo è, è ansible ricompilarlo. Se nessuna di queste cose è vera, potrebbe essere necessario esaminare altre opzioni.

In bocca al lupo!

Puoi anche scrivere un nativo -> C # wrapper DLL usando C ++ gestito

Esportare tutte le funzioni che si desidera come chiamate C nella DLL, ad es

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

Quindi utilizzare FFI per chiamare quella DLL da Ruby https://github.com/ffi/ffi

Se si desidera utilizzare il ruby ​​”normale” (poiché non penso che IronRuby esegua completamente RoR), potrebbe essere ansible passare tramite COM, ad esempio

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

RubyCom

Questo è un po ‘contorto però.

Modifica: migliore opzione basata su COM altrove nelle risposte

Un’altra cosa – potrebbe essere meglio pensarci più da un punto di Architettura orientata ai servizi. Puoi prendere quella DLL .NET ed esporla come un servizio?

Dietro le quinte, puoi scrivere i moduli di Ruby in C, così puoi sempre scrivere un’interop per fare ciò che ti serve. Tuttavia, limiterà la distribuzione alle piattaforms Windows (non ho provato Ruby-> Interop-> Mono)

Ecco una presentazione che ho dato un paio di anni fa, chiamata Ruby for C # Developers . È un po ‘datato (era prima che il progetto di John Lam fosse ripiegato su IronRuby), ma potrebbe aiutare un po’.

Se usi IronRuby (implementazione di Ruby costruita su .Net), dovrebbe essere in grado di farlo. Se stai già usando .Net e vuoi provare Ruby, potresti voler dare un’occhiata a IronRuby.

Fuori da IronRuby non ne sono sicuro. Non ho usato Ruby da solo, quindi non so di che tipo di cose sia capace.

Sebbene sia un progetto morto AFAIK, potresti trovare interessante il precedente progetto RubyCLR di John Lam (che ora è responsabile di IronRuby).

Se sei interessato ad ASP.NET MVC insieme a IronRuby, potresti scoprire questo codice sorgente da Jimmy – http://github.com/jschementi/ironrubymvc/tree/master

Godere!