Ruby可以导入.NET DLL吗?

Raf*_*rie 14 .net ruby windows com dll

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

Ori*_*rds 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 );
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在visual studio项目下,有一个名为Propertiescontains 的目录AssemblyInfo.cs.在此文件中,将有以下内容

[assembly: ComVisible( false )]
Run Code Online (Sandbox Code Playgroud)

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

[ComVisible( true )]
public class LogWriter ....
Run Code Online (Sandbox Code Playgroud)

现在右键单击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!')
Run Code Online (Sandbox Code Playgroud)

其中[解决方案名称]将替换为您刚刚创建的解决方案的名称(默认值:"ClassLibrary1")

Ruby那个ruby文件,还有presto!你应该看到文本被写入c:\log.file.

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

祝好运!