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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компиляция файла из программы. Что не так? 
V
    Опции темы
GGuz
Дата 25.4.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня вопрос по поводу компиляции файла. Следующего кода будет достаточно для компиляции 2го файла? Почитал в инете показалось легко, а на деле почему то не пашет((. Подскажите пожалуйста.


Код

using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom.Compiler;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
            ICodeCompiler compiler = provider.CreateCompiler();

            CompilerParameters parametrs = new CompilerParameters();
            CompilerResults result = compiler.CompileAssemblyFromFile(parametrs, @"D:\file.cs");
            Process.Start(@"D:\file.exe");
            
        }
    }
}



PM MAIL   Вверх
HalkaR
Дата 25.4.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


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

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



А содержимое file.cs можно глянуть?
PM MAIL   Вверх
GGuz
Дата 25.4.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Содержимое file.cs :

Код


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

public partial class Form1 : Form
    {
        static void Main()
        {
            Form MyForm = new Form();
            MyForm.Visible = true;
            Application.Run();
        }
    }        



PM MAIL   Вверх
HalkaR
Дата 25.4.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


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

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



Этот код ссылается на множество библиотек, а ты их не добавил. В код надо добавить 
Код

parametrs.ReferencedAssemblies.Add("System");
parametrs.ReferencedAssemblies.Add("System.Design");
parametrs.ReferencedAssemblies.Add("System.Drawing");
parametrs.ReferencedAssemblies.Add("System.Windows.Forms");

Кажется так.
PM MAIL   Вверх
Remiznik
Дата 25.4.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



извените за глупый вопрос ))  но я не очень понял что должна делать это программа ? он что считывает фаел и запускает его через компилятор ? 
PM MAIL   Вверх
GGuz
Дата 25.4.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



HalkaR, 
Проблема однозначно не в библиотеках! Просто не указал в коде. Если ты про это:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.Sql;
using System.IO;
using System.CodeDom.Compiler;
using System.CodeDom;
using System.Diagnostics;
using Microsoft.CSharp;
using System.Collections;



Если же нет, то после добавления в код:

Код

parametrs.ReferencedAssemblies.Add("System");
parametrs.ReferencedAssemblies.Add("System.Design");
parametrs.ReferencedAssemblies.Add("System.Drawing");
parametrs.ReferencedAssemblies.Add("System.Windows.Forms");


ничего не изменилось :(

Remiznik, 
Программа должна дать компилятору указанный файл на компиляцию.

Добавлено через 10 минут и 27 секунд
По поводу параметров:
можно заменить:
Код

CompilerParameters parametrs = new CompilerParameters();

на:
Код

CompilerParameters parametrs = new CompilerParameters(new string[] { "System.dll" }, filepath.Substring(0, filepath.LastIndexOf(".") + 1) + "exe", false);

где filepath = @"D:\file.cs";
Но все равно не пашет((

PM MAIL   Вверх
HalkaR
Дата 25.4.2008, 16:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


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

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



Кроме "System.dll" добавь еще System.Design.dll, System.Drawing.dll и System.Windows.Forms.dll

И вообще ошибка какая-нибудь возвращается?

Добавлено @ 16:40
Исправил код на
Код

using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;

namespace ConsoleApplication8
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            CodeDomProvider provider = new CSharpCodeProvider();
            ICodeCompiler compiler = provider.CreateCompiler();
            var parametrs = new CompilerParameters();
/////////////////////////////////////////////////////////////////////////
            parametrs.ReferencedAssemblies.Add("System.dll");
            parametrs.ReferencedAssemblies.Add("System.Design.dll");
            parametrs.ReferencedAssemblies.Add("System.Drawing.dll");
            parametrs.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            parametrs.OutputAssembly = @"c:\file.exe";
            parametrs.GenerateExecutable = true;
/////////////////////////////////////////////////////////////////////////
            CompilerResults result = compiler.CompileAssemblyFromFile(parametrs, @"C:\file.cs");
            Process.Start(@"c:\file.exe");
        }
    }
}

Все заработало. Обрати внимание на выделеные строки

Это сообщение отредактировал(а) HalkaR - 25.4.2008, 16:41
PM MAIL   Вверх
GGuz
Дата 25.4.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пасиба большое! Ура, заработало))) smile 

Это сообщение отредактировал(а) GGuz - 25.4.2008, 16:46
PM MAIL   Вверх
HalkaR
Дата 25.4.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


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

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



Правильный код чуть выше

Добавлено через 27 секунд
А ошибки надо смотреть в переменной result - она там не зря
PM MAIL   Вверх
GGuz
Дата 25.4.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



HalkaR, 
Да я уже заметил, еще раз спасибо)) 
PM MAIL   Вверх
source777
Дата 25.4.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Ха, прикольно, не знал о такой возможности, но в MSDN она вполне нормально описана, вот что у меня получилось:

Код

public static CompilerResults CompileCode(CodeDomProvider provider, String sourceFile, String exeFile)
        {
            // Configure a CompilerParameters that links System.dll
            // and produces the specified executable file.
            String[] referenceAssemblies = { "System.dll" };
            CompilerParameters cp = new CompilerParameters(referenceAssemblies,
                                                           exeFile, false);
            // Generate an executable rather than a DLL file.
            cp.GenerateExecutable = true;

            // Invoke compilation.
            CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
            // Return the results of compilation.
            return cr;
        }

        static void Main(string[] args)
        {
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

            string sourceFile = "..\\test.cs";
            CompilerResults cr = CompileCode(provider, sourceFile, "..\\test.exe");

            if (cr.Errors.Count > 0)
            {
                // Display compilation errors.
                Console.WriteLine("Errors encountered while building " +
                                sourceFile + " into " + cr.PathToAssembly + ": \r\n\n");
                foreach (CompilerError ce in cr.Errors)
                    Console.WriteLine(ce.ToString() + "\r\n");
            }
            else
            {
                Console.WriteLine("Source " + sourceFile + " built into " +
                                cr.PathToAssembly + " with no errors.");

            }
            Console.ReadLine();
}

Код
// test.cs
using System;

namespace CSharpWelcome
{
    class Welcome
    {
        static void Main()
        {
            Console.WriteLine("Welcome to C#!");
            Console.ReadLine();
        }
    }
}


Это сообщение отредактировал(а) source777 - 25.4.2008, 16:49


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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