Llamando a una biblioteca de C # desde python

¿Alguien puede compartir un ejemplo práctico sobre cómo llamar a una biblioteca simple de C # (en realidad su WPF) desde el código de Python? (He intentado usar IronPython y tuve demasiados problemas con la biblioteca de CPython no compatible que usa mi código de Python, así que pensé en probar al revés y llamar a mi código C # desde Python).

Aquí está el ejemplo con el que estaba jugando:

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 es una ventana de WPF que traza un Ellipse.

No sé cómo llamar a este código de mi python todos. ¿Alguna sugerencia?

En realidad es bastante fácil. Simplemente use NuGet para agregar el paquete “UnmanagedExports” a su proyecto .Net. Para obtener más detalles, consulte https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports .

Luego puede exportar directamente, sin tener que hacer una capa COM. Aquí está el código de ejemplo de 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; } } 

Luego puede cargar la dll y llamar a los métodos expuestos en Python (funciona para 2.7)

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

Dado que su publicación está etiquetada como IronPython, si desea utilizar el C # de muestra, debería funcionar lo siguiente.

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

Python para .Net (pythonnet) puede ser una alternativa razonable a IronPython en su situación. https://github.com/pythonnet/pythonnet/blob/master/README.md

Desde el sitio:

Tenga en cuenta que este paquete no implementa Python como lenguaje CLR de primera clase; no produce código administrado (IL) a partir de código Python. Más bien, es una integración del motor CPython con el tiempo de ejecución .NET. Este enfoque le permite usar los servicios de CLR y continuar utilizando el código Python existente y las extensiones basadas en C mientras mantiene las velocidades de ejecución nativas para el código Python.

también

Python para .NET utiliza PYTHONPATH (sys.path) para buscar ensamblajes para cargar, además de la base de aplicación habitual y el GAC. Para asegurarse de que puede importar implícitamente un ensamblaje, ponga el directorio que contiene el ensamblaje en sys.path.

Este paquete aún requiere que tengas un tiempo de ejecución CPython local en tu máquina. Consulte el archivo Léame completo para obtener más información http://pythonnet.github.io/readme.html

Este proyecto se ha desarrollado para ese propósito exacto: use clases de C # en Python regular

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

Todo lo que necesita hacer es instalar MSI o EGG en su CPython. PyDotnet es un módulo de Python, por lo que el ejecutable se mantiene regular en python.exe desde su instalación de Python o Anaconda. Soporta tanto 32bit como 64bit.

Acceso ilimitado a todas las clases de C #, métodos con parámetros de salida y referencia, clases genéricas y métodos generics, métodos de extensión, miembros privados.

Cargador de conjuntos sobrecargado con mecánicos personalizados para buscar conjuntos.

Información de tipo de tiempo de ejecución .NET convertible en objeto de clase, que puede ser instanciada como cualquier otra clase.

Modo de importación especial diseñado especialmente para el shell interactivo de Python, que le permite descubrir ensamblajes disponibles, espacios de nombres, clases, métodos, etc.

Estoy esperando comentarios 🙂

No soy un experto en .NET, pero su código parece que su método está expuesto como un objeto COM. Por lo tanto, puede probar el paquete http://starship.python.net/crew/mhammond/win32/ para acceder a él.