PDA

View Full Version : سوال: import کردن یک برنامه در برنامه ی دیگه؟ (برنامه نویسی پیشرفته)



ariyanna
شنبه 17 اسفند 1387, 15:56 عصر
سلام دوستان ، می خواستم بدونم چطور می شه یک برنامه که قبلا نوشته شده و الان بصورت فایل exe هستش رو در داخل یک برنامه دیگه import کرد بطوری که این برنامه مادر در دل خودش برنامه ی import شده رو داشته باشه (مثلا برای اینکه وقتی به برنامه ی مادر دستور می دیم برنامه ی import شده در داخل خودش رو در محلی مشخص export کنه) ؟
==
توضیح اینکه : برنامه ای که قرار Import بشه رو خودم نوشتم (یعنی به سورسش دسترسی دارم)

mehdi.mousavi
شنبه 17 اسفند 1387, 16:33 عصر
سلام دوستان ، می خواستم بدونم چطور می شه یک برنامه که قبلا نوشته شده و الان بصورت فایل exe هستش رو در داخل یک برنامه دیگه import کرد بطوری که این برنامه مادر در دل خودش برنامه ی import شده رو داشته باشه (مثلا برای اینکه وقتی به برنامه ی مادر دستور می دیم برنامه ی import شده در داخل خودش رو در محلی مشخص export کنه) ؟ == توضیح اینکه : برنامه ای که قرار Import بشه رو خودم نوشتم (یعنی به سورسش دسترسی دارم)

سلام.

چنین چیزی امکان نداره و باید نگرشتون به مساله رو تغییر بدید. در واقع، شما باید مشترکات این دو EXE رو بصورت یک Library جداگانه Compile کنید و سپس هر جا خواستید، از اون استفاده کنید. اما


اگر به دنبال Framework هایی برای ساخت Plugin هستید (و در واقع میخواهید این امکان رو فراهم کنید که exe شما توسط دیگر برنامه نویسها *در برخی از نقاط* توسعه پیدا کنه) اونوقت باید از Pattern های موجود برای اینکار بهره ببرید.
اگر EXE شما، یه NT-Service یا یه COM باشه، که در اینصورت برای ارتباط با هر کدوم از اینها در یک EXE دیگه، میتونید از IPC استفاده کنید و نیازی Import کردن چیزی نیست.
اگر منظور از این سوال، راه حلی برای Versioning هست، اونهم ساختار خودش رو داره و باید باز نگرشتون رو به مساله تغییر بدید.

__H2__
شنبه 17 اسفند 1387, 19:16 عصر
سلام
هر دو exe با دات نت نوشته شده اند؟
اگر اینطور است هیچ مشکلی ندارد، دستتان برای هر کاری باز است.
دو حالت مشخص دارد
1) شما میخواهید فقط فایل دوم را در یک محل و برای کاربر export کنید تا در دسترس او قرار بگیرد.
2) شما میخواهید کاربر فایل داخلی را نبیند ولی شما بتوانید اجرایش کنید.

قصدتان دقیقاً کدام مورد است؟

ariyanna
شنبه 17 اسفند 1387, 19:55 عصر
ممنون که وقت گذاشتید دوست عزیز ،
من دقیقا منظورم اولین چیزی که شما گفتید هستش (یعنی می خوام فایلی که import کردم در یک محل مشخص export بشه با پسوند exe ...) ، بله دو برنامه هم با .net نوشته شده اند و هر دو رو خودم نوشتم و به سورسشون هم دسترسی دارم من در project برنامه ی مادر خودم و در پوشه references فایل exe برنامه ای رو که می خوام import کنم رو وارد کردم اما نمی دونم که کارم درسته یا نه. و اگه درسته بعدش باید چکار کنم ؟ ممنون که راهنماییم می کنید

__H2__
شنبه 17 اسفند 1387, 21:02 عصر
سلام
خوب حالا که هدفتان کاملاً مشخص شد، میتوانید به تاپیک زیر و پست 4 مراجعه کنید:
http://www.barnamenevis.org/forum/showthread.php?t=112073

این هم معادل C#.Net


