如何在Python中加载C# DLL?

37

如何在Python中加载C# dll?

我需要在C#文件中添加一些额外的代码吗?(例如,在C++文件中导出)

我不想使用IronPython。我要导入一个模块到Python!


你可能需要添加一些澄清。我们是在谈论CPython还是IronPython? - Jason Baker
我想在Python中导入一个模块(不是IronPython..) - aF.
你会遇到困难。C# DLL是用CIL编写的,不是Python,也不能被Python读取。你要么全力使用.NET并使用IronPython,要么忍受使用COM的痛苦。难道没有一种方法可以使用本地的Python模块吗? - Callum Rogers
3
在Stack Overflow的帮助下,我完成了任务。我将我的C# dll转换为一个COM InterOp DLL,然后在C++ DLL中使用它。之后,我使用ctypes来调用C++ DLL的函数 :) - aF.
5个回答

36

这个包Python for.NET和Python实现IronPython现在的工作方式相同。

C# DLL MyDll.dll的示例:

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

请参见此帖子以获取更多详细信息。


5
请先通过 pip3 install pythonnet 安装它。 - Felix

9
这是回答您问题的第二部分。尝试将DLL设置为COM可见。
通过使用:
[ComVisible(true)]

好的,IronPython是Python语言的一个.NET实现技术。当.NET 4.0到来时,该技术将使用.NET 4.0的DLR,因此IronPython将具有更多的动态性(这是一个词吗?)。(如果您是Python专家,则使用IronPython时会感觉更加自如)

因此,您可能会选择IronPython,如果这样做,您可以跳过COM可见部分。由于两者(C#,Iron Python)都在.NET下运行。

http://ironpython.net/


1
既然我看了Ironpython,我就明白它是什么了。但我不想要那个。我想在Python中导入一个模块 :P - aF.
你是指将C#代码导入Python还是将C# dll导入Python? - Vivek Bernard
在Python中导入并使用来自C# Dll的函数 - aF.
我猜这个解决方案在 .net 4.0 之前是不可用的?我尝试了 .net 2.0,但没有 ComVisible 选项。 - Georg W.
1
你选择了使用Iron Python作为正确答案,但又表示不想要那个答案。我和你有同样的需求,所以你的正确答案对我没有帮助。 - Ant

6
如果您不想使用 Python .NETIronPython 等解决方案,可以实现一个 C++/CLI 包装器,并使用 Pythons 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的错误信息)。


5

-1

虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案如果链接页面发生变化可能会失效。- 来自评论 - Alez
虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案如果链接页面发生变化可能会失效。- 来自评论 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接