Ruby可以导入.NET DLL吗?

时间:2008-11-05 17:08:25

标签: .net windows ruby com dll

我有兴趣在我必须使用.NET dll的项目中使用/学习RoR。 Ruby能否导入.NET dll?

7 个答案:

答案 0 :(得分:32)

虽然IronRuby会简单地与你的.NET dll交谈(它根本就没有代码),但它被微软放弃了,它从来没有一个足够大的开源社区来继续它事件。这些天我不推荐它

关于COM解决方案,这实际上可能是一个很好的方法。

您不需要RubyCOM库 - 它允许其他COM对象调用ruby代码。要从ruby加载COM对象,您只需要win32ole库,它是windows ruby​​上标准库的一部分。

是否可以从COM加载dll将取决于.NET dll是否构建为“Com Visible”。 .NET框架定义了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 )]

将false更改为true。如果您不希望程序集中的每个类都暴露给COM,那么您可以在AssemblyInfo.cs中将其设置为false,而是将其放在要公开的每个类的上方,例如:

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

现在右键单击dll项目本身,然后从弹出菜单中选择“属性”。在部分列表中,选择Build

向下滚动,勾选'Register for COM interop'复选框。现在,当您编译此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”)

Ruby那个ruby文件,并且是presto!您应该看到文本被写入c:\log.file

此解决方案的一个问题是它要求.NET dll已经是Com Visible,或者如果不是,则可以重新编译它。如果这两件事都不成立,那么你可能需要考虑其他选择。

祝你好运!

答案 1 :(得分:3)

你也可以写一个原生的 - >使用托管C ++的C#包装器DLL

在DLL中导出您想要作为C调用的所有函数,例如

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

然后使用FFI从Ruby调用该DLL https://github.com/ffi/ffi

答案 2 :(得分:2)

如果你想使用'普通'红宝石(因为我认为IronRuby还没有完全运行RoR),你可能可以通过COM - 即

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

RubyCom

虽然这有点令人费解。

编辑:答案中其他地方更好的基于COM的选项

答案 3 :(得分:1)

另一件事 - 从面向服务的架构角度考虑更多可能会更好。你可以把那个.NET DLL作为服务公开吗?

在幕后,你可以用C语言编写Ruby模块,这样你就可以随时编写一个互操作来完成你需要的工作。但是它会限制你在Windows平台上的部署(我还没试过Ruby-> Interop-> Mono)

这是我几年前给出的一个名为Ruby for C# Developers的演讲。这有点过时了(在John Lam的项目被收入IronRuby之前),但可能会有所帮助。

答案 4 :(得分:0)

如果您使用IronRuby(基于.Net构建的Ruby实现),那么它应该能够。如果您已经在使用.Net并想尝试使用Ruby,那么您可能需要查看IronRuby。

在IronRuby之外我不确定。我自己没有使用过Ruby,所以我不知道它能做什么样的事情。

答案 5 :(得分:0)

虽然这是一个死亡的项目AFAIK,你可能会发现John Lam(现在负责IronRuby)之前的RubyCLR project是一个有趣的项目。

答案 6 :(得分:0)

如果您对使用IronRuby的ASP.NET MVC感兴趣,您可能会发现自己从Jimmy查看此源代码 - http://github.com/jschementi/ironrubymvc/tree/master

享受!