Надстройка IronPython Excel-Dna - исключение, касающееся справки Microsoft.Dynamic - PullRequest
5 голосов
/ 15 марта 2011

Я начинаю с разработки надстройки Excel-DNA с использованием IronPython с некоторым C # в качестве оболочки для вызовов IronPython.С щедрой помощью разработчика Excel-DNA я прошел некоторые из начальных изломов при получении образца и его запуске, но теперь я пытаюсь отладить надстройку в SharpDevelop, и ястолкнуться с некоторыми проблемами.Поскольку я полностью новичок в большей части этого, я не совсем уверен, если это проблема с SharpDevelop, .NET, Excel-DNA или IronPython.

Я создал два проекта в одном решении, один - библиотека классов C #.Другая - это библиотека классов Python.Я настроил проект для отладки, следуя инструкции , которую я нашел в блоге.Я могу пройти первые несколько строк кода C #, так что это прогресс, но когда я получаю следующую строку:

pyEngine.Runtime.LoadAssembly(myclass); 

, я получаю исключение:

«Не удалось загрузить файл или сборку» Microsoft.Dynamic, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 'или одна из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT:0x80131040) "

Но я почти уверен, что добавил ссылку Microsoft.Dynamic в свой проект.Это версия 1.1.0.20.Это включено в дистрибутив IronPython, но также и в другом месте на моем компьютере.Я попытался установить ссылку на оба, но они оба имеют одинаковый номер версии и, кажется, имеют одинаковый размер файла.Ни один из них не работает.Нужна ли мне версия 1.0.0.0 или я что-то не так делаю?Я не очень понимаю, почему что-то pyEngine (ScriptEngine, возвращаемый Python.CreateEngine ()) будет пытаться загрузить версию, отличную от той, которая включена в дистрибутив.

Код ниже.Дайте мне знать, если вам нужна какая-либо другая информация.

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

1 Ответ

3 голосов
/ 05 июля 2011

Ваш материал IronPython, вероятно, должен работать в среде выполнения .NET 4. Чтобы указать Excel-DNA загрузить .NET 4, вы должны явно добавить атрибут RuntimeVersion в основной файл .dna. Ваш файл .dna будет начинаться с чего-то вроде:

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

Поведение по умолчанию, если атрибут не указан, заключается в загрузке версии среды выполнения .NET 2.0 (которая также используется в .NET 3.0 и 3.5).

Возможно, можно разместить IronPython в среде выполнения .NET 2.0, но тогда вам придется самостоятельно работать с библиотеками DLR, поскольку они встроены и уже установлены в .NET 4.

...