PDA

View Full Version : 1- ارتباط میان دو برنامه, 2- ایجاد اشیاء COM در C#



Legend M.A.R
یک شنبه 16 مرداد 1390, 17:05 عصر
با سلام
دو تا سوال دارم اول اینکه بهترین راه برای ایجاد ارتباط بین دو برنامه کاملا مستقل از هم (منظور دو تا فایل اجرایی جدا از هم چیه؟) راهی که به ذهن خودم رسید (بجز Socket) برنامه نویسی Net Remote بود که خیلی برنامه رو پیچیده می کنه, راه دیگه ای سراغ دارید؟؟
سوال دوم اینکه (خیلی مهم تر از اولیه) چطوری میشه توی C# به صورت COM برنامه نویسی کرد, ببینید این جدای از اینکه میشه توی C# از کلاس های COM استفاده کرد, خیلی جستجو کردم بیشتر مثلا هایی که پیدا کردم در مورد این بود که مثلا توی C++ یک کلاس COM رو به صورت DLL یا همون کتابخانه ای در اختیار C# قرار داده بودن , در مورد این سوال اگر میشه راهنماییم کنید اصلا میشه با C# کلاس های COM رو طراحی کرد یا کلا بی خیال این مورد شم
با تشکر

Amir Oveisi
یک شنبه 16 مرداد 1390, 18:39 عصر
برای سوال اول میتونین از Message Queuing (http://www.techrepublic.com/article/use-microsoft-message-queuing-in-c-for-inter-process-communication/6170794)استفاده کنید.
برای سوال دوم اینجا (http://blog.stevedoria.net/20051008/creating-com-components-using-visual-csharp-dot-net)رو مطالعه کنید.

موفق باشید

Legend M.A.R
دوشنبه 17 مرداد 1390, 05:46 صبح
برای سوال اول میتونین از Message Queuing (http://www.techrepublic.com/article/use-microsoft-message-queuing-in-c-for-inter-process-communication/6170794)استفاده کنید.
برای سوال دوم اینجا (http://blog.stevedoria.net/20051008/creating-com-components-using-visual-csharp-dot-net)رو مطالعه کنید.

موفق باشید

سلام در مورد سوال اول چطور می تونم Message Queuing رو توی شبکه استفاده کنم قبلا سعی کردم وقتی نشد (یعنی فقط تونستم توی local ازش استفاده کنم) دیگه ولش کردم در این مورد میتونی منو راهنمایی کنی؟؟ در ضمن از راهنماییت ممنون

Amir Oveisi
دوشنبه 17 مرداد 1390, 15:21 عصر
این کد رو در نظر بگیرید:
MessageQueue queue = null;
string queueName = "SRV-MESSAGING\TechRepublic";

if (MessageQueue.Exists(queueName))
queue = newMessageQueue(queueName);
else
queue = MessageQueue.Create(queueName, false);

اون string ای که تعریف شده، میتونه یک آدرس در یک شبکه باشه.

Legend M.A.R
دوشنبه 17 مرداد 1390, 16:01 عصر
این کد رو در نظر بگیرید:
MessageQueue queue = null;
string queueName = "SRV-MESSAGING\TechRepublic";

if (MessageQueue.Exists(queueName))
queue = newMessageQueue(queueName);
else
queue = MessageQueue.Create(queueName, false);

اون string ای که تعریف شده، میتونه یک آدرس در یک شبکه باشه.

اون رشته که گفتید مثلا اسم سیستم و سایر مشخصاته دیگه؟ اگر اینطور باشه من قبلا نتونستم از این روش جواب بگیرم یه مشکل دیگه هم با این روش دارم و اون اینکه فرض کنید برنامه شما یک Windows Service باشه پیام ایجاد شده یا به عبارتی صف پیام ایجاد شده برای کاربر System است (یا گروه System) در این حالت یه برنامه که توسط کاربر اجرا شده امکان دسترسی به این صف رو نداره و خطا میده اینجا چه کار باید کرد؟؟؟؟

Amir Oveisi
دوشنبه 17 مرداد 1390, 16:44 عصر
اون رشته که گفتید مثلا اسم سیستم و سایر مشخصاته دیگه؟ اگر اینطور باشه من قبلا نتونستم از این روش جواب بگیرم
شخصا تست نکردم اما بر اساس مستنداتی که خوندم باید اینطور باشه.


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

r00tkit
دوشنبه 17 مرداد 1390, 17:02 عصر
راه های دیگه ای هم برای RPC وجود داره

eshpilen
دوشنبه 17 مرداد 1390, 18:15 عصر
Message Queuing technology allows applications running at different times to communicate across heterogeneous networks and systems, which might be temporarily offline. Applications send, receive, or peek (read without removing) messages from queues. Message Queuing is an optional component of Windows 2000 and Windows NT, and must be installed separately.

منبع: http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue%28v=vs.71%29.aspx

اینطور که نوشته، برای استفاده از Message Queuing باید سرویس مورد نصب و درحال اجرا باشه.
پس شاید این سرویس روی سیستم مقصد نصب یا درحال اجرا نبوده.

تاجاییکه فهمیدم، مزیت اصلی Message Queuing این هست که پیامهایی که ارسال میشن حتی اگر شبکه یا برنامهء مقصد در دسترس نباشه، از بین نمیرن و وقتی راه باز بشه یا برنامهء مورد نظر اجرا بشه پیامها قابل دریافت هستن.

بنظرم برای سناریوهایی که نیاز به این خاصیت ندارید بهتره از روشهای دیگه استفاده کنید. اینطوری کراس پلتفرمتون هم بیشتره.
بنابراین میتونید از سوکت استفاده کنید. البته گزینهء دیگری که بنظر میرسه استفاده از Named Pipe هست. اونطور که در رفرنس مشخص هست میشه ازش در شبکه و بین سیستمهای مختلف هم استفاده کرد. یه نگاهی به اینها بکنید:
http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx
http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream.aspx
http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx
http://msdn.microsoft.com/en-us/library/bb355390.aspx

البته بنده جزییات کاملی از این روش یادم نیست و باهاش کار نکردم، اما بنظر میرسه از روش سوکت ساده تر باشه.
البته بازم فکر میکنم از نظر کراس پلتفرم بودن، سوکت بهتره.

eshpilen
دوشنبه 17 مرداد 1390, 18:18 عصر
راه های دیگه ای هم برای RPC وجود داره
RPC یا IPC؟

Legend M.A.R
دوشنبه 17 مرداد 1390, 19:44 عصر
شخصا تست نکردم اما بر اساس مستنداتی که خوندم باید اینطور باشه.


امتحان کردید ببینید چه خطایی میده؟

خطای دسترسی غیره مجاز میده میگه (تا اونجا که یادمه) که این صف در دست یک گروه خاص هست (البته این خطا توی try catch ) گرفته شده در ضمن برای وصل شدن شبکه هم خیلی سعی کردم نشد اما این خطای دسترسی غیره مجاز رو براش راه حل دارید, یادمه اون موقع اگر برنامه کاربر اول صف رو درست میکرد بعد Windows Service میومد بهش متصل میشد (یعنی اونم یه صف با همون آدرس می ساخت) مشکلی نبود ولی برعکسش همیشه خطا داشت
در جواب دوستمون که گفتن نصب نیست, باید بگم اگر نصب نبود اصلا نمی تونستم صف ایجاد کنم چه برسه به اینکه بشه ازش استفاده کرد

RPC یا IPC؟
این چیزی که میگید چیه هست یکم بیشتر توضیح بدید ممنون میشم

Amir Oveisi
دوشنبه 17 مرداد 1390, 23:39 عصر
RPC (http://en.wikipedia.org/wiki/Remote_procedure_call)و IPC (http://en.wikipedia.org/wiki/Inter-process_communication)تا حدودی یک مفهوم رو دارند با این تفاوت که در IPC بین دو منبع، دیتا تبادل میشه اما در RPC هدف اجرای یک process در مقصد است. در هر دوی این متد ها میشه از Messaging استفاده کرد.

لطفا متن دقیق خطای مورد نظرتون رو بگید تا بتونم راهنمایی کنم :)

eshpilen
سه شنبه 18 مرداد 1390, 00:18 صبح
این چیزی که میگید چیه هست یکم بیشتر توضیح بدید ممنون میشم تاجاییکه میدونم...
RPC برای فراخوانی توابع/متدهایی در برنامهء مقصد و دریافت نتایج حاصل از اجرای اونهاست (مقدار بازگشتی تابع).
مثلا یه برنامه ای میتونه یک سرویس پردازشی رو با این روش به برنامه های دیگر ارائه بده.
IPC یک اصطلاح کلی تر هست و به هر روش ارتباط بین دو برنامه گفته میشه.

حالا شما باید فکر کنید ماهیت برنامه و نیاز شما چیه و بنابراین باید از کدوم دسته از روشها استفاده کنید.
ندیدم جایی RPC رو صرفا برای تبادل داده استفاده کنن. معمولا RPC در سناریوهایی بکار میره که تابع و عملیاتی باید در سرور اجرا بشه و معمولا داده های ارسال شده بعنوان آرگومان فراخوانی داده های کم حجم و معدودی هستن (چند قلم مجزا بصورت پارامترهای فراخوانی - اغلب از نوع اشیاء موجود در برنامه یا انواع داده ای استاندارد مثل رشته، عدد صحیح یا اعشاری، تاریخ و غیره) و بنظرم نتایج برگردانده شده هم معمولا نباید حجم زیادی داشته باشن.
کاربرد اصلی برنامهء شما برای برنامه های دیگر بخاطر پردازشی هست که باید در برنامهء خاص شما و احتمالا روی سرور مورد نظر انجام بشه یا اهمیت کار صرفا در تبادل اطلاعاتی و داده هاست؟ یعنی عملیات دیتا محور هست یا پردازش محور بر اساس توابع و سرویسهای پردازشی خاصی؟
این منطق و معیاری هست که بنظر بنده میرسه! البته یخورده مبهم هست، ولی فکر کنم هردوتامون بقدر کافی متوجه شدیم!!

Legend M.A.R
سه شنبه 18 مرداد 1390, 16:39 عصر
RPC (http://en.wikipedia.org/wiki/Remote_procedure_call)و IPC (http://en.wikipedia.org/wiki/Inter-process_communication)تا حدودی یک مفهوم رو دارند با این تفاوت که در IPC بین دو منبع، دیتا تبادل میشه اما در RPC هدف اجرای یک process در مقصد است. در هر دوی این متد ها میشه از Messaging استفاده کرد.

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