Appel d'une bibliothèque C# 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 supportée que mon code python utilise donc j'ai pensé à essayer l'autre chemin et appeler mon code C# 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();
       }
    }
}

Plotter est une fenêtre WPF qui trace une Ellipse

je ne sais pas comment appeler ce code de mon python. Toutes les suggestions?

35
demandé sur denfromufa 2011-09-10 02:10:40

5 réponses

C'est en fait assez facile. Il suffit d'utiliser NuGet pour ajouter le paquet "Unmanualedexports" à votre projet.Net. Voir https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports pour plus de détails.

vous pouvez alors exporter directement, sans avoir à faire un calque COM. Voici un 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 (pour les 2.7)

import ctypes
a = ctypes.cdll.LoadLibrary(source)
a.add(3, 5)
29
répondu Rob Deary 2015-04-24 17:52:45

depuis que votre post est étiqueté IronPython, si vous voulez utiliser l'échantillon C#, ce qui suit devrait fonctionner.

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

p = PlotData()
p.Start()
14
répondu Michael Baker 2011-09-11 00:10:05

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

à Partir du site:

notez que ce paquet N'implémente pas Python en tant que CLR de première classe langage-il ne produit pas de code géré (IL) à partir du code Python. Il s'agit plutôt D'une intégration du moteur CPython avec le. net Runtime. Cette approche vous permet d'utiliser CLR services et continuent de pour utiliser le code Python existant et les extensions basées sur C tout en maintenant vitesses d'exécution natives pour le code Python.

Python pour .NET utilise PYTHONPATH (sys.chemin) pour rechercher des assemblages pour charger, en plus de la base d'application habituelle et le GAC. De assurez - vous que vous pouvez implicitement importer une assemblée, mettre le répertoire contenant l'assemblage dans sys.chemin.

ce paquet nécessite encore que vous avez un CPython local sur votre machine. Voir le Readme complet pour plus d'info http://pythonnet.github.io/readme.html

11
répondu NickSuperb 2016-07-29 19:22:27

ce projet a été développé pour ce but précis - utiliser les classes C# en Python normal

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

Tout ce que vous devez faire est d'installer soit MSI soit EGG dans votre CPython. PyDotnet est un module Python, donc l'exécutable reste python normal.exe de votre installation de Python ou Anaconda. Pris en charge à la fois 32bit et 64bit.

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

chargeur de montage surchargé avec une mécanique personnalisée pour la recherche d'assemblages.

.NET runtime type information convertible en objet de classe, qui peut être instancié comme n'importe quelle autre classe.

mode d'importation spécial conçu spécialement pour Python interactive shell, qui vous permet de découvrir les assemblages disponibles, les namespaces, les classes, les méthodes, etc.

je suis d'attente pour les commentaires:)

7
répondu Radek 2016-06-07 23:54:30

Je ne suis pas un expert.net, mais vous codez ressemble à si votre méthode est exposée comme un objet COM. Vous pouvez donc essayer http://starship.python.net/crew/mhammond/win32/ paquet pour y accéder.

2
répondu rocksportrocker 2011-09-09 22:16:34