2009-08-27 5 views
2

J'ai commencé à chercher dans IronPython pour développer des scripts sur mes assemblys .NET pour certaines tâches et processus ad-hoc. J'aime la facilité de développement avec IronPython et le faible encombrement par rapport à la gestion avec un projet d'application console .NET. Cependant, j'ai immédiatement rencontré un roadblock avec les paramètres du fichier app.config. Les assemblages que je prévois d'utiliser nécessitent des paramètres du fichier app.config, tels que la chaîne de connexion à la base de données, les paramètres de l'application, etc. J'ai vu cette question sous SO How to use IronPython with App.Config. Cependant, d'après ce que je comprends et suppose, aucune des solutions proposées n'a fonctionné ou était acceptable. La modification du fichier ipy.exe.config a un potentiel. Cependant, je voudrais garder ceci aussi simple que possible et minimiser les dépendances. Alors que n'importe qui peut saisir le script IronPython et l'exécuter sans avoir à modifier le fichier ipy.exe.config.Problème d'utilisation de IronPython pour le codage des assemblys .NET spécifiquement avec l'aspect app.config

J'ai donc décidé d'essayer ce qui suit: Je crée un nouveau domaine d'application dans le script et j'ai AppDomainSetup.ConfigurationFile sur le fichier app.config. Ensuite, je pourrais appeler AppDomain.DoCallBack et passer un délégué qui a ma logique. Donc, ci-dessous est le script qui a ma tentative. Notez que je suis en train d'apprendre IronPython/Python alors gardez ça à l'esprit.

import clr 
import sys 
sys.path.append(r"C:\MyApp"); 
clr.AddReference("System") 
clr.AddReference("Foo.dll") 

from System import * 
from System.IO import Path 
from Foo import * 

def CallbackAction(): 
    print "Callback action"  

baseDirectory = r"C:\MyApp" 
domainInfo = AppDomainSetup() 
domainInfo.ApplicationBase = baseDirectory 
domainInfo.ConfigurationFile = Path.Combine(baseDirectory,"MyApp.exe.config") 
appDomain = AppDomain.CreateDomain("Test AppDomain",AppDomain.CurrentDomain.Evidence,domainInfo) 

appDomain.DoCallBack(CallbackAction) #THIS LINE CAUSES SERIALIZATION EXCEPTION 

Console.WriteLine("Hit any key to exit...") 
Console.ReadKey() 

Dans le code ci-dessus, le dossier "c: \ MyApp" contient tout; exe, dlls et le fichier app.config. Espérons que le second appDomain utilisera MyApp.exe.config. La méthode CallbackAction est destinée à contenir le code qui utilisera l'API des assemblys .NET pour effectuer un certain travail. CallbackAction sera appelé via appDomain.DoCallBack. Eh bien, c'est la partie que j'ai un problème. Lorsque appDoming.DoCallBack est exécuté, je reçois un System.Runtime.Serialization.SerializationException:

Impossible de sérialiser délégués plus pointeurs de fonction non gérés, dynamiques méthodes ou des méthodes en dehors de l'assemblée du créateur de délégué .

Je n'arrive pas à comprendre complètement cela. Je suppose que quelque chose est en cours de tentative de sérialisation sur appDomains et que cette opération échoue. Je peux créer un CrossAppDomainDelegate et l'exécuter très bien.

test = CrossAppDomainDelegate(lambda: CallbackAction()) 
test() 

Est-ce que quelqu'un a des idées ou des recommandations? Fondamentalement, j'ai besoin d'avoir les assemblys que je veux coder dans IronPython pour avoir accès au fichier app.config.

Merci de votre temps et recommandations à l'avance.

btw J'ai installé IronPyhton 2.0.1 et j'utilise VS2008 Pro.

Répondre

0

Ce n'est probablement pas la réponse que vous cherchez, mais .... Puisque c'est pour vos propres tests, je vous recommande d'installer Ironpython 2.7.1 et de voir si le problème persiste. Il y a eu de nombreuses améliorations à Ironpython depuis la 2.0.1.

Questions connexes