# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C >  C++‎ یا C#‎

## bita_naz

سلام دوستان

من دارم یه پروژه تجاری جدید رو شروع می کنم . حالا موندم با C#‎ شروعش کنم یا با C++‎ 
 :گیج: 
از یه طرف نرم افزار نیاز به ظاهر زیبا و قدرت در کار با دیتا بیس  داره و باید مرتبا آپدیت بشه. در حقیقت یه جورایی مثل نرم افزارای انبارداری هست و در نتیجه بهترین گزینه واسش دات نت فرم ورک هست . ولی از طرف دیگه یه قسمت فوق العاده سنگین پردازشی داره که در حقیقت یه پردازش هوش مصنوعی هست به نام Expert Systems و نیاز به سرعت زیادی داره.

حالا من موندم چکار کنم . از یه طرف امکانات دات نت رو لازم دارم و از طرف دیگه سرعت C++‎ رو. :گریه: 
البته من از یه زبان یا پوسته هوش مصنوعی به نام CLIPS استفاده میکنم که خود اون با C  نوشته شده ولی من dll دات نت و Win32 اون رو دارم و مجبور نیستم مستقیما از CLIPS استفاده کنم.

من قبلا با C#‎ پروژه حرفه ای انجام دادم ولی با C++‎ نه ولی اونو بلدم.

خوشحال میشم با توجه به شرایطی که گفتم نظرتون رو بدونم.

مرسی :لبخند:

----------


## رضا عربلو

خوب، می توانید از هر دو استفاده کنید.

----------


## bita_naz

> خوب، می توانید از هر دو استفاده کنید.


بله اینو شنیده بودم.
لطفا بیشتر توضیح بدین.

مرسی

----------


## رضا عربلو

برای استفاده از unmanaged dll های که با C++‎ نوشته اید از DllImport استفاده کنید:
Call Unmanaged Code. Part 1 - Simple DLLImport

و برعکس برای استفاده از اسمبلی های دات نت در C#‎
CodeProject: Exposing .NET Components to COM. Free source code and programming help
و 
How to call a managed DLL from native Visual C&#43;&#43; code in Visual Studio.NET or in Visual Studio 2005

----------


## oVERfLOW

شما اگه به تفاوت‌های این دو زبان آشنایی ندارید
دو تا دلیل می‌تونه داشته باشه

دلیل اول 
یکی از دو زبان رو بهش مسلط نیستید - جواب شما اینه که با اون زبانی که بهش مسلط هستید کار کنید

دلیل دوم
هیچ کدوم از دو زبان رو مسلط نیستید !!! - جوابش اینه که فعلا نوشتن این برنامه رو فراموش کنید و مهارت‌های برنامه‌نویسی خودتون رو افزایش بدید

----------


## bita_naz

ممنون از جواب شما

ولی یه سوالم رو جواب ندادید

آیا استفاده از Unmanaged Dll مشکل سرعت من رو حل می کنه و به چه اندازه؟؟؟

مرسی :لبخند:

----------


## oVERfLOW

این که نوشتید یعنی چی؟

شما هنوز پروژه رو شروع نکردید فکر سرعت کدوم بخشش هستید؟

قطعا گاهی اوقات لازم می‌شه بخش‌هایی از برنامه سرعت بسیار بالایی داشته باشه
گزینه‌های مختلفی هم پیش روی شما هست
حتی نوشتن بخشهایی با کمک زبان اسمبلی و پیوند پویای اون با برنامه

----------


## bita_naz

> این که نوشتید یعنی چی؟
> 
> شما هنوز پروژه رو شروع نکردید فکر سرعت کدوم بخشش هستید؟
> 
> قطعا گاهی اوقات لازم می‌شه بخش‌هایی از برنامه سرعت بسیار بالایی داشته باشه
> گزینه‌های مختلفی هم پیش روی شما هست
> حتی نوشتن بخشهایی با کمک زبان اسمبلی و پیوند پویای اون با برنامه


