¿Ruby puede importar un dll de .NET?

Estoy interesado en usar / aprender RoR en un proyecto en el que tengo que usar un DLL .NET. ¿Ruby es capaz de importar un dll de .NET?

Mientras que IronRuby hará un breve trabajo para hablar con su .NET dll (literalmente no habrá ningún código), fue abandonado por Microsoft, y nunca tuvo una comunidad de código abierto lo suficientemente grande como para seguir funcionando después de ese evento. No lo recomendaría en estos días

En cuanto a la solución COM, esta puede ser una buena forma de hacerlo.

No necesita la biblioteca RubyCOM, que permite que otros objetos COM llamen al código Ruby. Para cargar objetos COM desde Ruby, solo necesita la biblioteca win32ole , que viene como parte de la biblioteca estándar en Windows ruby.

Si puede o no cargar el dll desde COM dependerá si el dll de .NET fue construido para ser ‘Com Visible’. .NET Framework define un ComVisibleAttribute , que se puede aplicar a un ensamblaje completo o a clases específicas dentro de un ensamblaje. Si se establece en verdadero para todo el conjunto, o cualquier clase, entonces el dll ya será invocable desde COM sin ningún código de contenedor.

Aquí hay una prueba que hice.

Cree un nuevo proyecto .NET dll (biblioteca de clases). Aquí hay una clase de ejemplo que utilicé:

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

Ahora, en el proyecto de Visual Studio, hay un directorio llamado Properties que contiene AssemblyInfo.cs . En este archivo, habrá lo siguiente

 [assembly: ComVisible( false )] 

Cambie lo falso a verdadero. Si no desea que todas las clases del ensamblaje estén expuestas a COM, puede dejarlo como falso en AssemblyInfo.cs y en su lugar colocarlo encima de cada clase que desee exponer, como esta:

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

Ahora haga clic derecho en el proyecto dll en sí, y desde el menú emergente, seleccione ‘propiedades’. En la lista de secciones, elige Build

Desplácese hacia abajo y marque la casilla ‘Registrar para interoperabilidad COM’. Ahora cuando compile esta DLL, Visual Studio hará las cosas necesarias para cargar la información COM en el registro. Tenga en cuenta que si está en vista necesita ejecutar VS como administrador para que esto funcione.

Ahora que ya está hecho, recomstack tu dll y luego crea un nuevo archivo ruby.

En este archivo ruby, haz esto:

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

Donde [Nombre de la solución] debe ser reemplazado por el nombre de la solución que acaba de crear (predeterminado: “ClassLibrary1”)

Ruby ese archivo de Ruby, ¡y listo! Debería ver que el texto se escribe en c:\log.file .

Un problema con esta solución es que requiere que .NET dll ya sea Com Visible, o si no lo está, tiene la capacidad de volver a comstackrlo. Si ninguna de estas cosas es verdadera, entonces puede que tenga que mirar otras opciones.

¡Buena suerte!

También puede escribir una DLL nativa -> C # wrapper usando C ++ administrado

Exporte todas las funciones que desee como llamadas C en la DLL, por ejemplo

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

Luego use FFI para llamar a esa DLL desde Ruby https://github.com/ffi/ffi

Si quieres usar ruby ​​’normal’ (ya que todavía no creo que IronRuby ejecute completamente RoR), es posible que puedas usar COM – ie

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

RubyCom

Aunque eso es un poco complicado.

Editar: mejor opción basada en COM en otra parte de las respuestas

Otra cosa: podría ser mejor pensarlo más desde un punto de Arquitectura Orientada a Servicios. ¿Puedes tomar esa DLL .NET y exponerla como un servicio?

Detrás de escena, puede escribir módulos de Ruby en C, por lo que siempre puede escribir una interoperabilidad para hacer lo que necesita. Sin embargo, limitará su implementación a las plataformas de Windows (no he probado Ruby-> Interop-> Mono)

Aquí hay una presentación que di hace un par de años llamada Ruby para C # Developers . Está un poco anticuado (fue antes de que el proyecto de John Lam se doblara en IronRuby), pero podría ayudar un poco.

Si usa IronRuby (implementación de Ruby basada en .Net), entonces debería poder hacerlo. Si ya está utilizando .Net y quiere probar Ruby, entonces es posible que desee buscar en IronRuby.

Fuera de IronRuby no estoy seguro. No he usado a Ruby, así que no sé de qué tipo es capaz.

Aunque es un proyecto muerto AFAIK, es posible que el proyecto RubyCLR anterior de John Lam (que ahora está a cargo de IronRuby) sea interesante.

Si está interesado en ASP.NET MVC con IronRuby juntos, puede que desee consultar este código fuente de Jimmy – http://github.com/jschementi/ironrubymvc/tree/master

¡Disfrutar!