我有兴趣在我必须使用.NET dll的项目中使用/学习RoR.Ruby能否导入.NET dll?
虽然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
contains 的目录AssemblyInfo.cs
.在此文件中,将有以下内容
[assembly: ComVisible( false )]
将false更改为true.如果您不希望程序集中的每个类都暴露给COM,那么您可以将其设置为false AssemblyInfo.cs
,而是将其放在要公开的每个类的上方,如下所示:
[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,或者如果不是,则可以重新编译它.如果这些都不属实,那么你可能需要考虑其他选择.
祝好运!