PDA

View Full Version : نحوه ارتباط سی شارپ با سی پلاس پلاس



Hossenbor
پنج شنبه 26 اسفند 1389, 07:50 صبح
سلام خدمت دوستان عزیز من یک برنامه ساختم ولی مشکل سرعت داشتم برای همین رفتم سر وقت سی پلاس پلاس حالا میخوام بدونم چطوری میتونم اینا رو بهم ربط بدم با dllimport کردم خطای مبنی بر اینکه نقطه ورودی به نام تابع مورد نظر شما نیست چند تا چیرم بگم تمام برنامه رو میتونم به زبان سی پلاس پلاس بنویسم ولی اون خیلی پیچیدست و وقت ادمو میگیره و همچنین حجم برنامه بالا میره

JaguarXF
پنج شنبه 26 اسفند 1389, 08:37 صبح
کدوم رو توی کدوم میخواهی استفاده کنی؟

Hossenbor
پنج شنبه 26 اسفند 1389, 09:01 صبح
سلام استاد من میخوام از یک فایل dll به زبان c++ که یک تابع به نام compressbytes تو یک فایل کلاس c++ به نام compressor گذاشتم اسم خود فایل dll ‎هستbase.dll که خلاصه میخوام از سی شارپ به سی پلاس پلاس ارتباط بدم و اون بایتهای که تابع ‎ compressbytes برمیگردونه استفاده کنم فقط یک سوال دارم مشکل سرعتم حل میشه یا نه اگه شما راه حله بهتری دارید میشه راهنماییم کنید

hi level hdd
پنج شنبه 26 اسفند 1389, 12:15 عصر
با سلام
اونجایی که هر دو دارن از کتابخانه های دات نت استفاده میکنند سرعت برابر دارند.
سرعت حلقه در سی پلاس بیشتر است .(فکر کنم به خاطر نوع متغیر در محل قرار گیری در حافظه ولی اینو سند قرار نده)
اشاره گر ها قدرت یه زبان برنامه نویسیت که سی پلاس به صورت پیش فرض آن را داراست ولی سی شارپ با دست کاری در
تنظیمات و بلوک آن سیف به آن دسترسی دارد.
چون سی پلاس از فایلهای include , lib , obj استفاده میکند و بعضی از این کدها عینا کپی میشوند ، سرعت اجرا واقعا بالا میرود.
در صورتی که کتابخانه های دات نت در زمان اجرا به حافظه آورده میشوند.
برای استفاده از فایل Dll تون میتونید در قسمت Solution بر روی پروژتون راست کلیک کنید و Add Refrence رو انتخاب کنید.
اگه این Dll تحت دات نت باشه حتما در هر زبان دات نت دیگه اجرا میشه به شرط خروجی های مشابه که همه زبانها پشتیبانی کنند.
از ویژگیهای دات نت هم همین است که هر فردی با هر دستور زبان برنامه را به صورت شی گرا بنویسد و در زبانهای تحت ان سکو استفاده شود.
(Team Working) از وِیژگی های دات نت است.

Hossenbor
پنج شنبه 26 اسفند 1389, 12:27 عصر
سلام استاد اون فایلی که نوشتم از نوع win32 با این حال بازم شما فکر نمی کنید مشکل حل بشه چون که اینا دات نیستند من از تابع DllImport استفاده یعنی الان هیچ راهی برای جبران کمبود سرعت نیست

Hossenbor
پنج شنبه 26 اسفند 1389, 12:38 عصر
راستی یک چیز بگم کدهای سی پلاس پلاسم ناتیوند و با دات نت هیچ ارتباطی ندارند

Hossenbor
پنج شنبه 26 اسفند 1389, 15:31 عصر
salam dostan nezry nabod

hi level hdd
جمعه 27 اسفند 1389, 16:39 عصر
فکر نمیکنم ارتباطی بطونی ایجاد کنی چون کدهای ناتیو از حافظه مدیریت نشده استفاده میکنند.
اگه میتونی کدهاتو به صورت کتابخانه کلاس دات نت تبدیل کن و تو اونجا مشکلاتتو که بهش بر میخوری مطرح کن.
وگر نه فقط با سی پلاس کار کن و از سی شارپ کمک نگیر.البته هیچ کاری تو برنامه نویسی نشدنی نیست به
شرط اینکه اون کامپایلر قابلیتشو داشته باشه!

