2013-07-04 1 views
0

Я динамически создаю сборки из webservice. После чтения исходного потока ответов (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); 
} 

я теперь получить сборка создана в моем временном каталоге, но мне нужен .cs файл с кодом (например, инструмент wsdl.exe бы создать) , Есть ли способ создать сборку, но только код CS?

Я могу получить доступ к XML-потоку до его преобразования, но это только WSDL. Я пытался создать код из моего CodeDomProvider, но это только создает пустой файл

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

Вы можете извлечь код из compileUnit (не CodeDOM) с «GenerateCodeFromCompileUni» Метод:

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

Затем вы сможете скомпилировать из созданного файла ...