Может ли Ruby импортировать DLL.NET?

Я заинтересован в использовании/изучении RoR в проекте, где мне нужно использовать .NET dll. Может ли Ruby импортировать .NET DLL?

Ответы

Ответ 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, или если это не так, вы можете перекомпилировать ее. Если ни одна из этих вещей не верна, вам может потребоваться просмотреть другие варианты.

Удачи!

Ответ 2

Вы также можете написать родную → С# оболочку DLL с помощью управляемого С++

Экспортируйте все функции, которые вы хотите, как вызовы C в DLL, например

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

Затем используйте FFI для вызова этой DLL из Ruby https://github.com/ffi/ffi

Ответ 3

Если вы хотите использовать "обычный" рубин (так как я не думаю, что IronRuby полностью запускает RoR еще), вы можете пройти через COM - т.е.

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

RubyCom

Это немного запутанно.

Изменить: лучше использовать COM-вариант в других местах ответов

Ответ 4

Другое дело - лучше было бы подумать об этом с точки сервис-ориентированной архитектуры. Можете ли вы взять эту библиотеку .NET и показать ее как услугу?

За кулисами вы можете писать модули Ruby на C, поэтому вы всегда можете написать interop, чтобы делать то, что вам нужно. Это ограничит ваше развертывание на платформах Windows, хотя (я не пробовал Ruby- > Interop- > Mono)

Здесь презентация, которую я дал пару лет назад, называется Ruby for С# Developers. Это немного датировано (это было до того, как проект Джона Лама был сложен в IronRuby), но может немного помочь.

Ответ 5

Если вы используете IronRuby (реализация Ruby, построенная на .Net), тогда она должна быть в состоянии. Если вы уже используете .Net и хотите попробовать Ruby, вам может понадобиться посмотреть IronRuby.

Вне IronRuby я не уверен. Я сам не использовал Ruby, поэтому я не знаю, на что он способен.

Ответ 6

Хотя это мертвый проект AFAIK, вы можете найти предыдущий проект RubyCLR от Джона Лама (который теперь отвечает за IronRuby) интересный.