我有兴趣在我必须使用.NET dll的项目中使用/学习RoR。 Ruby能否导入.NET dll?
答案 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"
虽然这有点令人费解。
编辑:答案中其他地方更好的基于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
享受!