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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск динамически скомпилированной сборки 
:(
    Опции темы
desevg
Дата 23.7.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть код

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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


namespace GenerationCode
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CSharpCodeProvider provider = new CSharpCodeProvider();
            ICodeCompiler compiler = provider.CreateCompiler();

            // Build the parameters for source compilation.
            CompilerParameters cp = new CompilerParameters();

            // Add an assembly reference.
           // cp.ReferencedAssemblies.Add("System.dll");

            // Generate an executable instead of 
            // a class library.
            cp.GenerateExecutable = true;

            // Set the assembly file name to generate.

            //cp.OutputAssembly = "D:\\test.exe";

            // Save the assembly as a physical file.
            cp.GenerateInMemory = true;

            // Invoke compilation.
            CompilerResults cr = compiler.CompileAssemblyFromSource(cp, richTextBox1.Text);

            if (cr.Errors.Count > 0)
            {
                foreach (CompilerError ce in cr.Errors)
                {
                    MessageBox.Show(ce.ToString());                    
                }

            }
            else
            {
                Assembly assembly = cr.CompiledAssembly;
                Type type = assembly.GetType("UserAssembly.Code");
                MethodInfo entryPoint = assembly.EntryPoint;              
                object mclass = Activator.CreateInstance(type);
                MethodInfo doUserCode = type.GetMethod("doUserCode");                
                MessageBox.Show(doUserCode.Invoke(mclass, null).ToString());
                
                //MessageBox.Show(Assembly.GetExecutingAssembly().Location);
            }
        }
    }
}




в richTextBox1 записываю код

Код

using System;
using System.Collections.Generic;
using System.Text;
namespace UserAssembly
{
    class Program
    {
        static void Main(string[] args) {}
    }
    public class Code {
       public string doUserCode() { return "hello"; }
    }
}


я разобрался, как скомпилировать этот код и как получить сборку из сборки класс и выполнить метод. а можно как-нибудь запустить динамически скомпилированную сборку, как обычную программу через точку входа. чтобы запустилось приложение. в данном случае консольное. я нашел свойство EntryPoint, но не понял, как им воспользоваться. через метод Invoke не получилось...
помогите примером иль советом хоть.. спс


PM MAIL   Вверх
diadiavova
Дата 23.7.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



В параметрах укажи MainClass в нём определи метод Main(по всем правилам ессно). Вроде всё (не помню уже точно - давно заморачвался).

ЗЫ
И не запускай меседжбоксов из цикла. Если будет много ошибок, придётся закрывать по окну для каждой и пока все не закроешь не получишь доступ к форме.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
desevg
Дата 24.7.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



добавил:
Код

cp.MainClass = "UserAssembly.Program";


но как запустить сборку?(

Код

                Assembly assembly = cr.CompiledAssembly;
                
                Type type = assembly.GetType("UserAssembly.Program");
                object entry = Activator.CreateInstance(type);
                MethodInfo entryPoint = assembly.EntryPoint;
                entryPoint.Invoke(type, null);


так не выходит, пишет Parametr count mismatch. хотя вроде как для обычных методом делаю. 
PM MAIL   Вверх
diadiavova
Дата 24.7.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Если речь о программном запуске, то какая разница исполняемый это файл или библиотека? Исполняемый файл отличается тем, что его можно двойным щелчком запустить и тому подобными вещами. Просто вот эту строку
Код

            //cp.OutputAssembly = "D:\\test.exe";

Надо раскомментировать(точнее указать реальный путь куда надо сохранить скомпилированный файл) и тогда прога должна запускаться. 

И кстати: у класса Assembly тоже есть метод CreateInstance smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
desevg
Дата 24.7.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Добавлено @ 17:56
Цитата(diadiavova @  24.7.2009,  17:35 Найти цитируемый пост)

И кстати: у класса Assembly тоже есть метод CreateInstance smile 

да тут такое многообразие, что я уже запутался(

кстати, нету;)

Это сообщение отредактировал(а) desevg - 24.7.2009, 17:59
PM MAIL   Вверх
diadiavova
Дата 24.7.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(desevg @  24.7.2009,  18:54 Найти цитируемый пост)
кстати, нету;)

http://msdn.microsoft.com/ru-ru/library/sy...teinstance.aspx

Цитата(desevg @  24.7.2009,  18:54 Найти цитируемый пост)
мне нужно без сохранения в файл. нужно обойтись так как сейчас, чтобы оставалась во временном

А тогда какая разница исполняемый это файл или библиотека? К тому же из временного его тоже можно вызвать, но чтобы сделать это программно надо использовать класс Process.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
desevg
Дата 24.7.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Добавлено через 6 минут и 9 секунд
если ты про метод Start() в классе Process, то там нужно указывать имя файла, а у меня его нет. он временный. если подставлять assebly.Location, то выдает ошибку. не правильный формат файлы
PM MAIL   Вверх
diadiavova
Дата 24.7.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Даже если ты не сохраняешь сборку явно, она всё равно сохранится во временном файле. Можешь не указывать cp.OutputAssembly, но после компиляции проверь его содержимое, ты увидишь временный файл, и если туда перейдёшь то там и будет твоя сборка. Оттуда и запускай, хотя имхо лучше самому место указать.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
desevg
Дата 24.7.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



наверное, ты прав. если файл так и так создается, то лучше самому контролировать этот процесс. в принципе, тогда пока вопросов больше нетsmile спасибо за участие
PM MAIL   Вверх
desevg
Дата 25.7.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



появился вопросsmile

По твоему совету, я указал конкретное место для компилируемой сборки. Но мне нужно, чтобы после того, как я его скомпилировал и запустил, удалить. но мне выдается ошибка, что файл не может быть удален. я так понимаю из-за того, что он участвует в работе программы, из которой я его компилирую. Возможно его как-тол освободить? выгрузить так сказать?

Это сообщение отредактировал(а) desevg - 25.7.2009, 15:45
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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