Hossenbor
جمعه 27 اسفند 1389, 17:46 عصر
سلام دوست من فایلهایی مثل user32.dll یا kernal32.dll کدهاشون ناتیوه و میشه به اونها وارد شد حالا چونکه از سنگین ترین شیوه فشرده سازی رو امتحان کردم تو سی شارپ تقریبا ٢.٥ برابر زمان نسبت به سی پلاس پلاس بود یک راه حل دیگه هم هست که قسمت فشرده سازی رو به زبان سی بنویسم البته با خط فرمان ولی من تو یک چیز موندم زمانی که از dllimport استفاده کرده خطایی مبنی بر اینکه نقطه ورودی به نام تابع مورد نظر نیست پس این تابع اون متد رو فراخوانی میکنه و ما میدونیم تابعی مثل Main رو بهش نقطه ورود نسبت داده که هر فایل سی شارپی که اجرا میشه اول از این تابع شروع به خوندن میکنه و در مورد فایلهای dll چون نقطه ورود ثابتی ندارند پس تابع بوسیله خودمون تایین میشه

رامین مرادی
چهارشنبه 27 آذر 1392, 20:27 عصر
ببخشيد اين تايپيك قديمي رو بالا آوردم ولي به نظرم جالبه
چطور ميشه تو سي پلاس پلاس كدي نوشيت و خروجيش مثلا يه مقدار بولين باشه و تو سي شارپ اونو صدا زد و نتيجه اجراي كد رو ديد؟؟؟؟؟

ak0100
چهارشنبه 27 آذر 1392, 23:37 عصر
با سلام

یه راه هم غیر از ساخت dll هست
و اونم اینکه برنامه هات رو تو c++ بنویسی و به exe کامپایل کنی و مانند برنامه داس بهش تو c# مقدار بدی و نتیجه رو بگیری

abbas.oveissi
پنج شنبه 28 آذر 1392, 02:04 صبح
با سلام

یه راه هم غیر از ساخت dll هست
و اونم اینکه برنامه هات رو تو c++ بنویسی و به exe کامپایل کنی و مانند برنامه داس بهش تو c# مقدار بدی و نتیجه رو بگیری

