Несмотря на то, что IronRuby быстро пообщается с вашей DLL-библиотекой .NET (вообще не будет кода), она была заброшена Microsoft и никогда не имела достаточно большого сообщества с открытым исходным кодом, чтобы поддерживать его после этого. событие. Я бы не рекомендовал это в наши дни
Что касается решения COM, это может быть хорошим способом.
Вам не нужна библиотека RubyCOM - она позволяет другим COM-объектам вызывать код ruby. Чтобы загрузить COM-объекты из ruby, вам просто нужна библиотека win32ole
, которая входит в стандартную библиотеку в windows ruby.
Возможность загрузки DLL из COM будет зависеть от того, была ли библиотека .NET создана для Com Comible.
.NET Framework определяет 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")
Руби этот рубиновый файл и presto! вы должны увидеть, что текст записывается в c:\log.file
.
Одна из проблем этого решения состоит в том, что для него требуется, чтобы .NET dll уже была Com Visible, а если нет, у вас есть возможность перекомпилировать его. Если ни одна из этих вещей не соответствует действительности, возможно, вам придется поискать другие варианты.
Удачи!