CodeDom 将生成的 .cs 文件保存在哪里?我们可以将此位置更改为其他文件夹吗

Posted

技术标签:

【中文标题】CodeDom 将生成的 .cs 文件保存在哪里?我们可以将此位置更改为其他文件夹吗【英文标题】:Where does CodeDom save generated .cs files? Can we change this location to a Different Folder 【发布时间】:2016-11-24 17:28:22 【问题描述】:

我已成功运行 codedam 示例项目。 输出文件在 bin 调试文件夹中。

正在生成一个 c# 类文件。 我需要在 D:/Temp 文件夹中生成这个 c# 类文件 我没有生成任何可执行文件 输出的是 C# .cs 文件。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.CodeDom.Compiler;
using System.CodeDom;
using Microsoft.CSharp;
using System.Reflection;


namespace codeDamnSample



    public class CCodeGenerator
    
        CodeNamespace mynamespace;
        CodeTypeDeclaration myclass;
        CodeCompileUnit myassembly;

        public void CreateNamespace()
        
            mynamespace = new CodeNamespace("mynamespace");
        
        public void CreateImports()
        
            mynamespace.Imports.Add(new CodeNamespaceImport("System"));

        
        public void CreateClass()
        
            myclass = new CodeTypeDeclaration();
            myclass.Name = "SampleTest:TestBase";
            myclass.IsClass = true;
            myclass.Attributes = MemberAttributes.Public;
            mynamespace.Types.Add(myclass);
        
        public void CreateMethod()
        
            CodeMemberMethod mymethod = new CodeMemberMethod();
            mymethod.Name = testMethod;
            CodeTypeReference ctr = new CodeTypeReference();
            //Assign the return type to the method.
            mymethod.ReturnType = ctr;
            //Provide definition to the method (returns the sum of two //numbers)
            CodeSnippetExpression snippet1 = new CodeSnippetExpression("AutomationBase obj = new AutomationBase()");
            //return the value
            CodeSnippetExpression snippet2 = new CodeSnippetExpression("obj.Execute(testCases[0])");
            //Convert the snippets into Expression statements.
            CodeExpressionStatement stmt1 = new CodeExpressionStatement(snippet1);
            CodeExpressionStatement stmt2 = new CodeExpressionStatement(snippet2);
            //Add the expression statements to the method.
            mymethod.Statements.Add(stmt1);
            mymethod.Statements.Add(stmt2);
            //Provide the access modifier for the method.
            mymethod.Attributes = MemberAttributes.Public;
            CodeAttributeDeclaration codeAttrDecl = new CodeAttributeDeclaration("Test");

            mymethod.CustomAttributes.Add(codeAttrDecl);
            //Finally add the method to the class.
            myclass.Members.Add(mymethod);
        
        public void SaveAssembly()
        
            myassembly = new CodeCompileUnit();
            myassembly.Namespaces.Add(mynamespace);
            CompilerParameters comparam = new CompilerParameters(new string[]  "mscorlib.dll" );
            comparam.GenerateInMemory = false;
            comparam.GenerateExecutable = false;
            comparam.MainClass = "mynamespace.CMyclass";
            Microsoft.CSharp.CSharpCodeProvider ccp = new Microsoft.CSharp.CSharpCodeProvider();

            String sourceFile;
            ccp.
            if (ccp.FileExtension[0] == '.')
            
                sourceFile = "SampleTest" + ccp.FileExtension;
            
            else
            
                sourceFile = "SampleTest." + ccp.FileExtension;
            
            var tw1 = new IndentedTextWriter(new StreamWriter(sourceFile, false), "    ");
            ccp.GenerateCodeFromCompileUnit(myassembly, tw1, new CodeGeneratorOptions());
            tw1.Close();

            ccp.CompileAssemblyFromDom(comparam, myassembly);


        
        public static void generateCod()
          
            CCodeGenerator cg = new CCodeGenerator();
            cg.CreateNamespace();
            cg.CreateImports();
            cg.CreateClass();
            cg.CreateMember();
            cg.CreateProperty();
           cg.CreateMethod();

          //  cg.CreateEntryPoint();
            cg.SaveAssembly();
           // Console.ReadLine();
        


    



【问题讨论】:

我的代码吐出了 .txt 文件,我必须将它们全部切换为 .cs 有没有办法让它们自动变成 .cs? 【参考方案1】:

它应该将文件保存在当前工作目录中,通常是您正在运行的项目中的bin/Debug 文件夹。

【讨论】:

我们可以指定其他文件夹的位置吗 在您的项目设置中。但是你宁愿改变cp.OutputAssembly中的路径。 你能详细说明吗..我无法理解 您可以在项目设置中设置构建位置,这也会更改输出目录,因为您没有在 cp.OutputAssembly 属性中指定一个。所以真正的解决方案是:在cp.OutputAssembly属性中指定路径。 cp.OutputAssembly = @"C:\temp\yourassembly.dll";

以上是关于CodeDom 将生成的 .cs 文件保存在哪里?我们可以将此位置更改为其他文件夹吗的主要内容,如果未能解决你的问题,请参考以下文章

C# CodeDom 编译器。错误 CS1056:意外字符“$”

将 XAML 文件保存在数据库中

Reflection.Emit 与 CodeDOM

怎么把 .cs的文件编译成exe程序

CodeDOM 系列一: 初识

手机cs扫描后上传电脑图片显示文件不存在或为空