من فکر می کنم قبل از شروع باید همه جوانب کار رو سنجید و بهترین ابزار رو انتخاب کرد تا اینکه وسط راه بخام همه چیزو تغییر بدم.تحقیق قبل از شروع باعث بهره وری بیشتر می شه.

به هر حال من مجبورم از یکی از dll ها استفاده کنم .حالا چه دات نت و چه Native . ولی نمی دونم چه معیار مشخصی واسه تفاوت سرعت این دو هست و فقط می دونم که Natie سرعت بیشتری داره .
حتی تست هم نمی تونم بکنم چون شما فرض بگیر که یه قسمت برنامه یه الگوریتم Foreward Chaining با چند ملیون Fact داره و من نمیتونم اونو با هر دو زبان بنویسم و بعد تازه شروع  به تست سرعت کنم چون چند ماه طول می کشه .

به هر حال ممنون.

----------


## C++‎Lover

سلام.

در مورد ظاهر زیبا اگر از VS2008 SP1 استفاده میکنید باید بگم که برنامه نوشته شده توسط MFC+VC Feature Pack نه تنها چیزی از #C کم ندارند بلکه امکاناتی بیشتری مثل Ribbon Control و یک Framework کامل برای ایجاد برنامه های مبتنی بر DOC/VIEW و شبیه به خود Visual Studio و Office و کلی امکانات دیگر که هنوز به Net. اضافه نشدن رو ارائه میدن.

در مورد قدرت کار با دیتابیس هم ++VC دست کمی از Net. نداره و می تونید از OLE DB یا ATL OLE DB Consumer classes و یا ODBC و یا MFC ODBC Classes و یا کتابخانه های متعدد دیگری که وجود دارند استفاده کنید. (پیشنهاد من ATL OLE DB Consumer classes است)

در مورد Performance بالا هم که، چه در برنامه نویسی رابط کاربر چه در کارهای پردازشی ++Native VC و کتابخانه های مربوطه اش از زبانهای و کتابخانه های مبتنی بر Net. سر ترند.

اما نکته اینجاست که برنامه نویسی UI با یک زبان مبتنی بر Net. مثل #C و به کمک Windows Forms، از Productivity بسیار بالاتری نسبت به برنامه نویسی با ++VC به کمک MFC، ATL و یا WTL داره. در واقع برای اینکه سریع و راحت بتونید از MFC و ATL استفاده کنید باید تجربه زیادی (خیلی زیاد) در استفاده از این دو کتابخانه داشته باشید و همچنین به خود ++C نیز کاملا مسلط باشید. که با توجه به چیزهایی که گفتید فکر نکنم شما این تجربه رو داشته باشید.

در ضمن در برنامه شما  که یک برنامه دیتابیسی مثلا انبارداریه، این برنامه حتما مبتنی بر فرم هستش همچنین احتیاج به سیستم گزارش گیری قوی داره که در این دو مورد هم Net. برتری زیادی داره مثلا در C#‎ Form Designer به راحتی می تونید فرمهای بسیار انعطاف پذیر رو سریعا طراحی و اجرا کنید که این کار در MFC کاری طاقت فرساست. و مشکل اساسی در VC در گزارش گیری بوجود می آد که در VC تقریبا هیچ انتخابی ندارید و سیتمهای و کتابخانه های گزارش گیری بسیار و کم و ضعیفی در VC و MFC وجود دارند و کلی از کار رو باید خودتون انجام بدید. اما در Net. به راحتی می تونید از Crystal Reports و یا Microsoft Report Technology استفاده کنید که بسیار کارا و انعطاف پذیرند و احتیاجات گزارش گیری رو کاملا برطرف می کنند.

*بنابراین من پیشنهاد میکنم قسمت UI برنامه را کاملا در Net. و با Windows Forms و یا WPF پیاده سازی کنید.*