کد:
public static void Copy(string Source_EmbeddedName, string Destin_FilePath)
{
const int BUFFERSIZE = 16 * 1024;
byte[] buffer = new byte[BUFFERSIZE];
int iRead;

using (System.IO.Stream source = System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream(Source_EmbeddedName))
{
using(System.IO.FileStream destin = new System.IO.FileStream(Destin_FilePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
{
while(true)
{
iRead = source.Read(buffer, 0, BUFFERSIZE);
if (iRead <= 0) return;
destin.Write(buffer, 0, iRead);
}
}
}
}

//...

Copy("Projectname.Filename.Extension", "C:\\Filename.Extension");


موفق باشید.

ariyanna
شنبه 17 اسفند 1387, 22:03 عصر
ببخید آقای h2 من یه سوال ارم شما چرا اینجا از iRead استفاده کردید ؟ واسه اینکه مقدار BUFFERSIZE رو برابر حجم فایل قرار بدین ؟
====
من این کد رو که اجرا می کنم برام این خطا میاد :

Object reference not set to an instance of an object.
اا وقتی این قسمت از کد رو حذف می کنم :

iRead = source.Read(buffer, 0, BUFFERSIZE);
if (iRead <= 0)
return;
برنامه اجرا شده و هنگ می کنه و هارد بصورت مداوم کار می کنه ، بعد از stop کردن برنامه فایل من کپی شده در شاخه ای که می خواستم اما کار نمی کنه یعنی یک فایل خراب دارم.

ariyanna
شنبه 17 اسفند 1387, 22:08 عصر
درادامه ی توضیحات بالا :
خطای

Object reference not set to an instance of an object.
همون خطای nullrefrerence هستش اگه اشتباه نکنم.

mehdi.mousavi
شنبه 17 اسفند 1387, 22:40 عصر
سلام.
این دیگه چه کاریه؟ دارید کار InstallShield رو می کنید؟ اصلا چه دلیل عقلانی وجود داره که یه exe رو بصورت یه embedded resource تو یه exe دیگه بذاریم و موقع اجرا بخواهیم اونو extract کنیم و ...؟؟؟ (پووووووف.....)

پاورقی: آقا/خانم ariyanna، اگر واقعا این اون کاری بود که می خواستید انجام بدید، توصیه میکنم نگرشتون رو عوض کنید. این راه حل (؟) نشون میده که کاری که کردید از بیخ و بن ایراد داره.

ariyanna
شنبه 17 اسفند 1387, 22:55 عصر
سلام.
این دیگه چه کاریه؟ دارید کار InstallShield رو می کنید؟ اصلا چه دلیل عقلانی وجود داره که یه exe رو بصورت یه embedded resource تو یه exe دیگه بذاریم و موقع اجرا بخواهیم اونو extract کنیم و ...؟؟؟ (پووووووف.....)

پاورقی: آقا/خانم ariyanna، اگر واقعا این اون کاری بود که می خواستید انجام بدید، توصیه میکنم نگرشتون رو عوض کنید. این راه حل (؟) نشون میده که کاری که کردید از بیخ و بن ایراد داره.
ممنوناز راهنماییتون اما باید بکمکه ماهیت برنامه ی من جوری هستش که باید این کار رو انجام بده... ببینید اینطوری فرض کنین که من یک موشک دارم، حالابا چی پرتابش کنم ؟ این برنامه ای که دارم می نویسم استقرار دهنده ی برنامه ی من هستش ، برنامه ی من باید بایک بار اجرای برنامه استقرار دهنده در جایی کپی بشه و همونجا بمونه (حالا شاید برنامه استقرار دهنده بعدا پاک شد....) می فهمید چی می گم که ؟
نمی خواستم این مثال رو بزنم چون اصلا برنامه ی من و خود من در این حد نیستیم ، اما اگه اینطور بود که شما می فرمایید پس برنامه نویسان virus ها برای برنامه هاشون می تونستن یک instal shield بسازن نه ؟ یکمی عمیق تر فکر کنین متوجه منظورم می شید (مثلا ویروس اول فقط بک فایله اما وقتی اجرا می شه ارکان اصلی خودش رو در چندین جا کپی می کنه حالا شما می تونین فایل اصلی ویروس رو پاک کنین اما آیا ویروس از بین رفته ؟ ) ....

اگه می تونین منو تو این کارکمک کنین ممنون می شم :لبخندساده:

بازم تکرار می کنم من فقط مثال زدم و برنامه من ربطی به مباحث تخریبی نداره، من بعد از تکمیل برنامه اونو در قسمت برنامه های کوچک و مفید خواهم گذاشت (البته با source )

__H2__
شنبه 17 اسفند 1387, 23:54 عصر
سلام
- تا حدودی با نظر کاربر mehdi6755 موافق هستم و در پست 14 ان تاپیک دیگر هم همین را به نوعی گفته بودم.
- شخصا از مطلب زیر خوشحال شدم!

... برنامه من ربطی به مباحث تخریبی نداره ...


ببخید آقای h2 من یه سوال ارم شما چرا اینجا از iRead استفاده کردید ؟ واسه اینکه مقدار BUFFERSIZE رو برابر حجم فایل قرار بدین ؟
اگر فایل شما کوچک و منطقی باشد، (مثلاً زیر 1M) میتوانید بافری به اندازه کل فایل ایجاد کنید و با یک مرتبه خواندن و نوشت کار را تمام کنید:


public static void Copy(string Source_EmbeddedName, string Destin_FilePath)
{
using (System.IO.Stream source = System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream(Source_EmbeddedName))
{
int length = (int)source.Length;
byte[] buffer = new byte[length];

source.Read(buffer, 0, length);
System.IO.File.WriteAllBytes(Destin_FilePath, buffer);
}
}


ولی اگر فایلتان بزرگتر باشد و کدی بخواهید که همیشه و در هر شرایط و با هر حجم فایلی به راحتی کار کند، همان کد اول بهتر است.
در آن کد اولی، ما بافری 16K گرفته ایم، و فایل را در یک حلقه 16K 16K بر روی هارد کپی کرده ایم تا کل فایل تمام شود و همه اطلاعات منتقل و کپی شود.

(البته باز هم کد و راه های دیگری هم دارد، ولی به نظر من و به دلایل خودم روش فوق، بهترین راه است)


وقتی این قسمت از کد رو حذف می کنم
شما نباید آن خط را حذف کنید !!!
با حذف این خط برنامه در یک حلقه بینهایت شروع به write بلوکهای 16K بایتی صفر در داخل فایل میکند، تا هاردتان پر شود و... !!!!


من این کد رو که اجرا می کنم برام این خطا میاد
اگر با این خطا روبرو شده اید یعنی فایل را درست embeded نکرده اید یا رشته Source_EmbeddedName را صحیح وارد نکرده اید...
برای embeded صحیح مجدداً ان تاپیک را مرور کنید و مراحل را به دقت انجام داده و چک کنید.
http://www.barnamenevis.org/forum/showthread.php?t=112073

1- با فرمان Project->Add Existing Item فایل را به پروژه الحاق کنید
2- فایل را از Solution Explorer انتخاب و در پنجره properties خصوصیت Build Action انرا به Embedded Resource ست کنید.


و برای رشته Source_EmbeddedName صحیح هم دقت کنید تا مشکلی مثل پست 14 آن تاپیک نداشته باشید.
1) اول نام پروژه (اگر نام پروژه تان فاصله دارد به جایش "_" قرار دهید)
2) یک نقطه!
3) بعد اگر فایل را در پوشه ای در SolutionExplorer قرار داده اید نام ان را هم ذکر کنید (فقط مختص #C) + نقطه
4) نام کامل با پسوند فایل

