Вызов библиотеки С# из 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/ пакет для доступа к нему.