从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调用这段代码。有什么建议吗?
这其实很简单。只需使用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设计的特殊导入模式,允许您发现可用的程序集,命名空间,类,方法等。
我在等待反馈:)