بدون شک و تردید یا درست embeded نمیکنید و یا رشته معادل Source_EmbeddedName (مثلاً "Projectname.Filename.Extension") را صحیح وارد نمیکنید.

موفق باشید.

ariyanna
یک شنبه 18 اسفند 1387, 08:09 صبح
باز ه مدستتون درد نکنه دقیــقا مشکل همون چیزی بود که شما فرمودین من فایل رو درست در برنامه فراخونی نکرده بودم، بعنی بجای solution_Name.File_name.xxx فقط نام فایل رو می نوشتم...
در مورد خذف کردن اول تکه کد هم شما درست میگید، من اون تیکه کد رو حذف کردم و درکمال تعجب در محلی که می خواستم فایل export بشه یک فایل 1.4GB داشتم !!!! یعنی دقیقا همون حلقه ی بی تهایت 16KB ها.... ،

نکته تکمیلی :
حجم فایل من بسیار پایینه (12KB) بعد از اینکه export میشه یک فایل 16KB و البته بدون نقص رو دارم، یعنی 4KB اصافه .... من فکر می کنم که ترکیب دو کدی که شما نوشتید خیلی خوب و عالی کار می کنه (من از ترکیب این دو کد استفاده کردم) - به این صورت که همونطوری که شما در برنامه ی اخیــر خودتون گفتید ابتدا حجم فایل رو بدست می یارم بعد اونو در در BUFFERSIZE می ذارم حالا من می تونم بی نهایت (یعنی تا جایی که لازمه) حلقه به اندازه ی سایز فایلم داشته باشم که مشلک اضافه نویسی حل می شه و مشکل فایل های بسیار بزرگ و فایل های با حجم متغیر هم حل می شه ....

