3

Cette question est assez longue mais j'essaie de vous fournir les détails que je pense nécessaires pour trouver la réponse.Comment référencer un projet de bibliothèque de classe C# avec IronPython (Visual Studio 2010)

J'ai une solution C# WPF (.Net 4) consistant en un projet principal, la construction d'une application Windows WPF, qui dépend de quelques projets de bibliothèque de classe résidant dans la même solution Visual Studio 2010. L'un des projets de bibliothèque de classe encapsule du code python que j'ai voulu utiliser via IronPython et Microsoft Dynamic Language Runtime. Je voudrais que le projet de bibliothèque de classes soit autonome et ne dépende pas d'une installation complète d'IronPython.

Le problème est que je ne sais pas comment faire référence au projet de bibliothèque d'encapsulation qui contient le code python d'une manière qui fonctionne toujours.

Normalement, je voudrais juste ajouter une référence au projet de bibliothèque de classes comme discuté dans cette question: Visual Studio 2010: How refer to a C# .Net class library project with third part dependencies. Cependant, cela n'a pas aidé.

Comment la solution est mise en place dans Visual Studio:

La solution ressemble à ceci:

  • MainApp (fenêtres projet d'application WPF)
    • ...
  • ClassLib1 (projet de bibliothèque de classes C#)
    • ...
  • ClassLibWithPython (C projet de bibliothèque # classe avec IronPython)
    • classes C#
    • lib (répertoire)
      • IronPython.dll
      • IronPython. Modules.dll
      • Microsoft.Dy namic.dll
      • Microsoft.Scripting.dll
      • Microsoft.Scripting.Metadata.dll
      • pylib (répertoire avec certains modules Python utilisés)
        • os.py
        • ....py
      • ctypes (répertoire avec des modules Python utilisés)
      • mes classes pyton (répertoire)

ClassLibWithPython a des références aux DLL IronPython résidant dans son dossier lib locale (Copy Local attribut True). Le projet MainApp a des références au projet ClassLib1 et au projet ClassLibWithPython (également avec l'attribut Copy Local True). Lors de la compilation de la solution, toutes les DLL et le fichier MainApp.exe apparaissent dans MainApp/bin/Debug et fonctionnent correctement sur certaines machines (XP et Win 7) mais échouent sur d'autres machines (XP). Après avoir fait un peu de débogage, j'ai trouvé que les modules intégrés IronPython ne sont pas chargés correctement . Lors de l'importation du module os (pylib/os.py comme celui-ci http://pydoc.org/get.cgi/usr/local/lib/python2.5/os.py), j'obtiens une exception python (ImportError, no os specific module found) en raison de l'absence du nom du module 'nt'. En comparant ce qui se passe là où cela fonctionne et où il ne fonctionne pas, j'ai trouvé que sys.builtin_module_names retourne juste quelques éléments par rapport à ce que je reçois lors de l'exécution du même code sur d'autres machines.

Machine a Problématiques:

sys.builtin_module_names = ['clr', 'future_builtins', 'imp', 'sys', '__builtin__', 'exceptions']

Ordinateurs où tout fonctionne: ont

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']

travail autour qui n'a pas aidé

J'ai essayé ajouter using déclarations à le code C# de ClassLibWithPython pour s'assurer que même les assemblys implicitement référencés sont liés, mais sans différence.

contournements qui ont aidé

J'ai trouvé deux solutions de contournement fournissant une solution de travail, mais les deux rompt le principe d'encapsulation et expose les détails de mise en œuvre de ClassLibWithPython:

  1. Mettez tous code de ClassLibWithPython dans le projet MainApp à la place.
  2. Conservez ClassLibWithPython dans un projet distinct, mais ajoutez également des références à IronPython.dll et IronPython.Modules.dll au projet MainApp.

Qu'est-ce qui fait que le travail n ° 2 fonctionne?

Des suggestions sur comment faire fonctionner ce travail de manière propre?

Merci pour la lecture de loin ;-)

Répondre

0

Je ne comprends pas bien la mise en page déployée - mais essayez ce qui suit.

1) Pour les modules que vous prévoyez de charger à partir de IronPython.Modules.dll, vérifiez que cet assembly est disponible dans votre emplacement de déploiement et/ou connectez l'événement AssemblyResolve(see here) si cet assembly est dans un emplacement différent.

2) Pour les modules que vous prévoyez charger à partir d'un module py. Assurez-vous que l'emplacement de sondage est ajouté à sys.path via sys ou à partir de l'API d'hébergement DLR. par exemple sys.path.append(...)

+0

Je n'ai pas vraiment compris ce qui s'est passé sur mes ordinateurs de déploiement mais parfois j'ai des exceptions indiquant que IronPython.Modules.dll n'était pas chargé bien qu'il soit sur le même chemin que le fichier exe et l'autre dll: s . – mstahlberg

Questions connexes