从python调用c#库

本文关键字:调用 python | 更新日期: 2023-09-27 18:08:23

任何人都可以分享如何从python代码调用一个简单的c#库(实际上是它的WPF)的工作示例?(我尝试过使用IronPython,并且在我的python代码使用的不受支持的CPython库中遇到了太多麻烦,所以我想尝试另一种方式,并从python调用我的c#代码)。

这是我正在玩的例子:

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窗口

我不知道如何从我的python调用这段代码。有什么建议吗?

从python调用c#库

这其实很简单。只需使用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)

因为你的文章被标记为IronPython,如果你想使用下面的c#示例应该可以工作。

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

Python for . net (pythonnet)在您的情况下可能是IronPython的合理替代方案。https://github.com/pythonnet/pythonnet/blob/master/README.rst

从站点:

注意,这个包没有将Python实现为一级CLRlanguage -它不会从Python代码生成托管代码(IL)。相反,它是CPython引擎与。net的集成运行时。这种方法允许您使用CLR服务并继续使用使用现有的Python代码和基于c的扩展,同时维护Python代码的本地执行速度。

.NET的Python使用PYTHONPATH (sys.path)来查找程序集加载,除了通常的应用程序库和GAC。来确保您可以隐式导入程序集,将目录在sys.path.

中包含程序集

这个包仍然要求你的机器上有一个本地的CPython运行时。更多信息请参阅完整的自述文件https://github.com/pythonnet/pythonnet

这个项目就是为了这个目的而开发的——在常规的Python中使用c#类

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

你需要做的就是将MSI或EGG安装到你的CPython中。PyDotnet是Python模块,因此可执行文件仍然是Python或Anaconda安装中的常规Python .exe。支持32位和64位。

不受限制地访问所有c#类、带输出和ref参数的方法、泛型类和泛型方法、扩展方法、私有成员。

带有自定义搜索程序集机制的重载程序集加载器。

。. NET运行时类型信息可转换为类对象,该类对象可以作为任何其他类实例化。

专门为Python交互式shell设计的特殊导入模式,允许您发现可用的程序集,命名空间,类,方法等。

我在等待反馈:)