【问题标题】:Is Ruby able to import a C# COM DLLRuby 是否能够导入 C# COM DLL
【发布时间】:2018-04-03 22:04:08
【问题描述】:

我尝试使用此处描述的这种方法访问 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 注册表数据库中注册。

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

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

【问题讨论】:

    标签: c# ruby com dllimport


    【解决方案1】:

    您正在使用 32 位版本的 wscript 和 64 位版本的 Ruby。这意味着,由于 COM 服务器可以从 wscript 而不是 Ruby 中找到,因此您的 COM 服务器在进程 COM 服务器中是 32 位的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多