Выполнение компиляции CSharpCodeProvider

Я тестировал код ниже

html:

::before

Узел:
- Визуализация HTML [115 ]
- Для теста отправки формы создан POST API ( http: // localhost: 3000 / test )

var express = require('express');
const bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json())


app.use('/', express.static(__dirname + '/public'));
app.post('/test', (req, res) => {
    console.log('test POST', req.body, req.params);
    res.status(200).json({ status: true })
});

app.listen(3000, function () { console.log('listening') });

Python:

from robobrowser import RoboBrowser
import re

url = 'http://localhost:3000/test.html'
rb =  RoboBrowser()
rb.open(url)


ff = rb.get_form(class_=re.compile('form'))

# yInputControl = rb.find(class_=re.compile(r'\y-input__control\b'))
yInputControl = rb.find(class_='y-input__control')
print(yInputControl)
yInputControl.value = 'myphonenumber' 
rb.submit_form(ff)

19
задан Andrew Peters 7 August 2008 в 12:44
поделиться

2 ответа

CompileAssemblyFromDom компилирует в .cs файл, который затем выполняется через нормальный компилятор C#.

Пример:

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

namespace CodeDomQuestion
{
    class Program
    {

        private static void Main(string[] args)
        {
            Program p = new Program();
            p.dotest("C:\\fs.exe");
        }

        public void dotest(string outputname)
        {
            CSharpCodeProvider cscProvider = new CSharpCodeProvider();
            CompilerParameters cp = new CompilerParameters();
            cp.MainClass = null;
            cp.GenerateExecutable = true;
            cp.OutputAssembly = outputname;

            CodeNamespace ns = new CodeNamespace("StackOverflowd");

            CodeTypeDeclaration type = new CodeTypeDeclaration();
            type.IsClass = true;
            type.Name = "MainClass";
            type.TypeAttributes = TypeAttributes.Public;

            ns.Types.Add(type);

            CodeMemberMethod cmm = new CodeMemberMethod();
            cmm.Attributes = MemberAttributes.Static;
            cmm.Name = "Main";
            cmm.Statements.Add(new CodeSnippetExpression("System.Console.WriteLine('f'zxcvv)"));
            type.Members.Add(cmm);

            CodeCompileUnit ccu = new CodeCompileUnit();
            ccu.Namespaces.Add(ns);

            CompilerResults results = cscProvider.CompileAssemblyFromDom(cp, ccu);

            foreach (CompilerError err in results.Errors)
                Console.WriteLine(err.ErrorText + " - " + err.FileName + ":" + err.Line);

            Console.WriteLine();
        }
    }
}

, который показывает ошибки в (теперь не существующий) временный файл:

) ожидаемый - c:\Documents and Settings\jacob\Local Settings\Temp\x59n9yb-.0.cs:17

; ожидаемый - c:\Documents and Settings\jacob\Local Settings\Temp\x59n9yb-.0.cs:17

термин Недопустимого выражения')' - c:\Documents and Settings\jacob\Local Settings\Tem p\x59n9yb-.0.cs:17

, Таким образом, я предполагаю, что ответ является "нет"

9
ответ дан 30 November 2019 в 05:18
поделиться

Я попытался найти, что окончательный компилятор звонит ранее, и я сдался. Существует множество слоев интерфейсов и виртуальных классов для моего терпения.

я не думаю, что исходная часть читателя компилятора заканчивается с деревом DOM, но интуитивно я согласился бы с Вами. Работа, необходимая для преобразования DOM к IL, должна намного меньше, чем читать исходный код C#.

0
ответ дан 30 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: