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

13 回复

问题一 不知道 问题二 .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!

几个关键点:

  1. 路径要写对,可以用绝对路径。
  2. 确保你的Python和.NET都是64位或都是32位,混着来会报错。
  3. 如果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 搞混了.
同时也带话 哈.

回到顶部