使用Python访问C#dll中存在的函数

时间:2016-07-25 13:33:09

标签: c# python .net ctypes dllimport

我想访问c#文件中存在的函数 my_function(),该文件被编译为.net dll - abc.dll

C#文件

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Text;
            using System.Threading.Tasks;


            namespace Test
            {
                public class Class1
                {
                    public string my_function()
                    {
                        return "Hello World.. :-";
                    }
                }
            }

将上面的代码编译成abc.dll后

使用下面的python尝试访问my_function()

            import ctypes
            lib = ctypes.WinDLL('abc.dll')
            print lib.my_function()

以上代码抛出错误

  
    
      

lib.my_function()                       Traceback(最近一次调用最后一次):                         文件“”,第1行,in                         文件“C:\ Anaconda \ lib \ ctypes__init __。py”,第378行, getattr                           func = self。 getitem (姓名)                         文件“C:\ Anaconda \ lib \ ctypes__init __。py”,第383行, getitem                           func = self._FuncPtr((name_or_ordinal,self))                       AttributeError:找不到函数'my_function'

    
  

1 个答案:

答案 0 :(得分:2)

你还没有在DLL中看到这个功能。

有几种不同的方法可以做到这一点。最简单的可能是使用unmanagedexports包。它允许您通过使用[DllExport]属性(如P / Invoke的DllImport)修饰您的函数,直接调用C#函数,就像普通的C函数一样。它使用了部分子系统,旨在使C ++ / CLI混合托管库工作。

C#代码

class Example
{
     [DllExport("ExampleFunction", CallingConvention = CallingConvention.StdCall)]
     public static int ExampleFunction(int a, int b)
     {
         return a + b;
     } 
}

的Python

import ctypes
lib = ctypes.WinDLL('example.dll')
print lib.ExampleFunction(12, 34)