Problema usando IronPython de código contra as assemblagens.NET especificamente com app aspecto

votos
2

Eu comecei a olhar para IronPython para desenvolver scripts contra meus conjuntos .NET para determinadas tarefas e processos ad-hoc. Eu gosto da facilidade de desenvolvimento com IronPython e da pegada pequena em comparação com a manipulação isso com um projeto .NET aplicativo de console. No entanto, eu imediatamente correu para um bloqueio com configurações de arquivo app. Os conjuntos Estou planejando usar exigem configurações de arquivo app.config, como seqüência de conexão de banco de dados, configurações de aplicativos, etc. Eu vi essa pergunta no SO Como usar IronPython com App.Config. No entanto, pelo que percebo e assumir, nenhuma das soluções sugeridas trabalhou ou eram aceitáveis. Modificando arquivo ipy.exe.config tem um potencial. No entanto, eu gostaria de manter isso o mais simples possível e minimizar as dependências. Para que qualquer pessoa pode pegar o script IronPython e executá-lo sem ter que modificar o arquivo ipy.exe.config.

Então eu decidi tentar o seguinte: eu criar um novo domínio de aplicativo no script e ter AppDomainSetup.ConfigurationFile ponto para o arquivo app.config. Então eu poderia chamar AppDomain.DoCallBack e passar um delegado que tem a minha lógica. Portanto, a seguir é o script que tem a minha tentativa. Note que estou apenas aprendendo IronPython / Python por isso, manter isso em mente.

import clr
import sys
sys.path.append(rC:\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 = rC:\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()

No código acima, c: \ MyApp pasta contém tudo; exe, DLL, e o arquivo app.config. Esperemos que o segundo appdomain usará MyApp.exe.config. método CallbackAction se destina a conter o código que irá usar o api dos conjuntos .NET para fazer algum trabalho. CallbackAction será invocado via appDomain.DoCallBack. Bem, esta é a parte que eu estou tendo um problema. Quando appDoming.DoCallBack é executado, eu recebo um System.Runtime.Serialization.SerializationException:

Não é possível serializar delegados mais de ponteiros de função não gerenciados, métodos dinâmicos ou métodos externos de montagem do criador delegado.

Eu não posso fazer uma completa sensação de sair disto. Presumo que algo está sendo tentado ser serializado através AppDomains e que a operação está a falhar. Eu posso criar um CrossAppDomainDelegate e executá-lo muito bem.

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

Então, alguém tem alguma idéia ou recomendações? Basicamente, eu preciso ter as montagens que eu quero código contra em IronPython para ter acesso ao arquivo app.

Obrigado pelo seu tempo e recomendações de antecedência.

btw eu tenho IronPyhton 2.0.1 instalado e estou usando VS2008 Pro.

Publicado 27/08/2009 em 02:43
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Isto provavelmente não é a resposta que você está procurando, mas .... Uma vez que este é para seus próprios fins de teste, eu recomendo a instalação do IronPython 2.7.1 e ver se o problema continua. Houve muitas melhorias para IronPython desde 2.0.1.

Respondeu 10/01/2012 em 00:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more