文章目录
参考
pythonnet_github
为在python中使用dotnet程序安装clr
简单实现python调用c#dll动态链接库
测试
1、C# DLL类库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PythonCallDll
{
public class Class1
{
public string ClassName { get; set; }
public static int _classObjectCounts = 0;
public Class1()
{
ClassName = "PythonCallDll";
_classObjectCounts = _classObjectCounts + 1;
}
public Class1(string name)
{
ClassName = name;
_classObjectCounts = _classObjectCounts + 1;
}
public int AddCalc(int a, int b)
{
return a + b;
}
public void SayHello()
{
MessageBox.Show("hello");
}
public void SayHello(String name)
{
MessageBox.Show(name);
}
}
}
2、Python 调用dll
使用Pycharm+anaconda环境
# clr是公共运行时环境,这个模块是与C#交互的核心
import clr
import sys
from clr import System
sys.path.append(r'pythonProject') # 加载c#dll文件路径,与py文件放在一个文件夹中
clr.FindAssembly('PythonCallDll.dll') # 加载c#dll文件
a = clr.AddReference('PythonCallDll') # 实例化C#类库?,这样可以调用?,比如这个类库的来源Location, 测试如果屏蔽这行,会报错,但对类的实例化和调用没有影响。
print(a)
from PythonCallDll import * # 导入命名空间
# print(dir(Class1))
instance = Class1() # 创建类的对象实例1,使用无参构造器
instance2 = Class1('object2') # 创建类的对象实例2,使用有参构造器
print('Class1类的静态字段(对类的实例化次数计数)_classObjectCounts = ', Class1._classObjectCounts)
print('Class1类的实例1,调用方法AddCalc: 1+2= ', instance.AddCalc(1, 2))
print('Class1类的实例1,实例属性ClassName:',instance.ClassName)
print('Class1类的实例2,实例属性ClassName:',instance2.ClassName)
instance.SayHello() # Class1类的实例1,调用无参方法SayHello
instance.SayHello('pythonnet') # Class1类的实例1,调用有参方法SayHello
结果:
3、 遇到的一些问题
1、参考:python中调用 C#动态链接库问题记录
2、不使用 clr.AddReference(‘PythonCallDll’),程序执行效果:会报错,但程序运行结果依然正确。
3、sys.path.append(),相对路径和绝对路径
绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。
相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符
…/ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)
4、python中使用.net的Array类
from System import Array
myarray = Array[int](10)
该句报错 TypeError:Type ex Cannot convert 10 to System.Int32[]
解决参考:
执行时Arrayint会收到错误消息,看起来期望的参数不是大小,而是Python列表。以下对我有用:
py_array = [1, 2, 3]
net_array = Array[int](py_array)
现在,net_array.Length应该返回3。