我试图在我的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=#<WIN32OLE:0x283f3f4>
如您所见,我找回了一个COM对象。我无法从对象中获得任何东西。 x.each {block}给出了“无法获取IEnum接口”的错误。有趣的是,如果我从C#返回一个数组,那么.each就会对该对象起作用。
我是否正确地采取了这种方式?
由于
答案 0 :(得分:1)
虽然HashTable
是ComVisible,但它不会通过COM编组从C#集合神奇地转换为Ruby集合。
我不知道任何Ruby,所以我不能给你一个例子,但你可能需要调用HashTable.GetEnumerator
并使用从中返回的IEnumVARIANT
来遍历你的Ruby中的HashTable
。
答案 1 :(得分:0)
尝试阅读http://msdn.microsoft.com/en-us/library/ee817653.aspx
您必须按照链接查找为您提供托管到COM数据类型转换的页面