Может ли Ruby импортировать .NET dll? - PullRequest
14 голосов
/ 05 ноября 2008

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

Ответы [ 7 ]

32 голосов
/ 05 ноября 2008

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

Удачи!

3 голосов
/ 21 октября 2011

Вы также можете написать собственную DLL-библиотеку оболочки C #, используя управляемый C ++

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

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

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

2 голосов
/ 05 ноября 2008

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

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

RubyCom

Хотя это немного запутанно.

Редактировать: лучший вариант на основе COM в других местах ответов

1 голос
/ 05 ноября 2008

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

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

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

0 голосов
/ 28 января 2009

Если вы заинтересованы в ASP.NET MVC вместе с IronRuby, вы можете проверить этот исходный код у Джимми - http://github.com/jschementi/ironrubymvc/tree/master

Наслаждайтесь!

0 голосов
/ 07 ноября 2008

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

0 голосов
/ 05 ноября 2008

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

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

...