Domanda

io sono sempre iniziato con lo sviluppo di un Excel-DNA componente aggiuntivo utilizzando IronPython con un po 'C # come un wrapper per le chiamate a IronPython. Con il generoso aiuto dello sviluppatore Excel-DNA, ho lavorato con alcuni dei rel="noreferrer"> iniziale di ottenere un campione attivo e funzionante, ma ora sto cercando di eseguire il debug del componente aggiuntivo in SharpDevelop, e sto correndo in alcuni problemi. Come Sono completamente nuovo per la maggior parte di questo, io non sono davvero sicuro se si tratta di un problema con SharpDevelop, .NET, Excel-DNA o IronPython.

Ho creato due progetti in un'unica soluzione, uno è una libreria di classi C #. L'altro è una libreria di classi pitone. I ha installato il progetto per eseguire il debug a seguito di una esercitazione ho trovato su un blog. Sono in grado di passo attraverso le prime righe di codice C #, in modo che sia il progresso, ma quando arrivo alla seguente riga:

pyEngine.Runtime.LoadAssembly(myclass); 

ottengo un'eccezione:

"Impossibile caricare il file o l'assembly 'Microsoft.Dynamic, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' o una delle sue dipendenze. la posizione definizione manifesta dell'assemblea fa non corrisponde al riferimento assemblaggio. (Eccezione da HRESULT: 0x80131040) "

Ma sono abbastanza sicuro che ho aggiunto il riferimento Microsoft.Dynamic al mio progetto. E 'la versione 1.1.0.20. Questo è incluso nella distribuzione IronPython, ma anche in un'altra posizione sul mio computer. Ho provato a regolare il riferimento ad entrambi, ma entrambi hanno lo stesso numero di versione e sembrano essere la stessa dimensione del file. Nessuno dei due si lavora. Ho bisogno la versione 1.0.0.0 o sto facendo qualcosa che non va? Io non capisco il motivo per cui nulla pyEngine (la ScriptEngine restituito da Python.CreateEngine ()) avrebbe cercato di caricare una versione diversa rispetto a quella in dotazione con la distribuzione.

Codice è al di sotto. Fatemi sapere se avete bisogno di altre informazioni.

MyAddin.cs

/*
Added these references all as Local Copies - probably not necessary?

System.Windows.Forms
Microsoft.CSharp

ExcelDna.Integration (from Excel-DNA distribution folder)
IronPython (from IronPython folder)
IronPython.Modules (from IronPython folder)
Microsoft.Dynamic (from IronPython folder)
Microsoft.Scripting (from IronPython folder)
Microsoft.Scripting.Metadata (from IronPython folder)

mscorlib (I don't really know why I added this, but it was one of the references in my IronPython class library)

MyClass (this is the reference to my IronPython class - I checked to see that it gets copied in every time I rebuild the solution and it does)

These were automatically added by SharpDevelop when I created the project.
System
System.Core
System.Windows.Forms
System.Xml
System.Xml.Linq
*/
using System;
using System.IO;
using System.Windows.Forms;
using ExcelDna.Integration;
using System.Reflection;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

public class MyAddIn : IExcelAddIn
{
    public void AutoOpen()
    {
        try
        {
            string xllDirectory  = Path.GetDirectoryName(@"C:/Users/myname/Documents/SharpDevelop Projects/IronPythonExcelDNATest/MyAddIn/bin/Debug/");
            string dllPath = Path.Combine(xllDirectory,"MyClass.dll");
            Assembly myclass = Assembly.LoadFile(dllPath);
            ScriptEngine pyEngine = Python.CreateEngine();
            pyEngine.Runtime.LoadAssembly(myclass);
            ScriptScope pyScope = pyEngine.Runtime.ImportModule("MyClass");
            object myClass = pyEngine.Operations.Invoke(pyScope.GetVariable("MyClass"));
            IronTest.AddSomeStuff = pyEngine.Operations.GetMember<Func<double, double,double>>(myClass, "AddSomeStuff");
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }
    public void AutoClose()
    {
    }
}

public class IronTest
{
    public static Func<double, double, double> AddSomeStuff;
    public static double TestIPAdd(double val1, double val2)
    {
        try
        {
            return AddSomeStuff(val1, val2);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
            return double.NaN;
        }
    }
}

MyClass.py

class MyClass:
    def __init__(self):
        pass

    def AddSomeStuff(self,x,y):
        return x + y
È stato utile?

Soluzione

Il tuo roba IronPython probabilmente ha bisogno per l'esecuzione in .NET 4 runtime. A dire Excel-DNA a carico .NET 4, è necessario aggiungere in modo esplicito un attributo runtimeVersion nel file .dna principale. Il file .dna inizierà con qualcosa di simile:

<DnaLibrary RuntimeVersion="v4.0"> ... </DnaLibrary>

Il comportamento predefinito, se l'attributo viene omesso, è quello di caricare la versione NET 2.0 del runtime (che è anche utilizzato per NET 3.0 e 3.5).

Potrebbe essere possibile ospitare IronPython sotto il runtime .NET 2.0, ma allora avete bisogno di affrontare le librerie DLR da soli, mentre sono incorporati e già installati con .NET 4.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top