【问题标题】:How to use " in CodeDom Source Code?如何在 CodeDom 源代码中使用“?
【发布时间】:2013-06-16 05:19:25
【问题描述】:

我想将此行附加到将要编译的源代码中:

Temp.AppendLine(@"[assembly: AssemblyDescription("[DESCRIPTION]"]);"); 

但是您看到 [DESCRIPTION] 也不在字符串中... 我想使用文本框的输入而不是 [DISCRIPTION]。我该怎么做?

        private void button1_Click(object sender, EventArgs e)
    {
        SaveFileDialog d = new SaveFileDialog();
        d.Filter = "Executable (*.exe)|*.exe";
        if (d.ShowDialog() == DialogResult.OK)
        {

            String InputCode = String.Empty;
            String regcode = String.Empty;
            //Unser TestCode, in dem Wir ein MessageBox aufrufen
            InputCode = "MessageBox.Show((1 + 2 + 3).ToString());";

            System.CodeDom.Compiler.CodeDomProvider CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
            //Parameter für die Compilierung, wie die einzubindenen Bibliotheken usw.
            System.CodeDom.Compiler.CompilerParameters CompilerParameters = new System.CodeDom.Compiler.CompilerParameters();
            CompilerParameters.ReferencedAssemblies.Add("System.dll");
            CompilerParameters.OutputAssembly = d.FileName;
            CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            CompilerParameters.CompilerOptions += "/target:winexe" + " " + "/win32icon:" + "\"" + textBox6.Text + "\"";
            CompilerParameters.GenerateExecutable = true;
            CompilerParameters.GenerateInMemory = false;

            //Über den StringBuilder wird der Code zusammengesetzt
            StringBuilder Temp = new StringBuilder();
            Temp.AppendLine(@"using System;");
            Temp.AppendLine(@"using System.Windows.Forms;");
            Temp.AppendLine(@"using System.Diagnostics;");
            Temp.AppendLine(@"namespace RunTimeCompiler{");
            Temp.AppendLine(@"public class Test{");
            Temp.AppendLine(@"public static void Main(){");

            Temp.AppendLine(@InputCode);
            Temp.AppendLine(@"}");
            Temp.AppendLine(@"public void Ergebnis(){");
            Temp.AppendLine(@"}}}");


            //Compilieren
            System.CodeDom.Compiler.CompilerResults CompilerResults = CodeDomProvider.CompileAssemblyFromSource(CompilerParameters, Temp.ToString());
            //Auf CompilerFehler prüfen
            if (CompilerResults.Errors.Count > 0)
            {
                MessageBox.Show(CompilerResults.Errors[0].ErrorText, "Fehler bei Laufzeitkompilierung", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            else
            {
                MessageBox.Show("Done", "Finished", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

【问题讨论】:

    标签: c# codedom


    【解决方案1】:

    获取 TextBox 输入,将其转换为 C# 字符串文字并将其放在包含属性代码的字符串中:

    string description = textBox1.Text;
    
    string descriptionAsCsharpStringLiteral =
        "@\"" + description.Replace("\"", "\"\"") + "\"";
    
    string attribute =
        "[assembly: AssemblyDescription(" + descriptionAsCsharpStringLiteral + ")]";
    
    Temp.AppendLine("using System.Reflection;")
        .AppendLine(attribute)
        .AppendLine("namespace ...");
    

    【讨论】:

    • 现在我收到一条错误消息:程序集不是此声明的有效位置。此声明的有效属性位置是“type”
    • AssemblyDescription 这样的全局属性必须出现在源代码中任何顶级using 指令之后和任何类型或namespace 声明之前。见Global Attributes (C# Programming Guide)
    • 像你说的那样,现在我得到这个错误:找不到类型或命名空间名称“AssemblyDescription”(你是否缺少 using 指令或程序集引用?)
    • 那么,您是否缺少 using 指令或程序集引用? AssemblyDescription attribute 位于mscorlib.dll 程序集的System.Reflection 命名空间中。
    • 好的,先生,你说的我都做了。现在我没有收到任何错误,但程序集描述没有用文本框的文本更新。如果我生成.exe,它没有文件描述...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多