我正在着手开发一个exceldanaddin,使用ironpython和一些c作为对ironpython调用的包装。在excel dna开发人员的慷慨帮助下,我已经完成了一些启动和运行示例的初始工作,但是现在我正试图调试sharpdevelop中的addin,并且遇到了一些问题。由于我对其中的大部分都是新手,所以我不确定这是否是sharpdevelop、.net、excel dna或ironpython的问题。
我在一个解决方案中创建了两个项目,一个是C类库。另一个是python类库。我在一个博客上找到一个kinks后,将项目设置为调试。我可以单步执行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(python.createengine()返回的scriptengine)会尝试加载与发行版中包含的版本不同的版本。
代码如下。如果你需要其他信息,请告诉我。
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;
}
}
}
我的类.py
class MyClass:
def __init__(self):
pass
def AddSomeStuff(self,x,y):
return x + y
最佳答案
您的ironpython内容可能需要在.net 4运行时下运行。要告诉excel dna加载.net 4,必须在主.dna文件中显式添加runtimeversion属性。你的.dna文件将以如下内容开头:
<DnaLibrary RuntimeVersion="v4.0"> ... </DnaLibrary>
如果省略该属性,则默认行为是加载运行时的.NET2.0版本(也由.NET3.0和3.5使用)。
在.net 2.0运行时下托管ironpython可能是可行的,但随后您需要自己处理dlr库,而它们是内置的,已经与.net 4一起安装了。