در مورد پردازش زیاد اطلاعات که گفتید، می تونید از روشهای Interop برای انتقال اطلاعات به کتابخانه های Native استفاده کنید تا پردازش در یک محیط کاملا Native انجام بشه. که با این کار بسته به نوع پردازش Performance برنامه شما تقریبا و یا خیلی زیاد افزایش می یابد.
تاکید می کنم که انتقال اطلاعات از محیط Net. به Native و بالعکس با افت سرعت همراه است بنابراین این روش فقط زمانی performance برنامه را افزایش می دهد که این انتقال اطلاعات به طور مستمر و کم کم نباشد. مثلا باید بتوانید حجم زیادی از اطلاعات را یک جا انتقال دهید تا Performance برنامه افزایش یابد. در غیر اینصورت پردازش نسبت به پیاده سازی کامل در Net. کندتر هم می شود.

انتخاب دیگر اینست که قسمت Native برنامه، خود مستقیما از پایگاه داده استفاده کند و فقط دستورات و نتایج را از روشهای مبتنی بر Interop ارسال کنید، که این راه مشکلات دیگری از قبیل سخت شدن Maintenance برنامه و همچنین سختی Synchronization را بوجود می آورد.

در مورد UI هم به غیر از MFC و ATL، انتخاب Native دیگری مثل کتابخانه Trolltech QT وجود داره که بسیار قوی و سریع و انعطاف پذیر است و در Visual Studio ادغام شده و می تونید به کمک آن  کل UI رو با امکانات RAD (مثل C#‎ Form Designer) به صورت کاملا انعطافپذیر و زیبا و مستقل از پلاتفرم طراحی کنید.

در مورد انتقال اطلاعات بین محیط Native و Net. و همچنین Interop اگر اطلاعاتی بیشتری برای شروع لازم دارید بگید تا براتون بنویسم.

پیروز باشید.

----------


## bita_naz

سلام
ممنون از پاسخ کامل شما.

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

ای کاش از اول ما هم VC++‎ شروع کرده بودیم بجای چسبیدن به دات نت. فکر نکنم بتونم به این سرعت vC++‎ یاد بگیرم . البته مشکل اصلی وقته. چون من توی C#‎ هم تازه کارم.

فقط یه سوال دیگه: من پردازش سنگینی رو که گفتم رو باید به صورت همزمان و موازی با  پروسس اصلی انجام بدم و در نتیجه مجبورم از MultiThreading استفاده کنم. حالا در این مورد چکار کنم که که سرعتم زیاد شه؟؟ البته بازم بگم که من از یه DLL استفاده می کنم که هم Native و هم دات نت اون رو دارم.

مرسی :لبخند:

----------


## توسعه نویس

ببین دوست عزیز در دات نت دو قضیه وجود داره : 

1- Manged Code یا کد مدیریت شده که این حالت مورد پردازش دات نت می باشد و دات نت مرتبا منبع برنامه شما رو که اجرا شده و در حافظه وجود داره با الگوریتم های پیچیده مورد پردازش و کنترل قرارمیده. تا از خطاهای احتمالی و پر شدن حافظه جلوگیری کنه. از طرف دیگه کدهای شما غیر مستقیم بصورت تفسیری توسط دات نت در زمان اجرا به native کامپایل شده و اجرا می شود که همین عوامل باعث کمی پایین آمدن سرعت می شود. ولی پاییداری برنامه و سرعت توسعه با مدیریت دات نت روی اجرا به نحو چشمگیری بالا میرود.  

2- unmanaged code یا کد مدیریت نشده که دات نت کنترلی روی مدیریت حافظه برنامه شما و ... انجام نمیدهد و خودتان باید مواظب خطاهای برنامه خود باشید. از طرفی به علت مدیریت نکردن دات نت، سرعت بالاتری در اختیار دارید. البته این دو حالت را کاملا آمیخته با هم می توانید بکار ببرید که باعث می شود در هر کجا که نیاز دارید از امتیاز آنها بهره ببرید. استفاده از توابع Win32 و DLL های غیر از دات نت یک نمونه از این حالت می باشد.

----------

