2011-09-09 38 views
31

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

は私が遊んでいた例です。

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(); 
     } 
    } 
} 

プロッタは、私はすべての私のpythonから、このコードを呼び出す方法を知っていない楕円

をプロットしているWPFウィンドウです。助言がありますか?

+0

あなたがCを使用することができ++/CLIラッパー。参照の回答としてhttp://stackoverflow.com/a/42930903/1178267を参照してください。 – anhoppe

答えて

2

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

+0

.NETオブジェクトをCOMオブジェクトとしてエクスポーズできますが、パフォーマンスヒットがあり、デフォルトではありません。 - あなたがそれをうまく行かないと、メモリリークにつながる可能性もあります。 - 一般的には、既にCOMをサポートしている古いテクノロジと統合する場合のように、下位互換性のためにのみこのアプローチを使用します。また、このアプローチをとると、Windowsプラットフォームに完全に限定されていることは言うまでもありません。 – BrainSlugs83

10

あなたの状況では、.Net(pythonnet)用のPythonは、IronPythonの妥当な代替手段です。サイトから https://github.com/pythonnet/pythonnet/blob/master/README.md

Note that this package does not implement Python as a first-class CLR language - it does not produce managed code (IL) from Python code. Rather, it is an integration of the CPython engine with the .NET runtime. This approach allows you to use use CLR services and continue to use existing Python code and C-based extensions while maintaining native execution speeds for Python code.

また

Python for .NET uses the PYTHONPATH (sys.path) to look for assemblies to load, in addition to the usual application base and the GAC. To ensure that you can implicitly import an assembly, put the directory containing the assembly in sys.path.

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

12

あなたの投稿はIronPythonでタグ付けされているので、サンプルC#を使用する場合は、次のように動作する必要があります。

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

p = PlotData() 
p.Start() 
+3

正確に同じコードは.Net用のPythonの最後のリリースで動作します。両方のソリューション(IronPythonとCPython + PythonNet)が同じように動作することを知っておくとよいでしょう。 – Vincent

27

実際はかなり簡単です。 NuGetを使って.Netプロジェクトに "UnmanagedExports"パッケージを追加するだけです。詳細は、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で公開されたメソッドを呼び出すことができます。このプロジェクトはその正確な目的のために開発された

import ctypes 
a = ctypes.cdll.LoadLibrary(source) 
a.add(3, 5) 
+0

あなたがライブラリを管理している場合は非常にクールです。そうでない場合は、Cスタイルの呼び出し規約でラッパー.dllを作成できると想像してください。 – CodeMonkey

+2

次のエラーが表示されました:AttributeError:function 'add' not found – constructor

+3

重要な参照:http://stackoverflow.com/questions/34417972/no-functions-in-c-sharp-dll-with-rgiesecke-dllexport – constructor

7

(2.7のために働く) - 使用します通常のPythonでのC#クラスは

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

あなたがする必要があるすべてはあなたのCPythonのにMSIまたは卵のいずれかをインストールすることです。 PyDotnetはPythonモジュールなので、実行ファイルはPythonまたはAnacondaのインストール時に通常のpython.exeのままです。 32bitと64bitの両方をサポートしています。

すべてのC#クラス、出力パラメータと参照パラメータを持つメソッド、汎用クラスと汎用メソッド、拡張メソッド、プライベートメンバーに無制限にアクセスできます。

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

他のクラスと同様にインスタンス化することができるクラスオブジェクトに変換可能な.NETランタイム型情報。私はフィードバックを待っている

、使用可能なアセンブリ、名前空間、クラス、メソッドを発見することを可能にする、特にPythonのインタラクティブシェル用に設計された特別なインポートモードは、など

:)

+0

> >> import dotnet.seamless トレースバック(最新のコール最後): ファイル ""、行1、 ファイル "C:¥Program Files¥Python35-32¥lib¥site-packages¥dotnet¥__ init__.py "、行21、 import dotnet.moduleloader ファイル" C:¥Program Files¥Python35-32¥lib¥site-packages¥dotnet¥moduleloader.py "、行24、 from dotnet import PyDotnet as _dotnet ImportError:DLLの読み込みに失敗しました:指定されたモジュールco uldが見つかりません。 –

関連する問題