2012-05-18 82 views
2

我想从C#中的Ruby代码中调用几个方法。首先,我在Visual Studio 2008中创建了一个.dll。我在构建时注册了COM interop。从Ruby通过COM调用C#.dll

为了测试这个新的过程中,我创建了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#返回一个数组,那么每个对象都可以工作。

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

感谢

回答

1

虽然HashTable是标记有ComVisible特性,它不会得到神奇地从C#集合通过COM封送处理转换成一个Ruby集合。

我不知道任何Ruby,所以我不能给你一个例子,但你可能会需要调用HashTable.GetEnumerator和使用IEnumVARIANT从返回遍历在Ruby中你HashTable

+0

编辑的页面,以反映事实的GetEnumerator可能返回一个IEnumVARIANT代替一个IDictionaryEnumerator。 – imasloen

+0

也许你可以返回一个JSON序列化的HashTable字符串,然后直接反序列化成一个Ruby对象。 – ProfNimrod