我尝试使用此处描述的方法访问C#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或者知道为什么这个例子不起作用?
答案 0 :(得分:0)
您使用的是32位版本的wscript和64位版本的Ruby。这意味着,既然可以从wscript而不是Ruby找到COM服务器,那么COM服务器在进程COM服务器中是32位。
您不能在一个进程中混合使用32位和64位代码。要么使用32位版本的Ruby,要么编译并注册64位版本的COM服务器。