3

這個問題有點冗長,但我試圖爲您提供我認爲有必要找到答案的細節。如何使用IronPython內部引用獨立的C#類庫項目(Visual Studio 2010)

我有一個C#WPF解決方案(.Net 4)包含一個主項目,構建一個WPF窗口應用程序,該應用程序依賴於駐留在同一Visual Studio 2010解決方案中的一些類庫項目。

其中一個類庫項目封裝了一些先前開發的python代碼,我想通過IronPython和Microsoft動態語言運行庫使用該代碼。 我希望類庫項目是自包含的,而不依賴於IronPython的完整安裝。

問題是,我不知道如何引用封裝庫項目持有的Python代碼,總是工作。

正常情況下,我只是添加一個對此問題討論的類庫項目的引用:Visual Studio 2010: How refer to a C# .Net class library project with third part dependencies。但它沒有幫助。

的解決方案是如何設置在Visual Studio中:

該解決方案是這樣的:

  • MainApp(窗口WPF應用程序項目)
    • ...
  • ClassLib1(C#類庫項目)
    • ...
  • ClassLibWithPython(與IronPython的C#類庫項目)
    • C#類
    • LIB(目錄)
      • IronPython.dll
      • IronPython的。 Modules.dll
      • Microsoft.Dy namic.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)時,由於缺少模塊名稱'nt',我得到一個python異常(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']

工作周圍沒有幫助

我試着添加using報表ClassLibWithPython的C#代碼確保即使是隱式引用的程序集也是鏈接的,但沒有區別。

變通辦法,幫助

我找到了兩種解決方法提供了一個可行的解決方案,但是他們都打破了封裝原則,並公開ClassLibWithPython的實施細則:將所有

  1. 代替來自MainApp項目中ClassLibWithPython的代碼。
  2. 將ClassLibWithPython保存在單獨的項目中,但同時也將對IronPython.dll和IronPython.Modules.dll的引用添加到MainApp項目中。

這是什麼使解決方案#2工作?

任何建議如何使這項工作在一個乾淨的方式?

感謝的閱讀這遠遠;-)

回答

0

我不完全理解的部署佈局 - 但請嘗試以下操作。

1)對於您希望從IronPython.Modules.dll加載的模塊,請確保此程序集在您的部署位置可用,並且/或者如果此程序集位於不同位置,則掛鉤事件。

2)對於你期望從py模塊加載的模塊。確保探測位置通過sys或DLR託管API添加到sys.path中。例如sys.path.append(...)

+0

我還沒有真正理解我的部署計算機上發生了什麼,但有時我收到異常,表明IronPython.Modules.dll未加載,儘管它與exe文件和其他dll位於相同的路徑:s 。 – mstahlberg

相關問題