从Web服务动态创建的程序集-如何在运行时获取.CS代码

本文关键字:运行时 获取 代码 CS 服务 Web 动态 创建 程序集 | 更新日期: 2023-09-27 18:21:07

我正在从Web服务动态创建程序集。在阅读了初始响应流(WSDL)之后,我使用ServiceDescriptionImporter和ServiceDescription来获取流和CodeDomProvider进行编译。

进口商

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);
        }
    }

从Web服务动态创建的程序集-如何在运行时获取.CS代码

您可以使用"GenerateCodeFromCompileUni"方法从compileUnit(而不是CodeDom)提取代码:

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

然后,您应该能够从创建的文件进行编译。。。