0

私は次のRubyコードファイルを書きました:

require 'MyAssembly.dll'

class MyClass
    def initialize(obj)
        System::Diagnostics::WriteLine('test')
        @var = MyAssembly::Namespace::CSharpClass.new
    end
end

MyClass

CSharpClassは、デフォルトのコンストラクターが1つあるクラスです。今、私はこのファイルを次のように操作します。

dynamic MyClass = RubyEngine.Execute(script)
//script is a string which contains the aforementioned Ruby code as text
MyClass.@new(some_obj)

MyClassには、1つのパラメーターを持つコンストラクターがあることに注意してください。プログラムを実行すると、次の例外が発生します。ArgumentException-最後のC#コード行で引数の数が間違っています(1の場合は0)。

CSharpClassを他の名前に変更すると、そのようなオブジェクトがないという例外があります(したがって、アセンブリの読み込みは正常に機能したと思います)。

ここで楽しい部分です。initialize(obj)メソッドの2行目を次のように変更した場合

@var = MyAssembly::Namespace::CSharpClass.new(nil)

次に、デバッグ出力とStackOverflowExceptionに「テスト」文字列の長いリストがあります。したがって、再帰的なMyClassオブジェクトがインスタンス化されているように見えます。つまり、CSharpClass.new(nil)はどういうわけかMyClass.new(nil)として実行されます。おそらくそれが私が上記のAgrumentExceptionを取得した理由です。

IronRuby 1.0と1.1.3の両方を試しましたが、役に立ちませんでした。私は何を逃しましたか?

アップデート

もっと楽しく!ここで、Rubyコードが次のようになっていると仮定します。

require 'MyAssembly.dll'

class MyClass
    def initialize(a, b)
        @var = MyAssembly::Namespace::CSharpClass.new
    end
end

MyClass.new(0, 0)

異なる引数を使用してCSharpClass.newを呼び出そうとすると、相互に排他的な例外メッセージが表示されます。

CSharpClass.new           # wrong number of arguments (0 for 1)
CSharpClass.new(0)        # wrong number of arguments (1 for 2)
CSharpClass.new(0, 0)     # wrong number of arguments (2 for 1)
...
CSharpClass.new(<N args>) # wrong number of arguments (N for 1)

私が間違っていることを誰かが知っていれば、とてもうれしく思います。プロジェクトでIronRubyを使用したいと思っています。

4

1 に答える 1

0

まあ、それは素晴らしいと同時にひどいことです。次の行でファイルを開始したことがわかりました。

def initialize(obj)
    MyClass.new(obj)
end

つまり、宣言する前にMyClassを使用しました。これらの行を削除すると、問題が解決しました。何かがうまくいかないときに動的コードがどのような例外を生成できるのか不思議です...

于 2012-10-24T23:17:25.347 に答える