私は次の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を使用したいと思っています。