2009-03-18 8 views
0

Bonjour et bonsoir, j'espère que quelqu'un peut vous aider. J'essaye d'obtenir une sorte de support de script allant. J'ai le code suivant, qui exécute une méthode ruby ​​et retourne le résultat. Cependant, il retourne une "erreur de méthode non trouvée" de IronRuby lui-même."Méthode inconnue" en utilisant IronRuby en C#

var engine = IronRuby.Ruby.CreateEngine(); 
returnvalue = engine.Operations.InvokeMember(instance, method, arg).ToString(); 

Je tourne le code suivant Ruby comme un test:

class Plotlight 
def get_message(a) 
res = "Hello- from Ruby " << a 
res 
end 

def swapcase(a) 
res = a.downcase 
res 
end 
end 

Maintenant, lors de l'exécution de la méthode get_message("something"), les choses fonctionnent bien. Cependant, lors de l'exécution quelque chose qui a une référence à la bibliothèque standard (swapcase dans cet exemple), il renvoie l'erreur

$exception {"undefined method `downcase' for fooBAR:ClrString"} System.Exception {System.MissingMethodException} 

L'exécution du code par ir.exe fonctionne sans aucun problème.

Ai-je besoin de faire référence à la bibliothèque, et si oui, comment faire?

Espérons que quelqu'un peut vous aider! Merci beaucoup.

Cordialement,
Marco

Répondre

2

Les chaînes Ruby ont une sémantique qui sont incompatibles avec les chaînes CLR. En particulier, ils sont mutables. L'interopérabilité entre les chaînes Ruby et les chaînes CLR n'est pas encore terminée, donc pour le moment, vous devrez explicitement transtyper le System.Ring CLR en un objet chaîne Ruby - soit dans votre code C# ou dans votre code Ruby.

La solution la plus simple est de définir swapcase comme ceci:

def swapcase(a) 
    String.new(a).downcase 
end 
+0

Très bien, merci beaucoup Curt! Cela fonctionne très bien ... – Marco