【问题标题】:Use specific instance of DLL with ctypes将特定的 DLL 实例与 ctypes 一起使用
【发布时间】:2016-08-05 17:51:38
【问题描述】:

是否可以使用 ctypes 来使用特定的 DLL 实例?基本上我的申请如下: 我们有一个由 C# DLL 和 C# WPF 前端访问的 C DLL。我使用 ctypes 编写了一个单独的包装器来直接访问 C DLL 并一起绕过 C#。

我们目前在我们的程序中使用一个内部 IronPython 窗口来允许用户在 Python 中编写脚本,并连接到中间 C# 层并通过它连接到 C dll。由于 IronPython 的限制,我想看看是否有可能允许用户编写 Python 代码,使用我的库直接访问 C dll,但它的实例与 C# 使用的相同,所以他们可以同步。这甚至可以远程实现吗?

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    您有一个加载 C# DLL 的程序,该程序加载 C DLL。相同的程序也运行 IronPython,而您希望 Python 加载相同的 C DLL。

    我假设您在 Python 中使用 ctypes.windll.LoadLibrary(path)。所以你只需要找到正确的路径。对于 C#,这里有一些想法:How to get the location of the DLL currently executing?

    具体可以试试这个:https://msdn.microsoft.com/en-us/library/system.reflection.assembly.codebase(v=vs.110).aspx

    您可以直接从 IronPython 执行此操作,但如果不能,您可以在您的 C# DLL 中执行此操作并将其公开。

    【讨论】:

    • 所以问题是我想加载同一个 DLL 实例。例如,如果你有一个 C DLL,它有一个名为 foo 的内部变量,它存储一个 int,如果我从 C# 设置 foo,然后从 python 获取 foo,我希望它是相同的 foo。
    • 你试过了吗? Windows 是否真的为您提供了同一 DLL 的 de novo 实例?我会认为在一个进程中加载​​相同的 DLL 两次只会导致它的一个副本。
    • 是的,例如,如果我使用 ctypes 两次加载我的库,运行一个函数来更改其中一个中的值,然后在两个值中获取该值将不同,因为它只是被更改了在一种情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2010-12-09
    • 2020-03-25
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多