IronPython Excel-Dna Add-In - Eccezione per quanto riguarda riferimento Microsoft.Dynamic
-
24-10-2019 - |
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
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.