繁体   English   中英

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

[英]How to refer self-contained C# class library project with IronPython inside (Visual Studio 2010)

这个问题有点冗长,但我试着向你提供我认为有必要找到答案的细节。

我有一个C#WPF解决方案(.Net 4),包含一个主项目,构建一个WPF Windows应用程序,它依赖于驻留在同一个Visual Studio 2010解决方案中的一些类库项目。

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

问题是我不知道如何以一种始终有效的方式引用包含python代码的封装库项目。

通常我会在这个问题中讨论添加对类库项目的引用: Visual Studio 2010:如何引用具有第三方依赖性的C#.Net类库项目 但它没有帮助。

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

解决方案如下所示:

  • MainApp(Windows WPF应用程序项目)
    • ...
  • ClassLib1(C#类库项目)
    • ...
  • ClassLibWithPython(使用IronPython的C#类库项目)
    • C#类
    • lib(目录)
      • IronPython.dll
      • IronPython.Modules.dll
      • Microsoft.Dynamic.dll
      • Microsoft.Scripting.dll
      • Microsoft.Scripting.Metadata.dll
      • pylib(带有一些使用过的python模块的目录)
        • os.py
        • ...... .py
      • ctypes(带有一些使用过的python模块的目录)
      • 我的pyton类(目录)

ClassLibWithPython引用驻留在其本地lib文件夹中的IronPython DLL( Copy Local属性为True )。 MainApp项目引用了ClassLib1项目和ClassLibWithPython项目(同样具有Copy Local属性True)。

在编译解决方案时,所有DLL和MainApp.exe文件都显示在MainApp / bin / Debug中,它在某些机器(XP和Win 7)上运行正常,但在其他一些机器(XP)上运行失败。 在做了一些调试之后,我发现内置的IronPython模块没有正确加载 导入os模块时(pylib / os.py就像这个http://pydoc.org/get.cgi/usr/local/lib/python2.5/os.py )我得到一个python异常( ImportError, no os specific module found由于缺少模块名称'nt' ImportError, no os specific module found )。

在比较它发生的工作和不工作的地方时,我发现sys.builtin_module_names只返回一些项目,与我在其他机器上运行相同代码时得到的项目相比。

有问题的机器有:

sys.builtin_module_names = ['clr', 'future_builtins', 'imp', 'sys', '__builtin__', 'exceptions']

所有工作的计算机都有:

sys.builtin_module_names: ['clr', 'future_builtins', 'imp', 'sys', '__builtin__', 'exceptions', '_codecs', 'cmath', '_sha512', 'msvcrt', 'array', '_winreg', '_weakref', '_warnings', '_subprocess', '_ssl', '_sre', '_random', '_functools', 'xxsubtype', 'time', 'thread', '_struct', '_heapq', '_ctypes_test', '_ctypes', 'socket', '_sha256', '_sha', 'select', 're', 'operator', 'nt', '_md5', 'math', 'marshal', '_locale', '_io', 'itertools', 'gc', 'errno', 'datetime', 'cStringIO', 'cPickle', 'copy_reg', '_collections', 'binascii', 'zlib', 'signal', 'mmap']

解决方案没有帮助

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

有助于解决的解决方案

我找到了两个提供工作解决方案的变通方法,但是它们都破坏了封装原则并暴露了ClassLibWithPython的实现细节:

  1. 将ClassLibWithPython中的所有代码放在MainApp项目中。
  2. 将ClassLibWithPython保存在单独的项目中,但也将对IronPython.dll和IronPython.Modules.dll的引用添加到MainApp项目中。

是什么让解决方案#2工作?

有什么建议如何以干净的方式使这项工作?

感谢今天阅读;-)

我不完全了解部署的布局 - 但请尝试以下方法。

1)对于您希望从IronPython.Modules.dll加载的模块,确保此程序集在您的部署位置可用,并且/或者如果此程序集位于其他位置,则挂钩AssemblyResolve (请参阅此处)事件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM