PDA

View Full Version : سوال: ایجاد فایل خروجی exe در Runtime



ztx4
دوشنبه 24 اسفند 1388, 15:47 عصر
سلام
وقت به خیر
من می خوام یه برنامه بنویسم که در زمان اجرا فایل های exe تولید کنه.
بگذازید واضح تر توضیح بدم:
برنامه ی که می خوام یه چیزی شبیه برنامه ی picture 2 exe است.
می خوام در زمان اجرا یک سری خصوصیات رو برای برنامه ام تعریف کنم و برنامه ی من با توجه به این پارامتر ها یک فای اجرایی تولید کنه.
تو اینترنت گشتم چیزی دستگیرم نشد.
اگه می شه راهنمایی کنید یا منبعی رو برای مطالعه معرفی کنید.
ممنون از همه تون.

sia_2007
دوشنبه 24 اسفند 1388, 15:58 عصر
ببینید اگر برنامه اصلی شما با Net Framework. نوشته شده باشد، در جایی اجرا میشود که Net Framework. نصب باشد.
و در صورتی که Net Framework. نصب باشد، کامپایلرهای آن نیز وجود دارد.
شما کد برنامتون رو بنویسید، و سپس در برنامه با توجه به شرایط قسمتهایی از آن را بنویسید و بنا به مقتضیات کار قسمت هایی از کد را تغییر دهید.
سپس آنرا کامپایل کنید. با فایل CSC و ارسال پارامتر.
یعنی در نهایت سورس کد و تغییرات رو با پسوند cs. ذخیره کنید و با این فایل آن سورس رو کامپایل کنید، و یک EXE تحویل بگیرید.

ztx4
دوشنبه 24 اسفند 1388, 16:02 عصر
ممنون از پاسخ سریع شما
بله می خوام با سی شارپ و .net بنویسم.

تازه زبان C#‎ رو شروع کردم.قبلا جاوا کار می کردم.
می شه لطفا مراحل کار رو با جزییات بیشتری برام توضیح بدید
ممنون:قلب:

Reza_Yarahmadi
دوشنبه 24 اسفند 1388, 17:46 عصر
میتونید از فضای نام CodeDom استفاده کنید.
آقای نصیری توی سایتشون یه آموزش کوچیک در این رابطه دادن فکر کنم کارتون رو راه بندازه.
http://vahidnasiri.blogspot.com/2009/09/blog-post_16.html

sia_2007
دوشنبه 24 اسفند 1388, 19:19 عصر
یک روش خوب رو هم که دوستان معرفی کردند.

ztx4
سه شنبه 25 اسفند 1388, 00:21 صبح
اقا ممنون:بوس:

راه حل بسیار عالی بود.

من الان می تونم برنامه های تحت کنسول رو به راحتی تولید کنم.

اما یک مساله ی دیگه:
من می خوام فایل خروجی ام فرم داشته باشه win 32
همون طور که اطلاع دارید کد ما برنامه های ویندوزی تو سی شارپ تو 3 تا فایل ذخیره می شن.
کد های موجو در این 3 تا فایل رو باید با چه ترتیبی تو این برنامه قرار بدم تا عمل کنه؟
لطفا راهنمایی ر مورد این نوع برنامه ها ارائه کنید.
بسیار بسیار متشکرم.

SMRAH1
سه شنبه 25 اسفند 1388, 00:43 صبح
سلام
دو فایل cs رو می تونی ادغام کنی.برای این منظور نمیخواد کار پیچیده ای انجام بدی.فقط تمام محتویات درون namespace یکی رو، در درون namespace دیگری کپی کن.همین!در ضمن در این حالت دیگه احتمالا فایلت در حالت Design خوده VS باز نمیشه!
موفق باشی

ztx4
سه شنبه 25 اسفند 1388, 12:15 عصر
من نتونستم این 3 تا فایل رو تلفیق کنم!
3 تا فایل هست:
program.cs
form1.cs
form1.designer.cs
تو هر کدومش هم کد هایی هست
نمی دونم چه طور می شه این کد ها رو با کد زیری مخلوط کرد:
لطفا راهنایی کنید:






