在 python 中使用 ctypes 访问 C# dll 的方法 [英] Using ctypes in python to access a C# dll's methods

查看:28
本文介绍了在 python 中使用 ctypes 访问 C# dll 的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的 Python 程序的关键部分实现 C# 代码以使其更快.它说(在 Python 文档和 本网站),您可以按如下方式加载动态链接库(以及 PyDocs):

I would like to implement C# code in a critical part of my python program to make it faster. It says (on Python documentation and this site) that you can load a Dynamic Link Library (and so say the PyDocs) as follows:

cdll.LoadLibrary("your-dll-goes-here.dll")

这是我的代码中负责处理此功能的部分:

This is the part of my code that takes care of this feature:

from ctypes import *
z = [0.0,0.0]
c = [LEFT+x*(RIGHT-LEFT)/self.size, UP+y*(DOWN-UP)/self.size]
M = 2.0

iterator = cdll.LoadLibrary("RECERCATOOLS.dll")

array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)

z = complex(array_result[0],array_result[1])
c = complex(array_result[2],array_result[3])
last_iteration = int(round(array_result[4]))

我使用的 RECERCATOOLS.dll 是这个(C# 代码,不是 C 或 C++):

And the RECERCATOOLS.dll that I use is this (C# code, not C or C++):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KarlsTools;

public class Program
{
    public static Array ITERATE(double z_r,double z_i,double c_r,
                        double c_i, int iterations, 
                        double limit)
    {
        Complex z = new Complex(z_r, z_i);
        Complex c = new Complex(c_r, c_i);

        for (double i = 1; Math.Round(i) <= iterations; i++)
        {
            z = Complex.Pow(z, 2) + c;
            if (Complex.Abs(z) < limit)
            {
                double[] numbers = new double[] { Complex.Real(z),
                                                  Complex.Imag(z),
                                                  Complex.Real(c),
                                                  Complex.Imag(c),
                                                  i};
                return numbers;
            }
        }
        double iter = iterations;
        double[] result = new double[]        { Complex.Real(z),
                                                  Complex.Imag(z),
                                                  Complex.Real(c),
                                                  Complex.Imag(c),
                                                  iter};
        return result;
    }
}

为了构建这个 DLL,我在 Visual Studio 2010 项目上使用了Build"命令,它只包含这个文件和对Karlstools"的引用,一个允许我使用复数的模块.

To build this DLL I use "Build" command over the Visual Studio 2010 project, which only contains this file and a reference to "Karlstools", a module that allows me to use complex numbers.

我不知道为什么,但是当我尝试运行我的 Python 代码时,它只是抛出一个异常:

I don't know why but when I try to run my Python code, it just throws an exception:

    [...]
    array_result = iterator.Program.ITERATE(z[0],z[1],c[0],c[1],self.iterations,M)
  File "C:Python32libctypes\__init__.py", line 353, in __getattr__
    func = self.__getitem__(name)
  File "C:Python32libctypes\__init__.py", line 358, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Program' not found

我需要这方面的帮助,因为即使所有内容都设置为 public 并且函数为 static,或者即使我尝试访问,它也会不断向我抛出异常直接调用函数而不指定程序"类......我不知道问题出在哪里.

I need help with this, since it keeps throwing me exceptions even with everything is set to public and the function as static, or even when if I try to access the function directly without specifying the "Program" class... I have no clue where the problem could be.

推荐答案

关于使用 ctypes 从 Python 调用 DLL 的提示大部分时间依赖于用 C 或 C++ 编写的 DLL,而不是 C#.使用 C#,您引入了 CLR 的整个机制,并且符号很可能被破坏,而不是 ctypes 所期望的,并且您将从输出数组的垃圾收集中遇到各种麻烦.

The tips you'll find regarding calling DLL from Python using ctypes rely most of the time to the DLL being written in C or C++, not C#. With C# you pull in the whole machinery of the CLR, and the symbols are most likely mangled and not what ctypes expect, and you'll get all sorts of troubles from the garbage collection of your output array.

通过将 python 用于 dot net (http://pythonnet.sf.net),你可能想试试这个.

I've had very good success when interfacing python and C# code by using python for dot net (http://pythonnet.sf.net), you may want to try this.

另一方面,如果您追求纯粹的性能,请考虑使用 Python/C API(http://docs.python.org/c-api/).

On the other hand if you are in for pure performance, consider rewriting your code as a native C extension for Python using the Python/C API (http://docs.python.org/c-api/).

这篇关于在 python 中使用 ctypes 访问 C# dll 的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