这个问题有点冗长,但我试着向您提供我认为有必要找到答案的详细信息。
我有一个C#WPF解决方案(.Net 4),包含一个主项目,构建一个WPF Windows应用程序,它取决于驻留在同一个Visual Studio 2010解决方案中的一些类库项目。
其中一个类库项目封装了一些我想通过IronPython和Microsoft Dynamic Language Runtime使用的以前开发的python 代码。 我希望类库项目是自包含的,而不是依赖于IronPython的完整安装。
问题是我不知道如何以一种始终有效的方式引用包含python代码的封装库项目。
通常我只会添加对类库项目的引用,如本问题所述:Visual Studio 2010: How refer to a C# .Net class library project with third part dependencies。但它没有帮助。
如何在Visual Studio中设置解决方案:
解决方案如下所示:
ClassLibWithPython引用了驻留在其本地lib文件夹(Copy Local
属性True
)中的IronPython DLL。 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'
。
在比较它发生的工作和不工作的地方时,我发现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']
无效的解决方法
我尝试将using
语句添加到ClassLibWithPython的C#代码中,以确保即使是隐式引用的程序集也是链接的,但没有区别。
有帮助的解决方法
我找到了两个提供工作解决方案的解决方法,但是它们都破坏了封装原则并暴露了ClassLibWithPython的实现细节:
什么使解决方案#2有效?
有关如何以干净的方式开展此工作的任何建议吗?
感谢您阅读此内容; - )
答案 0 :(得分:1)
我不完全了解部署的布局 - 但请尝试以下方法。
1)对于您希望从IronPython.Modules.dll加载的模块,确保此程序集在您的部署位置可用,和/或挂钩AssemblyResolve
(see here)事件(如果此程序集在不同的位置。
2)对于您希望从py模块加载的模块。确保通过sys或DLR托管API将探测位置添加到sys.path。例如sys.path.append(...)