当前位置:  开发笔记 > 后端 > 正文

Ruby可以导入.NET DLL吗?

如何解决《Ruby可以导入.NETDLL吗?》经验,为你挑选了1个好方法。

我有兴趣在我必须使用.NET dll的项目中使用/学习RoR.Ruby能否导入.NET dll?



1> Orion Edward..:

虽然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项目下,有一个名为Propertiescontains 的目录AssemblyInfo.cs.在此文件中,将有以下内容

[assembly: ComVisible( false )]

将false更改为true.如果您不希望程序集中的每个类都暴露给COM,那么您可以将其设置为false AssemblyInfo.cs,而是将其放在要公开的每个类的上方,如下所示:

[ComVisible( true )]
public class LogWriter ....

现在右键单击dll项目本身,然后从弹出菜单中选择"属性".在部分列表中,选择Build

向下滚动,勾选"Register for COM interop"复选框.现在,当您编译此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!')

其中[解决方案名称]将替换为您刚刚创建的解决方案的名称(默认值:"ClassLibrary1")

Ruby那个ruby文件,还有presto!你应该看到文本被写入c:\log.file.

此解决方案的一个问题是它要求.NET dll已经是Com Visible,或者如果不是,则可以重新编译它.如果这些都不属实,那么你可能需要考虑其他选择.

祝好运!

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有