【问题标题】:Where will Python search for .NET assemblies?Python 将在哪里搜索 .NET 程序集?
【发布时间】:2015-01-19 06:38:43
【问题描述】:

我们有一个 C# 应用程序,我们需要提供 Python 脚本接口。现在它的实现方式是:

  • 托管脚本库(编译为 DLL)完成所有核心工作
  • C++/CLI 包装器(包装托管库并编译为静态库)执行所有本机托管数据转换
  • boost 扩展项目 (BOOST_PYTHON_MODULE)(编译为动态库,扩展名手动更改为 pyd)与 C++/CLI 包装层通信。

我遇到的问题是,每次任何 python 应用程序尝试使用该接口时,它都会抱怨找不到核心托管程序集。我必须将它放在 Python 安装目录中,或者将其部署到 GAC 中。

我启用了 Windows Fusion 日志记录,发现它只会探测 Python 目录中的程序集,我想知道是否有一种方法可以指示 Python 在我们的应用程序安装目录中搜索 .NET 程序集,或者更确切地说,任何自定义目录?

我尝试了this post 中的所有方法,但这对我不起作用。任何帮助将不胜感激!

PS:

  • 我们知道还有其他 Python 选项,例如 IronPython 或 Python .NET,但我们需要向后兼容,因此还需要 C++ 接口。
  • 如果你好奇我得到了什么错误,这里是:

    未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“ScriptingInterface,版本=1.3.9.0,Culture=neutral,PublicKeyToken=160df4f7a3973cc2”或其依赖项之一。该系统找不到指定的文件。 在 NativeCommunicator.{ctor}(NativeCommunicator* )

【问题讨论】:

  • 请将这些 cmets 添加到问题本身
  • 您是否将路径附加到 python 中的 sys.path 中?
  • @denfromufa 是的,我将路径添加到 sys.path 中,我可以从控制台显示中看出这一点。但是还是不行

标签: c# python .net c++-cli


【解决方案1】:

基本上是为了解决您必须解决的问题:

  1. 在您的 Python 脚本中,作为第一行,您必须调用“init”。
  2. “Init”是您在 .pyd 模块中添加的函数
  3. 在 Init 方法中,您只需注册一个用于解析程序集的挂钩。
  4. 在钩子中,您有机会从您想要的任何目录加载程序集。

以下链接可能对您有所帮助: Loading Mixed-Mode C++/CLI .dll (and dependencies) dynamically from unmanaged c++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2019-01-15
    • 2021-04-03
    • 2014-09-15
    相关资源
    最近更新 更多