2

RubyコードでC#からいくつかのメソッドを呼び出そうとしています。まず、VisualStudio2008で.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

ComVisibleHashTableですが、COMマーシャリングによってC#コレクションからRubyコレクションに魔法のように変換されることはありません。

Rubyを知らないので、例を示すことはできませんが、Rubyでトラバースするには、そこから返されたものを呼び出しHashTable.GetEnumeratorて使用する必要があります。IEnumVARIANTHashTable

于 2012-05-18T23:50:33.773 に答える
0

http://msdn.microsoft.com/en-us/library/ee817653.aspxを読んでみてください

リンクをたどって、管理対象からCOMデータ型への変換を提供するページを見つける必要があります

于 2012-05-19T01:42:47.293 に答える