5

IronPython への呼び出しのラッパーとしていくつかの C# を使用して、IronPython を使用して Excel-DNA アドインの開発を開始しています。Excel-DNA 開発者の寛大な助けを借りて、サンプルを起動して実行する際の最初の問題を解決しましたが、現在、SharpDevelop でアドインをデバッグしようとしていますが、いくつかの問題が発生しています私はこのほとんどにまったく慣れていないので、それが SharpDevelop、.NET、Excel-DNA、または IronPython の問題であるかどうかはよくわかりません。

1 つのソリューションで 2 つのプロジェクトを作成しました。1 つは C# クラス ライブラリです。もう 1 つは python クラス ライブラリです。ブログで見つけたチュートリアルに従って、プロジェクトをデバッグするようにセットアップしました。C# コードの最初の数行をステップ実行できたので、これで問題は解決しましたが、次の行に到達すると、次のようになります。

pyEngine.Runtime.LoadAssembly(myclass); 

例外があります:

「ファイルまたはアセンブリ 'Microsoft.Dynamic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' またはその依存関係の 1 つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(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;
        }
    }
}

MyClass.py

class MyClass:
    def __init__(self):
        pass

    def AddSomeStuff(self,x,y):
        return x + y
4

1 に答える 1

3

IronPython のものは、おそらく .NET 4 ランタイムで実行する必要があります。Excel-DNA に .NET 4 をロードするように指示するには、メインの .dna ファイルに RuntimeVersion 属性を明示的に追加する必要があります。.dna ファイルは次のように始まります。

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

属性が省略されている場合、既定の動作では、ランタイムの .NET 2.0 バージョンが読み込まれます (.NET 3.0 および 3.5 でも使用されます)。

.NET 2.0 ランタイムで IronPython をホストすることは可能かもしれませんが、DLR ライブラリは組み込みで .NET 4 に既にインストールされているため、自分で処理する必要があります。

于 2011-07-04T21:32:27.747 に答える