توضیخ آخــر:
من باز هم تکرار می کنم که برنامه ی من اصلا به مباحث تخریبی نمی پردازه، برنامه رو به زودی و با سورس کامل ، بر روی این فروم قرار میدم... (هر دو برنامه رو ، هم برنامه اصلی و هم برنامه ای که برنامه ی اصلی رو داخلش import کردم ) ... واقعا خوشحالم که در این فروم دوستانی مثل شما دارم که با تمام توانایی هاییشان وقت می ذارن و به من جواب می دن... با کمک شمادوست عزیز و همچنین نظرات دیگران مشکلم حل شد، بازم از شما استاد گرامی ممنونم.... :لبخندساده:

ariyanna
یک شنبه 18 اسفند 1387, 08:33 صبح
ترکیبی از دو کدی که آقای h2 اشاره کردند:

public void Extract(string Source_EmbodiedName, string Distination_Path)
{
using (System.IO.Stream source = System.Reflection.Assembly.GetExecutingAssembly(). GetManifestResourceStream("Transporter.stylers.model"))
{
using (System.IO.FileStream destin = new System.IO.FileStream(Distination_Path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
{
int iRead = (int)source.Length;
int BUFFERSIZE = iRead * 1024;
byte[] buffer = new byte[BUFFERSIZE];
while (true)
{
iRead = source.Read(buffer, 0, BUFFERSIZE);
if (iRead <= 0)
return;
destin.Write(buffer, 0, BUFFERSIZE);
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
Extract("stylers.model", (System.IO.Path.GetTempPath().ToString() + "stylers.exe"));
}

mehdi.mousavi
یک شنبه 18 اسفند 1387, 10:00 صبح
این برنامه ای که دارم می نویسم استقرار دهنده ی برنامه ی من هستش ، برنامه ی من باید بایک بار اجرای برنامه استقرار دهنده در جایی کپی بشه و همونجا بمونه

خوب. InstallSheild هم همینکارو میکنه. برنامه رو جایی کپی میکنه و برنامه همون جا میمونه. از اینجا به بعد، بسته به نوع برنامه، برنامه میتونه با هر بار بالا اومدن سیستم و حتی بدون Login کردن کاربر اجرا بشه. (اگر یه NT-Service باشه). هر وقت هم User خواست، میتونه اونو Uninstall کنه و Bingo!


(حالا شاید برنامه استقرار دهنده بعدا پاک شد....)
InstallSheild هم فایلهای موقتش رو در Windows Temp Directory میریزه، که هر وقت نیاز بود پاک بشه.


نمی خواستم این مثال رو بزنم چون اصلا برنامه ی من و خود من در این حد نیستیم ، اما اگه اینطور بود که شما می فرمایید پس برنامه نویسان virus ها برای برنامه هاشون می تونستن یک instal shield بسازن نه ؟

آهان، آفرین. حالا سوال فرق کرد. اگر میخواهید ویروس بنویسید، چرا اونو با .NET Framework مینویسید؟ ویروسها باید Footprint پایینی داشته باشن، نه اینکه به یه Framework چند ده مگابایتی بند باشن که شاید رو دستگاه Target باشه، شاید نباشه.

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


ویروس اول فقط بک فایله اما وقتی اجرا می شه ارکان اصلی خودش رو در چندین جا کپی می کنه حالا شما می تونین فایل اصلی ویروس رو پاک کنین اما آیا ویروس از بین رفته؟

این خیلی فرق میکنه با Extract کردن یه Embedded Resource...

ariyanna
یک شنبه 18 اسفند 1387, 12:55 عصر
آقای mahdi6755 ممنونم ازتون ،

آهان، آفرین. حالا سوال فرق کرد. اگر میخواهید ویروس بنویسید، چرا اونو با .NET Framework مینویسید؟ ویروسها باید Footprint پایینی داشته باشن، نه اینکه به یه Framework چند ده مگابایتی بند باشن که شاید رو دستگاه Target باشه، شاید نباشه.


اما کاش اون جمله منو که گفتم برنامه رو با سورش می ذارم داخل برنامه های کاربردی و کوچک در داخل سایت رو هم نقل قول می کردید ...
==========
اتمام بحث با تشکر از همه :لبخندساده: