Ruby能够导入C#COM DLL

时间:2018-04-02 08:59:44

标签: c# ruby com dllimport

我尝试使用此处描述的方法访问C#DLL但未成功:

Can Ruby import a .NET dll?

我创建了一个COM DLL(RubyToCSharp.dll),其中包含:[assembly: ComVisible(true)]和注册COM互操作(如示例所示):

using System;
using System.Runtime.InteropServices;
using System.IO;

namespace ComLib
{
    [ComVisible(true)]
    public class LogWriter
    {
        public void WriteLine(string line)
        {
            using (var log = new StreamWriter(File.OpenWrite(@"c:\log.file")))
            {
                log.WriteLine(line);
            }
        }
    }
}

我可以使用 c:\ Windows \ SysWOW64 \ wscript.exe 中的这个VB脚本访问DLL:

Dim obj
set obj = CreateObject("ComLib.LogWriter")
MsgBox TypeName(obj)

但我无法使用 System32 \ wscript.exe

访问DLL

当我最终尝试使用以下代码从Ruby访问时:

require 'win32ole'
lib = WIN32OLE.new('ComLib.LogWriter')

发生这种情况:

WIN32OLERuntimeError: failed to create WIN32OLE object from `ComLib.LogWriter'
HRESULT error code:0x80040154 Class not registered

即使DLL似乎在Windows注册表数据库中注册了。

我的设置是:Win5 PC上的Ruby v.2.4 64位版本。

有人有一个工作示例如何使用Ruby访问C#DLL或者知道为什么这个例子不起作用?

1 个答案:

答案 0 :(得分:0)

您使用的是32位版本的wscript和64位版本的Ruby。这意味着,既然可以从wscript而不是Ruby找到COM服务器,那么COM服务器在进程COM服务器中是32位。

您不能在一个进程中混合使用32位和64位代码。要么使用32位版本的Ruby,要么编译并注册64位版本的COM服务器。