如何使用内部的IronPython引用自包含的C#类库项目(Visual Studio 2010)

如何使用内部的IronPython引用自包含的C#类库项目(Visual Studio 2010),c#,visual-studio-2010,ironpython,dynamic-language-runtime,C#,Visual Studio 2010,Ironpython,Dynamic Language Runtime,这个问题有点冗长,但我会尽力向你们提供我认为找到答案所必需的细节 我有一个C#WPF解决方案(.Net 4),它由一个主项目组成,即构建一个WPF windows应用程序,它依赖于驻留在同一个Visual Studio 2010解决方案中的几个类库项目 其中一个类库项目封装了一些以前开发的python代码,我想通过IronPython和Microsoft Dynamic Language Runtime使用这些代码。 我希望类库项目是自包含的,而不是依赖于IronPython的完整安装 问题在于

这个问题有点冗长,但我会尽力向你们提供我认为找到答案所必需的细节

我有一个C#WPF解决方案(.Net 4),它由一个主项目组成,即构建一个WPF windows应用程序,它依赖于驻留在同一个Visual Studio 2010解决方案中的几个类库项目

其中一个类库项目封装了一些以前开发的python代码,我想通过IronPython和Microsoft Dynamic Language Runtime使用这些代码。 我希望类库项目是自包含的,而不是依赖于IronPython的完整安装

问题在于,我不知道如何引用封装库项目,该项目以一种始终有效的方式保存python代码

通常,我只会添加对类库项目的引用,如本问题所述:。然而,这没有帮助

如何在Visual Studio中设置解决方案:

解决方案如下所示:

  • MainApp(windows WPF应用程序项目)
  • ClassLib1(C#类库项目)
  • ClassLibWithPython(使用IronPython的C#类库项目)
    • C类
    • 库(目录)
      • IronPython.dll
      • IronPython.Modules.dll
      • Microsoft.Dynamic.dll
      • Microsoft.Scripting.dll
      • Microsoft.Scripting.Metadata.dll
      • pylib(包含一些使用过的python模块的目录)
        • 奥斯比
        • 。派克
      • ctypes(包含一些使用过的python模块的目录)
      • 我的pyton类(目录)
ClassLibWithPython引用了驻留在其本地lib文件夹中的IronPython DLL(
Copy local
attribute
True
)。MainApp项目引用了ClassLib1项目和ClassLibWithPython项目(也带有Copy Local属性True)

编译解决方案时,所有DLL和MainApp.exe文件显示在MainApp/bin/Debug中,在某些计算机(XP和Win 7)上工作正常,但在某些其他计算机(XP)上失败。在进行一些调试之后,我发现,内置的IronPython模块没有正确加载。导入操作系统模块(像这样的pylib/os.py)时,由于缺少模块名
'nt'
,我得到一个python异常(
ImportError,找不到操作系统特定的模块)

当比较它工作的地方和不工作的地方时,我发现
sys.builtin\u module\u names
与我在其他一些机器上运行相同代码时得到的结果相比,只返回了一些项目

有问题的机器有:

sys.builtin\u模块名称=['clr'、'future\u builtins'、'imp'、'sys'、'uuuuuuuuuu'、'exceptions']

一切正常的计算机都有:

sys.builtin\u模块名称:['clr'、'future'u builtins'、'imp'、'sys'、'u builtin'u'、'exceptions'、'u codecs'、'cmath'、'u sha512'、'msvcrt'、'array'、'u winreg'、'u weakref'、'u warnings'、'u subprocess'、'u ssl'、'u sre'、'u random'、'u FunctionTools'、'xxsubtype'、'time'、'thread'、's'、'u struct'、'u struct'、'heapq'、's'、'CTU测试'、'CTU'、'CTU测试'、'CTU套接字'、'SHAU'、's'、'SHAU'、'SHAU'、'选择'、's'、'nt',md5',math',marshal',locale',io',itertools',gc',errno',datetime',cStringIO',cPickle',copy_reg',collections',binascii',zlib',signal',mmap'.

解决那些没有帮助的问题

我尝试使用
语句向ClassLibWithPython的C#代码中添加
,以确保即使是隐式引用的程序集也是链接的,但没有区别

有帮助的解决办法

我发现有两种变通方法提供了一个有效的解决方案,但它们都打破了封装原则,并公开了ClassLibWithPython的实现细节:

  • 将ClassLibWithPython中的所有代码放在MainApp项目中
  • 将ClassLibWithPython保留在单独的项目中,但也将对IronPython.dll和IronPython.Modules.dll的引用添加到MainApp项目中
  • 是什么使“变通”2起作用

    有什么建议可以让这项工作干净利落吗


    感谢您阅读本文;-)

    我不完全理解已部署的布局,但请尝试以下内容

    1) 对于希望从IronPython.modules.dll加载的模块,请确保此程序集在部署位置可用,和/或如果此程序集位于其他位置,则钩住
    AssemblyResolve
    事件


    2) 对于希望从py模块加载的模块。确保探测位置通过sys或DLR宿主API添加到sys.path。例如
    sys.path.append(…)

    我还没有真正了解部署计算机上发生了什么,但有时会出现异常,表明IronPython.Modules.dll未加载,尽管它与exe文件和其他dll位于同一路径上。