PDA

View Full Version : سوال: ادغام exeهای چند Project در قالب یک فایل exe ؟



mhsmity
چهارشنبه 20 شهریور 1392, 16:10 عصر
سلام:
امیداورم که از عنوان سوال، سوال بنده رو متوجه شده باشین.
دریکه Solution چند Project ایجاد شده است.
وقتی برنامه کامپایل می شود به ازای هر Project ، یک فایل اجرای exe درایم.
حالا چی کار باید کرد که همه این پروزه ها در یک فایل اجرای قرار داده شود.
110469110470

برنامه رو هم براتون می زارم.

http://barnamenevis.org/images/misc/pencil.png

mhsmity
چهارشنبه 20 شهریور 1392, 17:05 عصر
سلام منظورتون اینه که چهار تا رو همزمان اجرا کنید ؟
اگه اینه که خوب شما می تونی یه پروژه رو بعنوان شروع کننده ی اجرا قرار بدین و در فایل program.cs این پروژه بقیه فایل های اجرایی رو فراخوانی کنید
یا راه دیگه اجرای زنجیره ایه ، یعنی هر پروژه پروژه ی بعدی رو فراخونی کنه
فکر کنم جواب بده
اگه اشتباه فهمیدم بیشتر توضیح بدین

ممنون. نه.

می خوام بقیه فایل های اجرای B C D در کنار فایل A نباشه
یعنی همه این ها داخل فایل A قرار بگیرن.

فرض کن مثل :
حالتی ، که یک پروزه ایجاد کردم و تمام فرم های پروزه های B C D رو در پروژه A ساختم و فراخوانی کردم.

منظور ادغام این چهار فایل هستش.

