【问题标题】:How to load a C# dll in python?如何在 python 中加载 C# dll?
【发布时间】:2018-06-05 09:43:38
【问题描述】:

如何在 python 中加载 c# dll?

我必须在 c# 文件中添加一些额外的代码吗? (如在 c++ 文件中导出)

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

【问题讨论】:

  • 您可能需要添加一些说明。我们在谈论 CPython 还是 IronPython
  • 我想在 Python 中导入一个模块(那时不是 IronPython..)
  • 你会挣扎的。 C# DLL 是用 CIL 编写的,不是 python,也不是 python 可读的。您要么完全使用 .NET 并使用 IronPython,要么遭受使用 COM 的痛苦。没有什么方法可以使用原生 python 模块吗?
  • 在堆栈溢出的帮助下,我做到了。我已将我的 C# dll 转换为 COM InterOp DLL,然后在 C++ DLL 中使用它。之后我使用 ctypes 调用 C++ DLL 函数:)

标签: c# python .net cpython python.net


【解决方案1】:

这是回答您问题的第二部分 尝试使 DLL COM 可见。

通过使用

[ComVisible(true)]

Ok IronPython 是 Python 语言的 .net 实现 当它到来时,该技术将使用 .net 4.0 的 DLR,因此 IronPython 将具有更多的动态性(这是一个词)。 (如果你是 Python 大师,用英语的话,使用 IronPython 会更有宾至如归的感觉)

所以你可能会选择 IronPython,如果你这样做你可以跳过 COM 可见部分。由于两者(C#,Iron Python)都在.Net下

http://ironpython.net/

【讨论】:

  • 现在我看到 Ironpython 我明白它是什么了。我不想那样。我想在 python 中导入一个模块:P
  • 您的意思是导入(移植)C# 代码到 Python 或将 C# dll 导入到 Python
  • 在 Python 中从 C# Dll 导入和使用函数
  • 我猜这个解决方案在.net 4.0 之前不可用?我尝试使用 .net 2.0,但没有选项 ComVisible
【解决方案2】:

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

C# DLL MyDll.dll 的示例:

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

更多详情请见this post

【讨论】:

  • 先由pip3 install pythonnet安装
【解决方案3】:

如果您不想使用 Python .NET 或 IronPython 等解决方案,则可以实现 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()

我强烈推荐阅读此博客: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 的内容)。

【讨论】:

  • 不知道。而且我已经放弃了这种方法,我没有运行引用程序集的加载。我会尝试弄清楚 Python .NET。
【解决方案4】:

如果您不想使用 IronPython,Python for .NET 可以很好地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多