Python中如何调用C#的dll
例有下一个用 C#写的 test.dll 里面有 test 的 NameSpace, Class1 的类,一个 returnstr 的方法
我的方法是:
import clr
test = clr.AddReference("test")
print test.returstr
这样的结果返回说
AttributeError: 'RuntimeAssembly' object has no attribute 'returstr'
问题 1:
网上也找了一些资料,看了 Python.Net 的资料好像也是这么写的,方法名应该也没错,比较奇怪,求解
问题 2: 有没有什么工具可以看到 dll 里面的方法名称?
附件 test.dll 地址: https://pan.baidu.com/s/1dvge54
Python中如何调用C#的dll
问题一 不知道 问题二 .Net Reflector 或者 ILSpy
在Python里直接调用C#的DLL,最靠谱的方案是用pythonnet这个包。它专门干这个事,能让你在Python里直接创建和调用.NET对象。
首先,你得安装它:
pip install pythonnet
假设你有个C#的DLL叫MyCSharpLib.dll,里面有个简单的类:
// MyCSharpLib.dll 里的代码
namespace MyCSharpLib {
public class Calculator {
public int Add(int a, int b) {
return a + b;
}
public string Greet(string name) {
return $"Hello, {name}!";
}
}
}
在Python里这么调用:
import clr # pythonnet 提供的模块
# 1. 添加DLL引用
clr.AddReference(r"完整路径\MyCSharpLib.dll")
# 2. 导入命名空间
from MyCSharpLib import Calculator
# 3. 创建实例并调用方法
calc = Calculator()
result = calc.Add(5, 3)
print(f"5 + 3 = {result}") # 输出: 5 + 3 = 8
greeting = calc.Greet("World")
print(greeting) # 输出: Hello, World!
几个关键点:
- 路径要写对,可以用绝对路径。
- 确保你的Python和.NET都是64位或都是32位,混着来会报错。
- 如果DLL依赖其他库,可能需要在调用
AddReference之前先加载那些依赖。
如果遇到问题:
- 先确认
pythonnet装对了:import clr不报错就行。 - 检查DLL是不是.NET Framework的,
pythonnet主要支持这个,.NET Core/5+的支持需要看版本和配置。
用pythonnet是最直接的方法,比折腾COM或者起个C#进程来通信要干净多了。
嗯,问题 2 我也刚安装了,现在就是问题一比较奇怪,已经确认了方法名应该都没错的.
Class1 呢?
他们 Python.net 的文档里面好像是直接调就可以了,试过先 import Class1 好像也还是一样报错
.net 的要用 ironpy 来调用吧
楼上正解 使用 ironpython 遗憾的是只支持 py2
试试import clr<br>clr.AddReference("test")<br>import test<br>print test.returstr<br> ?
呃,不好意思,我弄错了。不要在意我刚才的回复。
用 clr.System.Reflection.Assembly.LoadFile
囧,不好意思。就我现在搜集到的信息,DLL 的目标版本需为 .NET 4.0+,不然要设置某个环境变量。这个原因也有可能。然后除了上面的方法,似乎还可以 clr.AddReferenceToFileAndPath,这样相比 AddReference 就不用手动将路径添加到 sys.path 里。但具体是否可行我也说不清楚……
感谢二位,已经解决了确实是用 ironpython 可以处理,原先的时候把它和 Python For .net 搞混了.
同时也带话 哈.