using System;
using System.Collections.Generic;
//دو فضاي نامي كه براي اين منظور اضافه شده‌اند
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace compilerTest
{
class Program
{
static void compileIt1()
{
//سورس كد ما جهت كامپايل
string source =
@"
namespace Foo
{
public class Bar
{
static void Main(string[] args)
{
Bar.SayHello();
}

public static void SayHello()
{
System.Console.WriteLine(""Hello World"");
}
}
}
";

//تعيين نگارش كامپايلر مورد استفاده
Dictionary<string, string> providerOptions = new Dictionary<string, string>
{
{"CompilerVersion", "v3.5"}
};
//تعيين اينكه كد ما سي شارپ است
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

//تعيين اينكه خروجي يك فايل اجرايي است بعلاوه مشخص سازي محل ذخيره سازي فايل نهايي
CompilerParameters compilerParams = new CompilerParameters
{
OutputAssembly = "D:\\Foo.EXE",
GenerateExecutable = true
};

//عمليات كامپايل در اينجا صورت مي‌گيرد
CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);

//اگر خطايي وجود داشته باشد نمايش داده خواهد شد
Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
foreach (CompilerError err in results.Errors)
{
Console.WriteLine("ERROR {0}", err.ErrorText);
}
}

static void Main(string[] args)
{
compileIt1();

Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}

ztx4
پنج شنبه 27 اسفند 1388, 09:35 صبح
سلام
سایت که ف ی ل ت ر ه
سوال من هم که بی جواب موند
جون من یکی بیاد اوضاع رو درست کنه

Reza_Yarahmadi
سه شنبه 03 فروردین 1389, 14:19 عصر
دوست عزیز ببخش دیر شد. هم یه مقدار مشغله شغلی بود هم ف...ر شدن سایت.
این نمونه کوچیک رو یه نگاه بنداز امیدوارم واسه شروع کارتو راه بندازه. وقت نداشتم کاملش کنم.

ztx4
سه شنبه 03 فروردین 1389, 23:13 عصر
دوست عزیز من واقعا ممنونم.لطف کردید.
یه ابهامی برام پیش اومده اگه لطف کنید رفع ش کنید ممنون می شم.

شما تو این قسمت کد:



string Source = @"using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sample
{

static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true );
Application.Run(new Form1());
}
}


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

private void Form1_Load(object sender, EventArgs e)
{
Button btn = new Button();" + "\n" +
"btn.Text = \"OK\";\n" +
"btn.Name = \"btnOK\";\n" +
@"btn.Location = new Point(90, 80);
btn.Click += new EventHandler(btn_Click);
this.Controls.Add(btn);
}

void btn_Click(object sender, EventArgs e)
{" + "\n" +
"MessageBox.Show(\"btnOK Clicked\");\n" + @"
}
}




partial class Form1
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

private void InitializeComponent()
{
this.SuspendLayout();
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(250, 200);
this.MaximizeBox = false;
this.Load += new System.EventHandler(this.Form1_Load);
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScree n;" +
"this.Text = \"This is Sample\";" +
@"this.ResumeLayout(false);
this.PerformLayout();
}
}
}";



قمست قرمز رنگ برام مبهمه
چرا به جای public ،Partial تعریف شده؟

Reza_Yarahmadi
سه شنبه 03 فروردین 1389, 23:38 عصر
Partial یک کلمه کلیدیِ که برای بخش بخش کردن یک کلاس به کار میره یعنی اینکه کدهای یک کلاس رو یکجا و در یک فایل ننوشت و هر بخش از کلاس جدا نوشته بشه. چون من این کدهای رو از فایلهای یک فرم Copy کردم از این کلمه استفاده شده ، شما میتونید کد رو بصورت زیر هم بنویسید:


string Source = @"using System;
using System.Drawing;
using System.Windows.Forms;

namespace Sample
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true );
Application.Run(new Form1());
}
}

public class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Button btn = new Button();" + "\n" +
"btn.Text = \"OK\";\n" +
"btn.Name = \"btnOK\";\n" +
@"btn.Location = new Point(90, 80);
btn.Click += new EventHandler(btn_Click);
this.Controls.Add(btn);
}

void btn_Click(object sender, EventArgs e)
{" + "\n" +
"MessageBox.Show(\"btnOK Clicked\");\n" + @"
}


private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

private void InitializeComponent()
{
this.SuspendLayout();
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(250, 200);
this.MaximizeBox = false;
this.Load += new System.EventHandler(this.Form1_Load);
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScree n;" +
"this.Text = \"This is Sample\";" +
@"this.ResumeLayout(false);
this.PerformLayout();
}
}
}";

Omid.Mafakher
سه شنبه 03 فروردین 1389, 23:55 عصر
---------------------------------

ztx4
چهارشنبه 04 فروردین 1389, 12:13 عصر
برای تولید کد می تونی از تکنولوژی T4 استفاده کنی و برای Build کردن اون هم از ابزاری به نام Microsoft.CSharp.CSharpCodeProvider استفاده کنی

به نظر من این بهترین راه.:چشمک:
ممنون
دوست عزیز می شه لطف کنید یه منبع خوب جهت یادگیری این تکنولوژی معرفی کنید.

Omid.Mafakher
پنج شنبه 05 فروردین 1389, 09:55 صبح
----------------------------------