Вызов библиотеки C # из python - PullRequest
       29

Вызов библиотеки C # из python

36 голосов
/ 10 сентября 2011

Кто-нибудь может поделиться рабочим примером того, как вызвать простую библиотеку C # (фактически ее WPF) из кода Python? (Я пытался использовать IronPython, и у меня было слишком много проблем с неподдерживаемой библиотекой CPython, которую использует мой код на python, поэтому я подумал о том, чтобы попробовать другой способ и вызвать мой код 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();
       }
    }
}

Plotter - это окно WPF, которое строит эллипс

Я не знаю, как вызвать этот код со всего моего питона. Какие-либо предложения?

Ответы [ 5 ]

33 голосов
/ 24 апреля 2015

Это на самом деле довольно легко. Просто используйте 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)
16 голосов
/ 11 сентября 2011

Поскольку ваш пост помечен IronPython, если вы хотите использовать образец C #, должно работать следующее.

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

p = PlotData()
p.Start()
11 голосов
/ 10 сентября 2011

Python для .Net (pythonnet) может быть разумной альтернативой IronPython в вашей ситуации. https://github.com/pythonnet/pythonnet/blob/master/README.md

С сайта:

Обратите внимание, что этот пакет не реализует Python как первоклассную CLR язык - он не производит управляемого кода (IL) из кода Python. Скорее, это интеграция движка CPython с .NET во время выполнения. Такой подход позволяет использовать службы CLR и продолжить использовать существующий код Python и расширения на основе C при сохранении собственная скорость выполнения кода Python.

Также

Python для .NET использует PYTHONPATH (sys.path) для поиска сборок загрузить, помимо обычной прикладной базы и GAC. к убедитесь, что вы можете неявно импортировать сборку, поместите каталог содержащий сборку в sys.path.

Для этого пакета по-прежнему требуется локальная среда выполнения CPython на вашем компьютере. Для получения дополнительной информации см. Полный файл Readme http://pythonnet.github.io/readme.html

7 голосов
/ 08 июня 2016

Этот проект был разработан именно для этой цели - используйте классы C # в обычном Python

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

Все, что вам нужно сделать, это установить MSI или EGG в ваш CPython.PyDotnet - это модуль Python, поэтому исполняемый файл остается обычным python.exe из вашей установки Python или Anaconda.Поддерживаются как 32-битные, так и 64-битные.

Неограниченный доступ ко всем классам C #, методам с параметрами вывода и ссылки, универсальным классам и универсальным методам, методам расширения, закрытым членам.

Перегруженный загрузчик сборок с настраиваемой механикой для поиска в сборках.

Информация о типе среды выполнения .NET, преобразуемая в объект класса, экземпляр которого можно создать как любой другой класс.

Специальный режим импорта, разработанный специально для интерактивной оболочки Python, который позволяет обнаруживать доступные сборки, пространства имен, классы., методы и т. д.

Жду отзывов:)

2 голосов
/ 10 сентября 2011

Я не эксперт по .NET, но ваш код выглядит так, как будто ваш метод представлен как COM-объект. Таким образом, вы можете попробовать http://starship.python.net/crew/mhammond/win32/ пакет для доступа к нему.

...