Ответ 1
В то время как IronRuby будет выполнять короткую работу с вашей DLL-платформой .NET(это будет буквально без кода вообще), он был оставлен компанией microsoft, и он никогда не получал достаточно большое сообщество с открытым исходным кодом, чтобы продолжать работу после этого мероприятие. Я бы не рекомендовал его в эти дни
Что касается решения COM, это действительно может быть хорошим способом.
Вам не нужна библиотека RubyCOM, которая позволяет другим COM-объектам обращаться к ruby-коду. Чтобы загрузить COM-объекты из ruby, вам просто нужна библиотека win32ole
, которая входит в состав стандартной библиотеки на рубинах Windows.
Можно ли загрузить DLL из COM, зависит от того, была ли построена DLL.NET, чтобы быть "Com Visible".
.NET framework определяет ComVisibleAttribute
, который может быть применен либо к всей сборке, либо к определенным классам в сборке. Если он установлен как истина для всей сборки или любых классов, то dll уже будет вызываться из COM без какого-либо кода оболочки.
Вот тест, который я сделал.
Создайте новый проект dll.NET(библиотека классов). Вот пример класса, который я использовал:
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, вы можете оставить его установленным в false в AssemblyInfo.cs
и вместо этого поместить его над каждым классом, который вы хотите открыть, например:
[ComVisible( true )]
public class LogWriter ....
Теперь щелкните правой кнопкой мыши по самому проекту dll, и из всплывающего меню выберите "свойства". В списке разделов выберите Build
Прокрутите вниз и отметьте флажок "Регистрация для COM-взаимодействия". Теперь, когда вы скомпилируете эту DLL, визуальная студия сделает необходимые вещи для загрузки информации COM в реестр. Обратите внимание, что если вы находитесь в Vista, вам нужно запустить VS в качестве администратора, чтобы это работало.
Теперь, когда это будет сделано, перекомпилируйте вашу dll, а затем создайте новый рубиновый файл.
В этом рубиновом файле сделайте следующее:
require 'win32ole'
lib = WIN32OLE.new('[Solution name].ComLib.LogWriter')
lib.WriteLine('calling .net from ruby via COM, hooray!')
Где [Имя решения] должно быть заменено именем только что созданного вами решения (по умолчанию: "ClassLibrary1" )
Рубируйте этот рубиновый файл и престо! вы должны увидеть, что текст записывается в c:\log.file
.
Одна из проблем с этим решением состоит в том, что для него требуется, чтобы .NET dll уже была Com Visible, или если это не так, вы можете перекомпилировать ее. Если ни одна из этих вещей не верна, вам может потребоваться просмотреть другие варианты.
Удачи!