2 Stimmen

Unterstützt mono 2.8 das Schlüsselwort "dynamic"?

Ich habe IronPython auf mono 2.8 mit dem Code aus dem Buch getestet Professionelles IronPython S.315 Liste 15-3.

using System;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting;

namespace Method2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Obtain the runtime.
            var IPY = Python.CreateRuntime();

            // Create a dynamic object containing the script.
            dynamic TestPy = IPY.UseFile("TestClass.py");

            // Execute the __test__() method.
            TestPy.__test__();
        }
    }
}

Ich sehe, es ist OK kompiliert, und laufen ohne ein Problem auf Windows 7, während die mono 2.8 gibt mir die folgende Fehlermeldung.

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
\`Microsoft.Scripting.Hosting.ScriptScope' does not contain a definition for \`\_\_test\_\_'
at (wrapper dynamic-method) object.CallSite.Target (System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,object) 
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1
(System.Runtime.CompilerServices.CallSite,object) 
at Method2.Program.Main (string\[\]) 

Ich dachte, Mono 2.8 unterstützt C# 4.0, die das dynamische Schlüsselwort hat, aber ich sehe, dass das "dynamische" Schlüsselwort nicht vollständig mit Mono unterstützt wird.

Ist dies ein Fehler von Mono 2.8?

HINZUFÜGEN

Dies ist das Python-Skript.

# The class you want to access externally.
class DoCalculations():

    # A method within the class that adds two numbers.
    def DoAdd(self, First, Second):

        # Provide a result.
        return First + Second

# A test suite in IronPython.
def __test__():

    # Create the object.
    MyCalc = DoCalculations()

    # Perform the test.
    print MyCalc.DoAdd(5, 10)

    # Pause after the test session.
    raw_input('\nPress any key to continue...')

Der von mir verwendete Befehl lautet wie folgt

dmcs Program.cs /r:System.Core /r:IronPython.dll /r:IronPython.Modules.dll /r:Microsoft.Dynamic.dll /r:Microsoft.Scripting.dll /r:Microsoft.CSharp.dll

Es lässt sich zwar gut kompilieren, aber wenn ich die ausführbare Binärdatei ausführe, bricht es trotzdem ab. Müssen sich alle Dlls im selben Verzeichnis befinden, in dem auch das Execution Binary liegt?

3voto

jbtule Punkte 30716

Die Tatsache, dass Sie eine Microsoft.CSharp.RuntimeBinder.RuntimeBinderException bedeutet, dass das dynamische Schlüsselwort funktioniert hat. Das Problem, das Sie haben, ist, dass IPY.UseFile("TestClass.py"); ein ScriptScope zurückgibt, das Ihre Test Methode. Das Problem liegt also in Ihrem Python-Quelltext oder in der Art und Weise, wie Sie IronPython in mono einbinden.

1voto

Justin Punkte 8548

En dynamic Schlüsselwort wird von Mono 2.8 unterstützt, wenn das C# 4 Profil verwendet wird.

Ich schätze, meine Frage ist, wie Sie diese Probe erstellen?

Nur so zum Spaß habe ich gerade Ihr Beispiel in MonoDevelop eingefügt. Ich musste MonoDevelop erst einmal sagen, dass es C# 4 anstelle von C# 3.5 verwenden soll.

En dynamic Schlüsselwort wurde natürlich in C# 4 eingeführt.

Außerdem musste ich ein paar Verweise auf die Montage einfügen: System.Core, IronPython.dll, IronPython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.dll und Microsoft.CSharp.dll. Ich bin mir nicht sicher, ob ich sie alle benötige.

Wenn Sie von der Befehlszeile aus bauen, müssen Sie "dmcs" als Compiler verwenden (um das .NET 4-Profil anzugeben) und Sie müssen die Assembly-Referenzen einschließen.

Mit dieser Konfiguration wird es (zumindest bei mir) ohne Probleme gebaut.

1voto

bhadra Punkte 12767

Ich beantworte diese Frage in Bezug auf Mono 2.10.

Ich konnte den Code erfolgreich über die Kommandozeile unter Windows 7 erstellen und ausführen, ohne MonoDevelop zu verwenden. Hier sind die Schritte:

  1. Instale Mono 2.10.8 unter Windows 7.
  2. Instale IronPython 2.7.2.1 .
  3. " C:\Program Dateien \Mono\bin " oder gleichwertig und " C:\Program Dateien \IronPython 2.7" oder gleichwertig sollte Teil des Systempfads sein.
  4. Sowohl TestClass.py als auch Program.cs sollten sich im selben Ordner befinden.
  5. Führen Sie in der Eingabeaufforderung des Ordners, in dem sich TestClass.py und Program.cs befinden, die Batch-Datei setmonopath aus.
  6. Führen Sie an der gleichen Eingabeaufforderung den folgenden Befehl aus:

dmcs Programm.cs /r:System /r:" C:\Program Dateien \IronPython 2.7 \IronPython.dll " /r:" C:\Program Dateien \IronPython 2.7 \IronPython.Modules.dll " /r:" C:\Program Dateien \IronPython 2.7 \Microsoft.Dynamic.dll " /r:" C:\Program Dateien \IronPython 2.7 \Microsoft.Scripting.dll " /r:" C:\program Dateien \IronPython 2.7 \Microsoft.Scripting.MetaData.dll " /r:Microsoft.Csharp

Program.exe sollte erfolgreich erstellt werden und kann ohne Fehlermeldung ausgeführt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X