通过COM从Ruby调用C#.dll

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

为了测试这个新进程,我在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=# 

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

我是否正确地走这条路?

谢谢

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

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

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

您必须按照链接查找提供托管到COM数据类型转换的页面