2

我试图在我的 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 接口”错误。有趣的是,如果我从 C# 返回一个数组, .each 将作用于该对象。

我是否以正确的方式去做这件事?

谢谢

4

2 回答 2

1

虽然HashTable是 ComVisible,但它不会通过 COM 编组神奇地从 C# 集合转换为 Ruby 集合。

我不知道任何 Ruby,所以我不能给你一个例子,但你可能需要调用HashTable.GetEnumerator并使用它IEnumVARIANT返回的来遍历你HashTable的 Ruby。

于 2012-05-18T23:50:33.773 回答
0

尝试阅读http://msdn.microsoft.com/en-us/library/ee817653.aspx

您必须点击链接才能找到提供托管到 COM 数据类型转换的页面

于 2012-05-19T01:42:47.293 回答