2013-07-04 1 views
0

저는 웹 서비스로부터 어셈블리를 동적으로 생성하고 있습니다. 초기 응답 스트림 (WSDL)을 읽은 후 ServiceDescriptionImporter와 ServiceDescription을 사용하여 스트림을 가져오고 컴파일을 위해 CodeDomProvider를 사용합니다.Webservice에서 동적으로 생성 된 어셈블리 - 런타임에 .CS 코드를 얻는 방법?

수입

ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter(); 
ServiceDescription serviceDescription = ServiceDescription.Read(xmlreader); 
descriptionImporter.AddServiceDescription(serviceDescription, null, null); 
descriptionImporter.Style = ServiceDescriptionImportStyle.Client; 
descriptionImporter.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties; 

컴파일

CodeCompileUnit codeUnit = new CodeCompileUnit(); 
CodeNamespace codeNamespace = new CodeNamespace(); 
codeUnit.Namespaces.Add(codeNamespace); 
ServiceDescriptionImportWarnings importWarnings = descriptionImporter.Import(codeNamespace, codeUnit); 
if (importWarnings == 0) 
{   
    results = compiler.CompileAssemblyFromDom(parameters, codeUnit); 
} 

지금 어셈블리 내 임시 디렉토리에 생성 얻을하지만 난합니다 (wsdl.exe 도구가 만든 것 같은) 코드로 .CS 파일이 필요합니다 . 어셈블리를 만들지 않고 CS 코드 만 만들 수있는 방법이 있습니까?

변환되기 전에 XML 스트림에 액세스 할 수 있지만 이는 WSDL 만입니다. 내 CodeDomProvider의 코드를 만들려고하지만, 그것은 단지 당신은 "GenerateCodeFromCompileUni"방법으로 compileUnit (안 된 CodeDom)의 코드를 추출 할 수 있습니다

private void CreateCSCode(string FilePathName, CodeDomProvider provider) 
    { 

     CodeGeneratorOptions options = new CodeGeneratorOptions(); 
     options.BracingStyle = "C"; 
     using (StreamWriter sourceWriter = new StreamWriter(FilePathName)) 
     { 
      provider.GenerateCodeFromCompileUnit(new System.CodeDom.CodeCompileUnit(), sourceWriter, options); 
     } 
    } 

답변

0

빈 파일 생성 :

TextWriter tw = new IndentedTextWriter(new StreamWriter(PathAndName + ".cs", false), " "); 
compiler.GenerateCodeFromCompileUnit(codeUnit, tw, new CodeGeneratorOptions()); 

을 그런 다음 생성 된 파일에서 컴파일 할 수 있어야합니다.