none
Generar clase y compilar en runtime RRS feed

  • Pregunta

  • Hola a todos!!

    Esta ves, tengo duda sobre creación de clases y compilación en runtime.

    Los últimos días, con ayuda de los foros he logrado  crear parte de código que tiene como funcionalidad el consumo de webservices de forma dinámica. Hasta ahora, al proporcionar la URL del webservice, puedo obtener el nombre de sus métodos y de cada parámetro mediante el WSDL. 

    También he podido, crear una clase mediante wsdl.exe que será util para consumir el webservice. Todo esto desde código. Ahora estoy trabajando sobre la compilación de la clase generada para posteriormete poder utilizarla y hacer el consumo del webservice. Ésta clase no contiene un método 'Main' por lo que al hacer la compilación me arroja el error CS5001 (Line number 0, Error Number: CS5001, 'Program 'c:\Program Files (x86)\IIS Express\proxyTest_cs.exe' does not contain a static 'Main' method suitable for an entry point;), y es precisamente con el que requiero de sugerencias para solucionar.

    Gracias!!



    AUR

    miércoles, 1 de octubre de 2014 18:48

Respuestas

  • ¿Cómo lo estás compilando, llamando con Process.Start al CSC? En ese caso, ponle el parámetro /t:library para que compile una DLL en lugar de un EXE. La DLL no requiere un Main.

    Pero para tus objetivos, casi sería mejor compilarlo en memoria usando System.CodeDom.Compiler (ponle GenerateInMemory=true en el CompilerParameters al llamar al método CompileAssemblyFromFile del ICodeCompiler). Si lo haces así no tendría que estar pidiendo un Main. Pon aquí en el foro la parte significativa del código que estás escribiendo, para que podamos tratar de localizar dónde puede estar el problema.

    • Marcado como respuesta Ale Uribe jueves, 16 de octubre de 2014 17:06
    jueves, 2 de octubre de 2014 5:21

Todas las respuestas

  • ¿Cómo lo estás compilando, llamando con Process.Start al CSC? En ese caso, ponle el parámetro /t:library para que compile una DLL en lugar de un EXE. La DLL no requiere un Main.

    Pero para tus objetivos, casi sería mejor compilarlo en memoria usando System.CodeDom.Compiler (ponle GenerateInMemory=true en el CompilerParameters al llamar al método CompileAssemblyFromFile del ICodeCompiler). Si lo haces así no tendría que estar pidiendo un Main. Pon aquí en el foro la parte significativa del código que estás escribiendo, para que podamos tratar de localizar dónde puede estar el problema.

    • Marcado como respuesta Ale Uribe jueves, 16 de octubre de 2014 17:06
    jueves, 2 de octubre de 2014 5:21
  • Éste es el código que uso para generar el .cs a partir del wsdl:

    string fullPath = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\wsdl.exe"; //Este no se si deba hacer la referencia así.
    
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = Path.GetFileName(fPath);
    psi.WorkingDirectory = Path.GetDirectoryName(fPath);
    psi.Arguments = "/out:proxyTest.cs http://www.servicios.net/webService.svc?WSDL";
    			
    Process.Start(psi);

    Y éste el el código con el que intento compilar:

    //sourceName es el nombre del archivo .cs
    
    FileInfo sourceFile = new FileInfo(sourceName);
    CodeDomProvider provider = null;
    
    String[] refAssemblies = { "System.dll", "System.Web.dll", "System.Web.Services.dll", "System.Xml.dll" };
    
    CompilerParameters cp = new CompilerParameters(refAssemblies);
    cp.GenerateExecutable = true;
    cp.OutputAssembly = "proxyTest.exe"
    cp.GenerateInMemory = true;
    cp.TreatWarningsAsErrors = false;
    
    CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceName);

    Voy a intentar con la sugerencia de crear un dll.

    Gracias!


    AUR

    viernes, 3 de octubre de 2014 23:19