如何在Python中加载C# dll?

37 投票
5 回答
97600 浏览
提问于 2025-04-15 18:05

我该怎么在Python中加载一个C#的DLL文件呢?

我需要在C#文件里加一些额外的代码吗?(就像在C++文件里需要用到的export那样)

我不想用IronPython。我想直接把一个模块导入到Python里!

5 个回答

6

如果你不想使用像 Python .NETIronPython 这样的解决方案,你可以自己做一个 C++/CLI 的包装器,然后用 Python 的 ctypes 来加载它。举个例子:

这个 C++/CLI 库叫做 CallCSharp:

extern "C" {
    __declspec(dllexport) void foo()
    {
        // here you could use managed and unmanaged code
        Console.WriteLine("Hello, C# world...");
    }

这是一个 Python 脚本:

from ctypes import cdll
lib = cdll.LoadLibrary("./CallCSharp.dll")
lib.foo()

关于使用 ctypes 的更多例子可以在 这里找到

我强烈推荐你阅读这个博客: http://pragmateek.com/if-your-plumbing-doesnt-work-youre-just-not-using-enough-pipes/#more-1745

这个博客还解决了一个问题,就是当 C++/CLI 的包装器调用另一个程序集里的代码时会出现的问题(如果发生这种情况,你的 Python 脚本可能会显示类似 WindowsError: [Error -532462766] Windows Error 0xE0434352 的错误)。

37

现在,Python for.NET这个包和Python的实现版本IronPython的工作方式是一样的。

下面是一个关于C# DLL MyDll.dll的示例:

import clr
clr.AddReference('MyDll')
from MyNamespace import MyClass
my_instance = MyClass()

想了解更多细节,可以查看这篇文章

9

这是为了回答你问题的第二部分。

试着让这个DLL变得可以被COM识别。

可以使用下面的代码:

[ComVisible(true)]

好的,IronPython是Python语言在.NET上的一个实现。

这个技术会在.NET 4.0发布时使用DLR(动态语言运行时),这样IronPython会变得更加灵活(这算不算一个词?)。

如果你是Python高手,使用IronPython时会感觉更自在。

所以你可以选择IronPython,如果这样做的话,就可以跳过让它COM可见的步骤,因为C#和IronPython都是在.NET平台下的。

http://ironpython.net/

撰写回答