我有兴趣在一个项目中使用/学习RoR,我必须使用.NET DLL。 Ruby能够导入.NET DLL吗?
虽然IronRuby将简短地讨论.NET的dll(它实际上完全没有代码),但它被微软放弃了,而且它从来没有得到足够大的开源社区来保持它的发展。 我现在不会推荐它
关于COM解决方案,这实际上可能是一个好的方法。
你不需要RubyCOM库 – 可以让其他COM对象调用ruby代码。 要从红宝石加载COM对象,你只需要win32ole
库,它作为Windows红宝石标准库的一部分。
无论你是否可以从COM加载DLL将取决于.NET DLL的内置是“COM可见”。 .NET框架定义了ComVisibleAttribute
,可以将其应用于整个程序集或程序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
向下滚动,并勾选“注册COM互操作”复选框。 现在当你编译这个DLL的时候,Visual Studio会做一些必要的事情来将COM信息加载到注册表中。 注意,如果你在Vista上,你需要以管理员身份运行VS才能工作。
现在这已经完成了,重新编译你的dll,然后创建一个新的ruby文件。
在这个红宝石文件中,做到这一点:
require 'win32ole' lib = WIN32OLE.new('[Solution name].ComLib.LogWriter') lib.WriteLine('calling .net from ruby via COM, hooray!')
其中[解决方案名称]将被您刚刚创建的解决方案的名称替换(默认:“ClassLibrary1”)
红宝石,红宝石文件,并presto! 你应该看到文本被写入c:\log.file
。
这个解决方案的一个问题是,它需要.NET DLL已经可见,或者如果它不是,你有能力重新编译它。 如果这些都不是真的,那么你可能不得不看其他的选择。
祝你好运!
您还可以使用托管C ++编写本地 – > C#封装器DLL
在DLL中导出所有你想作为C调用的函数,例如
extern "C" __declspec ( dllexport ) void CallManagedMethod() { Something^ myManagedObject ... }
然后使用FFI从Ruby https://github.com/ffi/ffi调用该DLL
如果你想使用“正常”的红宝石(因为我不认为IronRuby完全运行RoR),你可能可以通过COM – 即
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
RubyCom
这有点复杂。
编辑:在答案的其他地方更好的基于COM的选项
另一件事 – 从面向服务的体系结构的角度来考虑更好。 你可以把那个.NET DLL作为一个服务公开吗?
在幕后,你可以用C编写Ruby模块,这样你就可以随时写一个互操作来完成你所需要的。 它会限制你的部署到Windows平台,但(我还没有尝试过Ruby-> Interop-> Mono)
这是几年前我为C#开发人员所做的一次演示。 这有点过时了(John Lam的项目被折叠到IronRuby之前),但可能会有所帮助。
如果你使用IronRuby(基于.Net的Ruby实现),那么它应该能够。 如果您已经在使用.Net并想尝试Ruby,那么您可能需要查看IronRuby。
IronRuby之外,我不确定。 我自己也没有用过Ruby,所以我不知道它有什么样的能力。
虽然这是一个死的项目AFAIK,你可能会发现John Lam先生(现在负责IronRuby)的RubyCLR项目是一个有趣的项目。
如果您对IronRuby一起感兴趣的ASP.NET MVC,您可能会发现自己从Jimmy查看源代码 – http://github.com/jschementi/ironrubymvc/tree/master
请享用!