web-dev-qa-db-ja.com

pythonからC#ライブラリを呼び出す

誰でもpythonコードから単純なC#ライブラリ(実際にはそのWPF)を呼び出す方法に関する実例を共有できますか? (IronPythonを使用しようとしましたが、pythonコードが使用しているサポートされていないCPythonライブラリで問題が多すぎたため、別の方法で試してC#コードをPythonから呼び出すことを考えました)。

これが私が遊んでいた例です:

using System.Runtime.InteropServices;
using System.EnterpriseServices;

namespace DataViewerLibrary
{
    public interface ISimpleProvider
    {
       [DispIdAttribute(0)]
       void Start();
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class PlotData : ServicedComponent, ISimpleProvider
    {
       public void Start()
       {
          Plot plotter = new Plot();
          plotter.ShowDialog();
       }
    }
}

プロッターは楕円をプロットするWPFウィンドウです

pythonすべてからこのコードを呼び出す方法がわかりません。助言がありますか?

36
ychuri

実際には非常に簡単です。 NuGetを使用して、「UnmanagedExports」パッケージを.Netプロジェクトに追加するだけです。詳細については、 https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports をご覧ください。

その後、COMレイヤーを実行せずに直接エクスポートできます。サンプルC#コードを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using RGiesecke.DllExport;

class Test
{
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
    public static int TestExport(int left, int right)
    {
        return left + right;
    }
}

その後、dllをロードし、公開されたメソッドをPython(2.7で動作します)で呼び出すことができます

import ctypes
a = ctypes.cdll.LoadLibrary(source)
a.add(3, 5)
33
Rob Deary

投稿にはIronPythonのタグが付けられているため、サンプルC#を使用する場合は次のように動作します。

import clr
clr.AddReference('Assembly name here')
from DataViewerLibrary import PlotData 

p = PlotData()
p.Start()
17
Michael Baker

Python for .Net(pythonnet)は、状況に応じてIronPythonに代わる合理的な選択肢です。 https://github.com/pythonnet/pythonnet/blob/master/README.md

サイトから:

このパッケージは、ファーストクラスのCLR言語としてPythonを実装していません-Pythonコードからマネージコード(IL)を生成しません。このアプローチにより、CLRサービスを使用し、既存のPythonコードとCベースの拡張機能を引き続き使用しながら、=のネイティブ実行速度を維持することができます。 Pythonコード。

また

Python for .NETは、PYTHONPATH(sys.path)を使用して、通常のアプリケーションベースとGACに加えて、ロードするアセンブリを探します。アセンブリを暗黙的にインポートできるようにするには、sys.pathにアセンブリを含むディレクトリを配置します。

このパッケージでは、マシンにローカルCPythonランタイムが必要です。詳細については、完全なReadmeを参照してください http://pythonnet.github.io/readme.html

11
NickSuperb

このプロジェクトはまさにその目的のために開発されました-通常のPythonでC#クラスを使用します

https://bitbucket.org/pydotnet/pydotnet/wiki/Home

必要なことは、MSIまたはEggをCPythonにインストールすることだけです。 PyDotnetはPythonモジュールであるため、実行可能ファイルは、インストールされているPythonまたはAnacondaの通常のpython.exeのままです。32ビットと64ビットの両方をサポートしています。

すべてのC#クラス、出力パラメーターと参照パラメーターを持つメソッド、ジェネリッククラスとジェネリックメソッド、拡張メソッド、プライベートメンバーへの無制限のアクセス。

アセンブリを検索するためのカスタマイズされたメカニズムを備えたオーバーロードされたアセンブリローダー。

クラスオブジェクトに変換可能な.NETランタイムタイプ情報は、他のクラスとしてインスタンス化できます。

Pythonインタラクティブシェルのために特別に設計された特別なインポートモード。これにより、使用可能なアセンブリ、名前空間、クラス、メソッドなどを検出できます。

フィードバックを待っています:)

7
Radek

私は.NETのエキスパートではありませんが、コードはメソッドがCOMオブジェクトとして公開されているように見えます。したがって、 http://starship.python.net/crew/mhammond/win32/ パッケージにアクセスして試してください。

2
rocksportrocker