簡體   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