![](/img/trans.png)
[英]Visual Studio 2010: How refer to a C# .Net class library project with third part dependencies
[英]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中设置解决方案:
解决方案如下所示:
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的实现细节:
是什么让解决方案#2工作?
有什么建议如何以干净的方式使这项工作?
感谢今天阅读;-)
我不完全了解部署的布局 - 但请尝试以下方法。
1)对于您希望从IronPython.Modules.dll加载的模块,确保此程序集在您的部署位置可用,并且/或者如果此程序集位于其他位置,则挂钩AssemblyResolve
(请参阅此处)事件。
2)对于您希望从py模块加载的模块。 确保通过sys或DLR托管API将探测位置添加到sys.path。 例如sys.path.append(...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.