Ruby可以导入.NETDLL吗?
我对在项目中使用/学习RoR感兴趣,因为我必须使用.NET dll。Ruby能够导入.NET dll吗?如果您使用IronRuby(基于.NET构建的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRuby 除了IronRuby,我不确定。我自己没有使用过Ruby,所以我不知道它能做什么。如果你使用IronRuby(基于.Net的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRubyRuby可以导入.NETDLL吗?,.net,windows,ruby,com,dll,.net,Windows,Ruby,Com,Dll,我对在项目中使用/学习RoR感兴趣,因为我必须使用.NET dll。Ruby能够导入.NET dll吗?如果您使用IronRuby(基于.NET构建的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRuby 除了IronRuby,我不确定。我自己没有使用过Ruby,所以我不知道它能做什么。如果你使用IronRuby(基于.Net的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRuby 除了I
除了IronRuby,我不确定。我自己没有使用过Ruby,所以我不知道它能做什么。如果你想使用“普通”Ruby(因为我认为IronRuby还没有完全运行RoR),你可以通过COM-ie
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
不过这有点复杂
编辑:答案中的其他地方有更好的基于COM的选项如果你想使用“普通”ruby(因为我认为IronRuby还没有完全运行RoR),你可以通过COM-ie
"Your Ruby Code" -> RubyCOM -> "COM-Callable Wrappers" -> "Your .NET objects"
不过这有点复杂
编辑:答案中其他地方的更好的基于COM的选项另一件事-从面向服务的体系结构的角度考虑它可能更好。你能把.NETDLL作为服务公开吗 在幕后,您可以用C编写Ruby模块,因此您可以随时编写互操作来完成所需的工作。不过,这将限制您在Windows平台上的部署(我还没有尝试过Ruby->Interop->Mono)
这是几年前我做的一个演讲,叫做。它有点过时(在John Lam的项目被合并到IronRuby之前),但可能会有点帮助。另一件事——最好从面向服务的架构角度来考虑它。你能把.NETDLL作为服务公开吗 在幕后,您可以用C编写Ruby模块,因此您可以随时编写互操作来完成所需的工作。不过,这将限制您在Windows平台上的部署(我还没有尝试过Ruby->Interop->Mono)
这是几年前我做的一个演讲,叫做。它有点过时(在John Lam的项目被合并到IronRuby之前),但可能有点帮助。虽然IronRuby可以很快地与您的.NET dll通信(实际上它根本没有代码),但它被微软抛弃了,而且在那次事件之后,它从来没有足够大的开源社区来维持它。我现在不推荐 关于COM解决方案,这实际上可能是一个好办法 您不需要RubyCOM库,它允许其他COM对象调用ruby代码。要从ruby加载COM对象,只需要
win32ole
库,它是windows ruby标准库的一部分
是否可以从COM加载dll将取决于.NET dll是否构建为“COM可见”。
NET framework定义了一个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 );
}
}
}
}
现在,在VisualStudio项目下,有一个名为Properties
的目录,其中包含AssemblyInfo.cs
。在此文件中,将有以下内容
[assembly: ComVisible( false )]
将false改为true。如果不希望程序集中的每个类都向COM公开,则可以在AssemblyInfo.cs
中将其设置为false,并将其置于要公开的每个类之上,如下所示:
[ComVisible( true )]
public class LogWriter ....
现在右键单击dll项目本身,并从弹出菜单中选择“属性”。在部分列表中,选择Build
向下滚动,勾选“注册COM互操作”复选框。现在,当您编译此DLL时,VisualStudio将执行必要的操作,将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文件,还有presto!您应该看到文本被写入c:\log.file
此解决方案的一个问题是,它要求.NET dll已经是Com可见的,或者如果不是,则您可以重新编译它。如果这两件事都不是真的,那么你可能不得不考虑其他的选择
祝你好运 虽然IronRuby很快就可以与您的.NET dll进行对话(实际上根本没有任何代码),但它被microsoft放弃了,而且它从未拥有足够大的开放源代码社区来支持它。我现在不推荐 关于COM解决方案,这实际上可能是一个好办法 您不需要RubyCOM库,它允许其他COM对象调用ruby代码。要从ruby加载COM对象,只需要
win32ole
库,它是windows ruby标准库的一部分
是否可以从COM加载dll将取决于.NET dll是否构建为“COM可见”。
NET framework定义了一个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 );
}
}
}
}
现在,在视觉圣