web-dev-qa-db-fra.com

Appel d'une bibliothèque C # à partir de python

N'importe qui peut partager un exemple de travail sur la façon d'appeler une simple bibliothèque C # (en fait son WPF) à partir du code python? (J'ai essayé d'utiliser IronPython et j'ai eu trop de problèmes avec la bibliothèque CPython non prise en charge que mon code python utilise, alors j'ai pensé essayer l'inverse et appeler mon code C # à partir de Python).

Voici l'exemple avec lequel je jouais:

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

Le traceur est une fenêtre WPF qui trace une ellipse

Je ne sais pas comment appeler ce code depuis mon python tout. Aucune suggestion?

36
ychuri

C'est en fait assez simple. Utilisez simplement NuGet pour ajouter le package "UnmanagedExports" à votre projet .Net. Voir https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports pour plus de détails.

Vous pouvez ensuite exporter directement, sans avoir à faire de couche COM. Voici l'exemple de code 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;
    }
}

Vous pouvez ensuite charger la DLL et appeler les méthodes exposées dans Python (fonctionne pour 2.7)

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

Étant donné que votre publication est marquée IronPython, si vous souhaitez utiliser l'exemple C #, les éléments suivants devraient fonctionner.

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

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

Python pour .Net (pythonnet) peut être une alternative raisonnable à IronPython dans votre situation. https://github.com/pythonnet/pythonnet/blob/master/README.md

Depuis le site:

Notez que ce package n'implémente pas Python en tant que langage CLR de première classe - il ne produit pas de code managé (IL) à partir de Python code. Au contraire, il est une intégration du moteur CPython avec le runtime .NET. Cette approche vous permet d'utiliser les services CLR et de continuer à utiliser le code Python et les extensions basées sur C tout en maintenant des vitesses d'exécution natives pour = Python code.

Également

Python pour .NET utilise le PYTHONPATH (sys.path) pour rechercher les assemblys à charger, en plus de la base d'application habituelle et du GAC. Pour vous assurer que vous pouvez importer implicitement un assembly, placez le répertoire contenant l'assembly dans sys.path.

Ce package nécessite toujours que vous disposiez d'un runtime CPython local sur votre machine. Voir le Readme complet pour plus d'informations http://pythonnet.github.io/readme.html

11
NickSuperb

Ce projet a été développé dans ce but précis - utilisez des classes C # en Python standard

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

Tout ce que vous devez faire est d'installer MSI ou Egg dans votre CPython. PyDotnet est Python, donc l'exécutable reste régulier python.exe à partir de votre installation de Python ou Anaconda. Pris en charge à la fois 32 bits et 64 bits.

Accès illimité à toutes les classes C #, méthodes avec paramètres de sortie et ref, classes génériques et méthodes génériques, méthodes d'extension, membres privés.

Chargeur d'assemblage surchargé avec une mécanique personnalisée pour la recherche d'assemblages.

Informations de type d'exécution .NET convertibles en objet classe, qui peuvent être instanciées comme n'importe quelle autre classe.

Mode d'importation spécial spécialement conçu pour Python Shell interactif, qui vous permet de découvrir les assemblys, espaces de noms, classes, méthodes, etc. disponibles.

J'attends des commentaires :)

7
Radek

Je ne suis pas un expert .NET, mais votre code semble que votre méthode est exposée comme un objet COM. Vous pouvez donc essayer http://starship.python.net/crew/mhammond/win32/ package pour y accéder.

2
rocksportrocker