mhsmity
چهارشنبه 20 شهریور 1392, 18:19 عصر
منظورت استفاده از فرم ها و کدهای توی پروژه های دیگه که توی یه سلوشن هستنه ؟
اگه اینه
یه نگاه بکن (http://barnamenevis.org/showthread.php?418482-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%A8%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AF%DB%8C%DA%AF%D8%B1)

عزیزم نه .
اصلا سوال متوجه نشدین .
خوبه که تصویر هم براتون گذاشتم.

من می خوام همه exeها در یک فایل exe کامپایل بشه.

danialafshari
چهارشنبه 20 شهریور 1392, 19:02 عصر
سلام
اگر ساختار فایل ها سادس و نیاز به بانک نیست می تونید فایل های exe رو درون برنامه Resource کنید و از طریق 1 برنامه همه رو از درون خودش اجرا کنید

mhsmity
چهارشنبه 20 شهریور 1392, 20:27 عصر
سلام
اگر ساختار فایل ها سادس و نیاز به بانک نیست می تونید فایل های exe رو درون برنامه Resource کنید و از طریق 1 برنامه همه رو از درون خودش اجرا کنید

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

barnamenevisjavan
چهارشنبه 20 شهریور 1392, 21:53 عصر
سلام برای این که چندتا exe رو درون یک exe قرار بدید باید اون هارو بصورت ریسورس دربیارید و با یکسری کد در زمان اجرا فایل موردنظر رو استخراج کنید و بعد از اتمام کار دوباره حذفش کنید
کد به نقل از ایمان مدائنی
------------------------------
یک فایل Resource به پروژه خودتون اضافه کنید و از دکمه منو شکل Add resource گزینه File را انتخاب کنید و فایل اجرایی مورد نظر را به پروژه اضافه کنید. سپس روی فایل کلیک کنید و وقتی به مشخصات آن دسترسی پیدا کردید، مشخصه Build action آن را بر روی Embedded Resource تنظیم کنید. حالا کلاسی شبیه به کلاس زیر را برای استخراج و اجرای فایل exe مورد نظر احتیاج خواهید داشت :
public class ResourceExtractor
{
/// <summary>
/// Extract an resource to a file
/// </summary>
/// <param name="resourcePath">Path to resource</param>
/// <param name="destPath">Destination file path</param>
public void Extract(string resourcePath, string destPath)
{
var stream = GetType().Assembly.GetManifestResourceStream(resou rcePath);
if (stream != null)
{
var bytes = new byte[Convert.ToInt32(stream.Length)];
stream.Read(bytes, 0, bytes.Length);
File.WriteAllBytes(destPath, bytes);
}
}

/// <summary>
/// Execute a process and returns it's id
/// </summary>
/// <param name="process">Process info to run</param>
/// <returns>Process id for another porpuses</returns>
public int Run(ProcessStartInfo process)
{
return Process.Start(process).Id;
}

/// <summary>
/// Kill a process by the given id
/// </summary>
/// <param name="procId">Process id to kill</param>
public void KillProcess(int procId)
{
Process.GetProcessById(procId).Kill();
}
}
public class ResourceExtractor
{
/// <summary>
/// Extract an resource to a file
/// </summary>
/// <param name="resourcePath">Path to resource</param>
/// <param name="destPath">Destination file path</param>
public void Extract(string resourcePath, string destPath)
{
var stream = GetType().Assembly.GetManifestResourceStream(resou rcePath);
if (stream != null)
{
var bytes = new byte[Convert.ToInt32(stream.Length)];
stream.Read(bytes, 0, bytes.Length);
File.WriteAllBytes(destPath, bytes);
}
}

/// <summary>
/// Execute a process and returns it's id
/// </summary>
/// <param name="process">Process info to run</param>
/// <returns>Process id for another porpuses</returns>
public int Run(ProcessStartInfo process)
{
return Process.Start(process).Id;
}

/// <summary>
/// Kill a process by the given id
/// </summary>
/// <param name="procId">Process id to kill</param>
public void KillProcess(int procId)
{
Process.GetProcessById(procId).Kill();
}
}

با استفاده از کلاس بالا براحتی می تونید یک فایل exe رو از ریسورس های پروژه بیرون بکشید و اجرا کنید و با استفاده از Id اون، مثلاً در هنگام خروج از برنامه خودتون، اون برنامه رو هم ببندید. یک مثال از استفاده این کلاس :
var resExtractor = new ResourceExtractor();
var destPath = Environment.GetFolderPath(Environment.SpecialFolde r.Windows) + "file.exe";
resExtractor.Extract("Farasun.file.exe",destPath);
int procId = resExtractor.Run(new ProcessStartInfo(destPath));

درمثال فوق به جای Farasun از فضای نام پروژه خودتون استفاده کنید. هنگام بسته شدن برنامه خودتون ، با استفاده از procId و متد Kill کلاس فوق می تونید برنامه ای که باز کردید را از حافظه خارج کنید و بعد از اون هم اگر نیاز هست، فایل مورد نظر را از پوشه ویندوز حذف کنید.

barnamenevisjavan
چهارشنبه 20 شهریور 1392, 21:56 عصر
سلام برای این که چندتا exe رو درون یک exe قرار بدید باید اون هارو بصورت ریسورس دربیارید و با یکسری کد در زمان اجرا فایل موردنظر رو استخراج کنید و بعد از اتمام کار دوباره حذفش کنید
کد به نقل از ایمان مدائنی
------------------------------
یک فایل Resource به پروژه خودتون اضافه کنید و از دکمه منو شکل Add resource گزینه File را انتخاب کنید و فایل اجرایی مورد نظر را به پروژه اضافه کنید. سپس روی فایل کلیک کنید و وقتی به مشخصات آن دسترسی پیدا کردید، مشخصه Build action آن را بر روی Embedded Resource تنظیم کنید. حالا کلاسی شبیه به کلاس زیر را برای استخراج و اجرای فایل exe مورد نظر احتیاج خواهید داشت :
public class ResourceExtractor
{
/// <summary>
/// Extract an resource to a file
/// </summary>
/// <param name="resourcePath">Path to resource</param>
/// <param name="destPath">Destination file path</param>
public void Extract(string resourcePath, string destPath)
{
var stream = GetType().Assembly.GetManifestResourceStream(resou rcePath);
if (stream != null)
{
var bytes = new byte[Convert.ToInt32(stream.Length)];
stream.Read(bytes, 0, bytes.Length);
File.WriteAllBytes(destPath, bytes);
}
}

/// <summary>
/// Execute a process and returns it's id
/// </summary>
/// <param name="process">Process info to run</param>
/// <returns>Process id for another porpuses</returns>
public int Run(ProcessStartInfo process)
{
return Process.Start(process).Id;
}

/// <summary>
/// Kill a process by the given id
/// </summary>
/// <param name="procId">Process id to kill</param>
public void KillProcess(int procId)
{
Process.GetProcessById(procId).Kill();
}
}
public class ResourceExtractor
{
/// <summary>
/// Extract an resource to a file
/// </summary>
/// <param name="resourcePath">Path to resource</param>
/// <param name="destPath">Destination file path</param>
public void Extract(string resourcePath, string destPath)
{
var stream = GetType().Assembly.GetManifestResourceStream(resou rcePath);
if (stream != null)
{
var bytes = new byte[Convert.ToInt32(stream.Length)];
stream.Read(bytes, 0, bytes.Length);
File.WriteAllBytes(destPath, bytes);
}
}

/// <summary>
/// Execute a process and returns it's id
/// </summary>
/// <param name="process">Process info to run</param>
/// <returns>Process id for another porpuses</returns>
public int Run(ProcessStartInfo process)
{
return Process.Start(process).Id;
}

/// <summary>
/// Kill a process by the given id
/// </summary>
/// <param name="procId">Process id to kill</param>
public void KillProcess(int procId)
{
Process.GetProcessById(procId).Kill();
}
}

با استفاده از کلاس بالا براحتی می تونید یک فایل exe رو از ریسورس های پروژه بیرون بکشید و اجرا کنید و با استفاده از Id اون، مثلاً در هنگام خروج از برنامه خودتون، اون برنامه رو هم ببندید. یک مثال از استفاده این کلاس :
var resExtractor = new ResourceExtractor();
var destPath = Environment.GetFolderPath(Environment.SpecialFolde r.Windows) + "file.exe";
resExtractor.Extract("Farasun.file.exe",destPath);
int procId = resExtractor.Run(new ProcessStartInfo(destPath));

درمثال فوق به جای Farasun از فضای نام پروژه خودتون استفاده کنید. هنگام بسته شدن برنامه خودتون ، با استفاده از procId و متد Kill کلاس فوق می تونید برنامه ای که باز کردید را از حافظه خارج کنید و بعد از اون هم اگر نیاز هست، فایل مورد نظر را از پوشه ویندوز حذف کنید.

mhsmity
پنج شنبه 21 شهریور 1392, 19:42 عصر
سلام مجدد
در جواب پست خصوصی دوست خوبم من پروژه شون رو دانلود کردم و دیدم از همه ی این راه حل ها یه راه ساده تر وجود داره که نیاز به هیچ کد نویسی و حرکت خاصی نیست
گرچه من متوجه نشدم چرا برنامه نویس جوان این همه مسئله رو پیچوندن
و با تشکر از آقا دانیال که پست من رو حذف کردن !!!!!
روی Solution خودتون راست کلیک کرده و properties بزنید
در پنجره ی ظاهر شده در بخش startup project گزینه ی Multiple startup projects روانتخاب کنید
حالا بسادگی می تونید پروژه هایی که دلتون میخواد رو انتخاب کنید یا حذف کنید و یا حتی ترتیب اجرای اونها رو تغییر بدید.

چقدر میشه زندگی رو ساده کرد !!!!

شرمنده اصلا تو باغ نیستی به زار به کارمون برسیم

mhsmity
پنج شنبه 21 شهریور 1392, 19:53 عصر
یک فایل Resource به پروژه خودتون اضافه کنید
دست شما درد نکنه ولی کار جالبی نیست .
چون تعداد ارجاعات به این فایل ها زیاد هستش و هر دفعه این عملیات انجام دادن از سرعت برنامه کم می کنه.
و بلا اخره یه فایل EXE استخراج می شه که برای کراکرهای نرم افزار خیلی به درد بخور می شه و کدهای برنامه رو بیرون می کشن.

دیگه نا امید شدم و فکر کنم باید همه پروژه ها رو در قابل یه پروژه واحد انجام بدم

user6627
پنج شنبه 21 شهریور 1392, 23:18 عصر
سلام

فکر کنم شما باید از نرم افزارهایی که عملیات Merge را انجام میدن استفاده کنید که اغلب عمل مبهم سازی را هم انجام میدن.
خود میکروسافت هم یک نرم افزار ادغام کننده داره که فقط کارش ادغام و پک کردنه فایلهاست که من استفاده نکردم.اسمش یادم نیست سرچ کنید پیدا میکنید.
نرم افزارهای دیگری مثل SmartAssembly و Crypto Obfuscator هم هست که هم کار مبهم سازی یا Dotfuscator را انجام میدن و هم کار ادغام یا همون Merge
بنده قبلا یک پروژه تحت پایگاه داده که از چندین فایل تشکیل میشد را توسط نرم افزار Crypto Obfuscator مبهم و پک کردم.سرعت برنامم هم بالاتر برد چون قابلیت فشرده سازی هم داره!!!
البته فایلهایی که من ادغام کردم dll بودن که توی سه تا فایل exe مشترک بود و همچنین از کلید خصوصی هم استفاده کردم که نرم افزار Crypto Obfuscator برای همه ی اینها امکاناتی داره.

البته حواستون باشه که نسخه بدون کرکش روی فایل اجرائیتون محدودیت زمانی میذاره!!!

mhsmity
یک شنبه 31 شهریور 1392, 00:34 صبح
مقاله: ادغام سازی خروجی چند Project در یک Solution { ادغام Dllها و Exeها در یک فایل Exe} آموزش نرم افزار (http://barnamenevis.org/showthread.php?420360-%D8%A7%D8%AF%D8%BA%D8%A7%D9%85-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-%DA%86%D9%86%D8%AF-Project-%D8%AF%D8%B1-%DB%8C%DA%A9-Solution-%D8%A7%D8%AF%D8%BA%D8%A7%D9%85-Dll%D9%87%D8%A7-%D9%88-Exe%D9%87%D8%A7-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-Exe-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-IL)