Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby可以导入.NETDLL吗?_.net_Windows_Ruby_Com_Dll - Fatal编程技术网

Ruby可以导入.NETDLL吗?

Ruby可以导入.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

我对在项目中使用/学习RoR感兴趣,因为我必须使用.NET dll。Ruby能够导入.NET dll吗?

如果您使用IronRuby(基于.NET构建的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRuby

除了IronRuby,我不确定。我自己没有使用过Ruby,所以我不知道它能做什么。

如果你使用IronRuby(基于.Net的Ruby实现),那么它应该能够。如果您已经在使用.Net并想试用Ruby,那么您可能需要研究IronRuby


除了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 );
            }
        }
    }
}
现在,在视觉圣