我想访问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'
答案 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)