Я начинаю разработку надстройки Excel-DNA с использованием IronPython с некоторым C # в качестве оболочки для вызовов IronPython. С щедрой помощью разработчика Excel-DNA я преодолел некоторые из первоначальных проблем , связанных с запуском и запуском образца, но теперь я пытаюсь отладить надстройку в SharpDevelop, и я столкнулся с некоторыми проблемами. Поскольку я совершенно новичок в большей части этого, я не совсем уверен, что это проблема SharpDevelop, .NET, Excel-DNA или IronPython.
Я создал два проекта в одном решении, one - это библиотека классов C #. Другой - это библиотека классов Python. Я настраиваю проект для отладки, следуя руководству , которое я нашел в блоге. Я могу пройти через первые несколько строк кода C #, так что это прогресс, но когда я перехожу к следующей строке:
pyEngine.Runtime.LoadAssembly(myclass);
, я получаю исключение:
«Не удалось загрузить файл или сборку. 'Microsoft.Dynamic, Версия = 1.0.0.0, Культура = нейтральный, 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>(myClass, "AddSomeStuff");
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public void AutoClose()
{
}
}
public class IronTest
{
public static Func 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