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

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

Плоттер - это окна WPF, которые вырезают Ellipse

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

Ответ 1

На самом деле это довольно легко. Просто используйте NuGet, чтобы добавить пакет UnmanagedExports в ваш проект .Net. Подробнее см. https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports.

Затем вы можете напрямую экспортировать, не выполняя COM-уровень. Вот пример кода С#:

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)

Ответ 2

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

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

p = PlotData()
p.Start()

Ответ 3

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

С сайта:

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

Кроме

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

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

Ответ 4

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

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

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

Неограниченный доступ ко всем классам С#, методы с параметрами вывода и ref, общие классы и общие методы, методы расширения, частные члены.

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

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

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

Я жду обратной связи:)

Ответ 5

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