![](/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.