【发布时间】:2010-09-20 22:06:31
【问题描述】:
我有兴趣在必须使用 .NET dll 的项目中使用/学习 RoR。 Ruby 是否能够导入 .NET dll?
【问题讨论】:
我有兴趣在必须使用 .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 的目录,其中包含 AssemblyInfo.cs。在这个文件中,会有以下内容
[assembly: ComVisible( false )]
将假改为真。如果您不希望程序集中的每个类 都暴露给 COM,那么您可以在 AssemblyInfo.cs 中将其设置为 false,而是将它放在您想要暴露的每个类之上,如下所示:
[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!')
其中 [Solution name] 将替换为您刚刚创建的解决方案的名称(默认:“ClassLibrary1”)
Ruby 那个 ruby 文件,然后!你应该看到文本被写入c:\log.file。
此解决方案的一个问题是它要求 .NET dll 已经是 Com Visible,或者如果不是,您可以重新编译它。如果这些都不成立,那么您可能需要考虑其他选项。
祝你好运!
【讨论】:
您还可以使用托管 C++ 编写本机 -> C# 包装 DLL
将你想要的所有函数导出为 DLL 中的 C 调用,例如
extern "C" __declspec ( dllexport ) void CallManagedMethod() {
Something^ myManagedObject ...
}
然后使用 FFI 从 Ruby 调用该 DLL https://github.com/ffi/ffi
【讨论】:
如果您对 ASP.NET MVC 和 IronRuby 一起感兴趣,您可以查看 Jimmy 的源代码 - http://github.com/jschementi/ironrubymvc/tree/master
享受吧!
【讨论】:
虽然 AFAIK 是一个死项目,但您可能会发现 John Lam(现在负责 IronRuby)之前的 RubyCLR project 是一个有趣的项目。
【讨论】:
如果你想使用“普通”红宝石(因为我认为 IronRuby 还没有完全运行 RoR)你可以通过 COM 去 - 即
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
这有点令人费解。
编辑:答案中其他地方更好的基于 COM 的选项
【讨论】:
另一件事 - 从面向服务的架构角度考虑可能会更好。你能把那个 .NET DLL 作为服务公开吗?
在幕后,您可以用 C 编写 Ruby 模块,因此您始终可以编写互操作来完成您需要的工作。不过,它会将您的部署限制在 Windows 平台上(我没有尝试过 Ruby->Interop->Mono)
这是我几年前做的一个演示文稿,名为Ruby for C# Developers。这有点过时了(那是在 John Lam 的项目被合并到 IronRuby 之前),但可能会有所帮助。
【讨论】:
如果您使用 IronRuby(基于 .Net 的 Ruby 实现),那么它应该可以。如果您已经在使用 .Net 并想试用 Ruby,那么您可能需要研究 IronRuby。
在 IronRuby 之外我不确定。我自己没用过 Ruby,所以不知道它能做什么。
【讨论】: