c# - 通过 COM 从 Ruby 调用 C# .dll

标签 c# ruby-on-rails ruby dll win32ole

我正尝试在我的 Ruby 代码中从 C# 调用一些方法。首先,我在 Visual Studio 2008 中创建一个 .dll。我在构建时注册 COM 互操作。

为了测试这个新过程,我在 C# 中创建了一个简单的小 DivideTwo 方法-

        public double DivideTwo(double a, double b)
    {
        return a / b;
    }

在 Ruby 中,我执行以下操作:

require 'win32ole'
test=WIN32OLE.new('DllAttempt.CsharpDll')
x=test.DivideTwo(5,5)
puts x
#x=1

我很兴奋,因为我觉得我已经开始工作了!我决定接下来通过以下方法从 C# 返回哈希:

        public Hashtable Hashtbl(string a,int b)
    {
        Hashtable bbDataHash = new Hashtable();
        bbDataHash.Add(a, b);
        return (Hashtable)bbDataHash;
    }

在 Ruby 中,我执行以下操作:

require 'win32ole'
test=WIN32OLE.new('DllAttempt.CsharpDll')
x=test.Hashtbl("key",1)
puts x
#x=#<WIN32OLE:0x283f3f4>

如您所见,我取回了一个 COM 对象。我无法从对象中得到任何东西。 x.each {block} 给我一个“无法获取 IEnum 接口(interface)”错误。有趣的是,如果我从 C# 返回一个数组,.each 将作用于该对象。

我的做法是否正确?

谢谢

最佳答案

虽然 HashTable 是 ComVisible,但它不会通过 COM 编码(marshal)处理神奇地从 C# 集合转换为 Ruby 集合。

我不懂任何 Ruby,所以我不能给你举个例子,但你可能需要调用 HashTable.GetEnumerator 并使用 IEnumVARIANT从那里返回以遍历 Ruby 中的 HashTable

关于c# - 通过 COM 从 Ruby 调用 C# .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660904/

相关文章:

c# - DependencyProperty 默认值取决于强制逻辑

c# - 数据库连接(最佳实践)

ruby-on-rails - bower-rails 无法再安装包

ruby - 为什么我所有的看跌期权都返回=>nil?

c# - .NET应用程序运行时是否加载了mscorlib.dll/mscoree.dll

c# - 用于提取方括号之间的值的正则表达式

ruby-on-rails - 在哪里获取 Salesforce API for Rails 3.2.11 的 client_id 和 client_secret

ruby-on-rails - 将索引中的 meta_search gem 与现有的地理编码器 gem 搜索(rails)集成

ruby-on-rails - rails : Why does my route enforce an ending with a dot id?

ruby-on-rails - 令人难忘的 ruby 名称生成器 gem