Ruby可以导入一个.NET DLL吗?

我有兴趣在一个项目中使用/学习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

请享用!