56

任何人都可以分享一个关于如何从 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();
       }
    }
}

Plotter 是一个绘制椭圆的 WPF 窗口

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

4

4 回答 4

46

这实际上很容易。只需使用 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)
于 2015-04-24T17:52:45.863 回答
20

由于您的帖子被标记为 IronPython,因此如果您想使用示例 C#,则以下内容应该可以工作。

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

p = PlotData()
p.Start()
于 2011-09-11T00:10:05.050 回答
16

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

从网站:

请注意,此包没有将 Python 实现为一流的 CLR 语言 - 它不会从 Python 代码生成托管代码 (IL)。相反,它是 CPython 引擎与 .NET 运行时的集成。这种方法允许您使用 CLR 服务并继续使用现有的 Python 代码和基于 C 的扩展,同时保持 Python 代码的本机执行速度。

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

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

于 2011-09-09T22:36:09.653 回答
10

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

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

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

无限制地访问所有 C# 类、带有输出和引用参数的方法、泛型类和泛型方法、扩展方法、私有成员。

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

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

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

我正在等待反馈:)

于 2016-06-07T23:54:30.957 回答