اگر اشتباه نکنم برای اینکار باید از یه Wrapper استفاده کنید . توی گوگل بگردید کلی آموزش پیدا میکنید :
Using C++ Class DLL in C# Application : http://stackoverflow.com/questions/569603/using-c-class-dll-in-c-sharp-application
Calling an unmanaged dll from .NET (C#) : http://blogs.msdn.com/b/jonathanswift/archive/2006/10/02/780637.aspx

رامین مرادی
جمعه 29 آذر 1392, 21:28 عصر
نه فرض كنيد برنامه اي كه تو سي شارپ نوشتيم با يه تابع خاصي يه عكسي مثلا از دسكتاپ گرفته حالا ما اون تصوير رو توي سي پلاس پلاس به صورت باينري باز ميكنيم و يه سري عمليات حجيم مثلا چند تا حلقه تو در تو روي فايلمون كار مي كنن و يه خروجي به ما ميده مانند نوع بولين حالا بايد اون خروجي رو توي سي شارپ نمايش بديم
اين عمليات پشت سر هم قراره انجام بشه . نظرتون راجبه اين توضيحي كه دادم چيه ؟؟
اگه از دي ال ال استفاده كنم فكر كنم به اون چيزي كه مد نظرمه نشه رسيد مانند سرعت اجرا(البته مثلا).

abbas.oveissi
شنبه 30 آذر 1392, 00:29 صبح
نه فرض كنيد برنامه اي كه تو سي شارپ نوشتيم با يه تابع خاصي يه عكسي مثلا از دسكتاپ گرفته حالا ما اون تصوير رو توي سي پلاس پلاس به صورت باينري باز ميكنيم و يه سري عمليات حجيم مثلا چند تا حلقه تو در تو روي فايلمون كار مي كنن و يه خروجي به ما ميده مانند نوع بولين حالا بايد اون خروجي رو توي سي شارپ نمايش بديم
اين عمليات پشت سر هم قراره انجام بشه . نظرتون راجبه اين توضيحي كه دادم چيه ؟؟
اگه از دي ال ال استفاده كنم فكر كنم به اون چيزي كه مد نظرمه نشه رسيد مانند سرعت اجرا(البته مثلا).

منظورتون اینه،برنامه سی شارپ باشه ولی عکس رو که گرفت ارسال کنه به یک تابع سی پلاس پلاس تا کارهای پردازش تصویر با سی پلاس پلاس انجام بشه و خروجی برگرده به سی شارپ؟
مگه اگر کلا تابعی توی دی ال ال باشه،سرعتش پایین میاد؟

رامین مرادی
یک شنبه 01 دی 1392, 18:57 عصر
آره دقيقا منظورم اينه.
يعني اون كارايي كه من ميخوام انجام بدم ، توي دي ال ال بنويسم مشكلي از نظر كارايي و سرعت اجرام نمي گيره آخه اين عمل يك بار انجام نميشه ممكنه تو يك دقيقه چهل بار اين عمل گرفتن عكس و پردازش اون فايل پشت سر هم اجرا بشه .
لطفا راهنمايي كنيد چون من چيزي راجب اين موضوع ندارم اگه ممكنه اطلاعاتتون رو به اشتراك بزاريد ممنون

abbas.oveissi
یک شنبه 01 دی 1392, 20:06 عصر
آره دقيقا منظورم اينه.
يعني اون كارايي كه من ميخوام انجام بدم ، توي دي ال ال بنويسم مشكلي از نظر كارايي و سرعت اجرام نمي گيره آخه اين عمل يك بار انجام نميشه ممكنه تو يك دقيقه چهل بار اين عمل گرفتن عكس و پردازش اون فايل پشت سر هم اجرا بشه .
لطفا راهنمايي كنيد چون من چيزي راجب اين موضوع ندارم اگه ممكنه اطلاعاتتون رو به اشتراك بزاريد ممنون
من تنها بخشی که درگیر DLL سی پلاس پلاس توی سی شارپ شده بودم برای Global Hooking بود.ولی کلا من خودم چندسال پیش که هنوز خیلی چیزی حالیم نبود،دنبال تشخیص پلاک با پردازش تصویر توی سی شارپ بودم.اون زمان تمام کارهارو دستی نوشتم،یعنی خودم با حلقه همه ی فیلتر،لبه یابی رو پیاده سازی کردم که کار رو انجام میداد اما خیلی کند،برای یه عکس 1دقیقه طول میکشید.بعدا دیدم با برنامه نویسی متلب با چندخط کد همه این کارها انجام میشه،اومدم با متلب یه DLL درست کردم اما اون زمان نتونستم پارامترهارو درست ارسال کنم و دیگه بیخیال شدم.
کلا اینا تجربه من توی همچین چیزی بوده :لبخند: همینا باعث شده که منم به این بحث علاقه داشته باشم و اومدم به شما کمک کنم

بابت قضیه سرعت،من یکم جستجو کردم و خیلی ها این سوال رو داشتن اما آخرش نتونستم جمع بندی کنم،برای همین گفتم اگر وقت کنم سعی کنم خودم تست کنم.

abbas.oveissi
دوشنبه 02 دی 1392, 04:03 صبح
بعد صرف چند ساعتی که بیشترش هم مربوط به تحقیق بود،تونستم یدونه DLL با زبان Native C Plus Plus بسازم و در زبان C Sharp ازش استفاده کنم.
بعدش یدونه نمونه برنامه درست کردم که هم پروژه DLL توشه و هم پروژه C Sharp که از این DLL استفاده میکنه.امیدوارم کمک کنه به بقیه تا اگر بلد نیستن،دیگه لازم نباشه مثل من کلی بگردن یا تحقیق کنن.:چشمک: