Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CodeDom, RunTime компиляция 
:(
    Опции темы
Plamenk
Дата 8.9.2005, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Всем Привет!

Задача очень простая: пользователь вводит функция в виде текстовой строки напирмет (x*x+100), а мне надо её вычислять для разных x. Конечно её можно распарсить, но я слышал что в Net. есть CodeDom позволяющий на лету формировать код и его компилировать.

Вобщем проблемы по большому две, я не понял как компилировать динамически созданный код и как его вызывать?

Заранее Все БОЛЬШОЕ СПАСИБО!
PM MAIL   Вверх
mr.DUDA
Дата 8.9.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Код

using System;
using System.IO;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

namespace ConsoleApplication
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {

            // C# исходник для компиляции
            string source = @"
using System;

namespace Test
{
    public class Calculator
    {
        public static int Calculate(int x)
        {
            return x*x + 10;
        }
    }
}
";



            // путь к длл, учитывая что она уже может существовать
            // и быть заблокированной
            string outputPath = @"c:\dynassembly.dll";
            int i=2;
            while(File.Exists(outputPath))
                outputPath = @"c:\dynassembly" + (i++).ToString() + ".dll";

            // компиляция
            CompilerParameters compilerParams = new CompilerParameters();
            compilerParams.CompilerOptions = "/o /target:library /d:DEBUG;TRACE";
            compilerParams.OutputAssembly = outputPath;
            new CSharpCodeProvider().CreateCompiler().CompileAssemblyFromSource(compilerParams, source);

            // загрузка assembly
            Assembly assm = Assembly.LoadFrom(outputPath);
            Type t = assm.GetType("Test.Calculator");
            MethodInfo method = t.GetMethod("Calculate", BindingFlags.Public|BindingFlags.Static);
            
            // вызов Calculate() для нескольких значений X
            for(int x=0; x<10; x++)
            {
                int result = (int)method.Invoke(null, new object[] {x});
                Console.WriteLine(result.ToString());
            }
        }
    }
}




--------------------
user posted image
PM MAIL WWW   Вверх
Plamenk
Дата 8.9.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: 1
Всего: 3



Большое Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.