【问题标题】:How to use a C# dll in IronPython如何在 IronPython 中使用 C# dll
【发布时间】:2019-03-19 18:17:30
【问题描述】:

我使用 C# 创建了一个 dll。如何在 IronPython 中使用 dll。我尝试使用clr.AddReference("yxz.dll") 添加 dll。但它失败了。我尝试将 dll 放在 IronPython 脚本的执行目录中。在尝试引用 dll 时,它仍然无法说明“找不到名称 xyz”。

【问题讨论】:

  • 如果将行更改为 clr.AddReference("yxz") 会发生什么,这有什么不同吗?
  • 如果问题是找不到 DLL,请使用 Sysinternals 的 Process Monitor 查明问题所在。
  • fuslogvw.exe 也是找出托管 DLL 未找到原因的好方法 - 它带有平台 SDK。

标签: ironpython


【解决方案1】:
import clr    
clr.AddReferenceToFileAndPath(r"C:\Folder\Subfolder\file.dll")

是 Jeff 在 cmets 中提出的最简单的方法。这也有效:

import clr
import sys

sys.path.append(r"C:\Folder\Subfolder")  # path of dll
clr.AddReference ("Ipytest.dll") # the dll
import TestNamspace  # import namespace from Ipytest.dll

【讨论】:

  • 你也可以使用clr.AddReferenceToFileAndPath,它就是这样做的。
  • 我只能从 IronPython 控制台获得这种行为。当我运行脚本时很好。当我运行 IronPython 脚本时,sys.path 包含我当前工作目录的绝对路径,因此它可以工作。当我在控制台中输入时,sys.path 只包含一个用于当前工作目录的'.'。这可以解释行为上的差异。
  • 我试过了,但出现错误:AttributeError: 'module' object has no attribute 'AddReferenceToFileAndPath'
  • clr.AddReference() 中的 dll 应该没有 .dll 扩展名
【解决方案2】:

我认为它无法找到该文件,因为它不知道在哪里寻找它,有关 clr.AddReference...() 函数如何工作的详细说明,请参阅here

【讨论】:

    【解决方案3】:

    Creating .NET Classes Dynamically from IronPython 示例创建了一个程序集(后来作为“DynamicAsm.dll”保存到磁盘)。它包含一个名为“DynamicType”的类,以及一个名为“test”的静态方法。此方法接受四个整数并将它们相加。

    好消息是这会将“DynamicAsm.dll”保存到磁盘。然后,您可以启动 IronPython 交互式解释器会话并执行以下操作:

    >>> import clr
    >>> clr.AddReference('DynamicAsm.dll')
    >>> import DynamicType
    >>> DynamicType.test(2, 3, 4, 5)
    14
    

    请注意,该示例在import 语句中使用了类名

    【讨论】:

    • 使用import sys print sys.path 确定 clr.AddReference 在哪里寻找 dll
    • 我真的可以从外面做这个吗?或者我真的必须导入 clr 并在我的 IronPython 脚本中添加对程序集的引用吗?我这里有一些我想静态导入的程序集,以便它们在脚本中始终可用。
    【解决方案4】:

    你可以用这个:

    import clr 
    clr.AddReferenceToFile("yxz.dll")
    

    【讨论】:

      【解决方案5】:

      最好使用 clr.AddReferenceToFile(filename) ,因为它需要一个相对路径。

      import clr 
      clr.AddReferenceToFile("xxx.dll")
      

      然后你可以像往常一样通过 import 导入类:

      import xxx
      

      from xxx import *
      

      我推荐你看看这本书,它很有帮助。 https://play.google.com/store/apps/details?id=com.gavin.gbook

      【讨论】:

      • AddReferenceToFileAndPath 也适用于相对目录路径,fwiw。
      【解决方案6】:

      我只从 IronPython 控制台得到了这种行为。当我运行脚本时很好。当我运行 IronPython 脚本时,sys.path 包含我当前工作目录的绝对路径,因此它可以工作。当我在控制台中输入时, sys.path 只包含一个“。”对于当前工作目录。这或许可以解释行为上的差异。

      作为一个 hacky 解决方案,我创建了一个文件 fixpath.py

      """This hacky script fixes the sys.path when I run the ipy console."""
      
      import sys
      import os
      
      sys.path.insert(0, os.getcwd())
      
      del sys
      del os
      

      然后,我使用该文件的绝对路径设置了一个环境变量 IRONPYTHONSTARTUP。然后,每当我启动 IronPython 控制台时,都会运行此脚本,并且我的 sys.path 包含对我当前工作目录的绝对引用,随后对 clr.AddReference 的调用正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        相关资源
        最近更新 更多