【问题标题】:How to run c# code from python *In the same process*?如何从 python *在同一进程中运行 c# 代码*?
【发布时间】:2020-01-01 19:13:21
【问题描述】:

我想从 python 运行一些 c# 函数。

我知道这可以做到

os.system("myapp.exe")

和其他类似的调用,但这会创建一个新进程。

我想让 c# 代码从运行 python 代码的同一进程中运行。

如何做到这一点?


我想到的一种方法是将c#编译为dll,并从那里调用它的函数,但我仍然无法使这种方式工作。

有没有更好的办法?

【问题讨论】:

  • 那是不可能的。一个应用程序可以有一个进程。在您的情况下,该过程是 Python 解释器。您不能在同一进程中运行另一个应用程序。
  • @RayWu 请查看编辑。为什么不可能?
  • 一个进程只能有一个应用程序。另外,Python只能直接调用非托管DLL,即用C或C++编写的DLL。
  • 您的用例是什么?我怀疑这可能是 XY 问题。
  • @RayWu 我的主要项目是用python编写的。我们有一些承包商提供了我们不想用 python 重写的 c# 代码。我们需要将 c# 代码(可能有一些 API 更改)集成到主项目中。我建议从 python 调用 c# .exe,并通过文件或套接字与其通信,但有人担心必须管理子进程,以及额外进程的维护开销和额外错误,所以我试图寻找替代品

标签: c# python bridge


【解决方案1】:

是否要考虑使用不同的口译员? 您可以使用IronPython,它允许您像导入普通 python 包一样导入 dll,并将 C# 类嵌入到 python 脚本中。

clr.AddReference('mylib.dll') # contains namespace MyLib
import MyLib

【讨论】:

  • 此答案仅在 OP 不使用任何包含 C 扩展的外部 Python 模块时才有效(对于较大的项目来说不太可能)。也许这应该被编辑成答案。
【解决方案2】:

您可以为此使用 NuGet 包 UnmanagedExports1
Pythonctypes兼容代码需要添加属性
[DllExport("<function name>", CallingConvention = CallingConvention.Cdecl)]

如果不修改 C# 程序集,就无法做到这一点。


来自 Python 代码:

import ctypes
a = ctypes.cdll.LoadLibrary(<path to dll>)

您现在可以使用对象a 调用C# 程序集中以DllExport 属性为前缀的方法。


信息取自the official website of UnmanagedExports


[1] 你总是可以使用 COM,但是,这更难做到,并且涉及 C# 程序集的更多重组。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2020-06-23
    • 2016-09-19
    • 2018-12-08
    • 2022-11-18
    相关资源
    最近更新 更多