PDA

View Full Version : استفاده از یک dll نوشته شده با C-Sharp در یک پروژه Visual C++ win32



Yashil01
سه شنبه 15 مرداد 1392, 13:24 عصر
سلام.

من یک dll دارم که به زبان C-sharp نوشته شده. در یک برنامه C-sharp میتونم به راحتی اونو به رفرنس ها اضافه کنم و از توابع اون در برنامه C-sharp استفاده کنم. الان لازم دارم از همون dll در یک پروژه دیگه که به زبان C++‎ و با توابع win32 و بدون استفاده از MFC نوشته بودم نیز بتونم استفاده کنم و توابع dll را فراخوانی کنم.

چند سایت اینترنتی نظیر لینک زیر را دیدم.
http://stackoverflow.com/questions/2446404/how-can-i-use-a-c-sharp-dll-in-a-win32-c-project
اما هنوز موفق به این کار نشده ام.
آیا کسی عملا از یک dll نوشته شده با C-Sharp در یک پروژه Visual C++‎ win32 تونسته استفاده کنه تا بتونه منو در مورد مراحل کار به صورت گام به گام راهنمایی کنه؟

با سپاس

یاشیل.

UfnCod3r
سه شنبه 15 مرداد 1392, 13:56 عصر
راه زیاد داره می تونی از خود دات نت هم کمک بگیری .
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
می تونی از ManagedCPP استفاده کنی .راحت ترینش فکر کنم این باشه
http://stackoverflow.com/questions/3102590/c-cli-explicitly-load-managed-dll-at-runtime-the-equivalent-of-loadlibrary-fo
سرچ کنی خیلی چیزا هست .
بهتره همون کد ها رو با سی++بنویسی . سریع تر هم میشه

Yashil01
سه شنبه 15 مرداد 1392, 14:32 عصر
راه زیاد داره می تونی از خود دات نت هم کمک بگیری .
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
می تونی از ManagedCPP استفاده کنی .راحت ترینش فکر کنم این باشه
http://stackoverflow.com/questions/3102590/c-cli-explicitly-load-managed-dll-at-runtime-the-equivalent-of-loadlibrary-fo
سرچ کنی خیلی چیزا هست .
بهتره همون کد ها رو با سی++بنویسی . سریع تر هم میشه

سلام - مرسی از توجه و راهنمایی شما - من این دو لینک را هم در جستجوهای اینترنتی خواندم. اما هنوز موفق به انجام اینکار نشده ام. من به کد dll دسترسی ندارم که آن را در سی پلاس پلاس دوباره بنویسم. اسامی توابع و نحوه کال کردن آنها را در c-sharp می دانم.
در سی پلاس پلاس همیشه با افزودن یک فایل h , lib از یک dll استفاده کرده ام. اما حالا که فقط خود dll را دارم که آن هم به زبان c-sharp نوشته شده است نمی دانم چه کار باید بکنم. در ضمن پروژه من در سی پلاس پلاس فقط از win32 استفاده می کند و از MFC در آن استفاده نمی کنم.
میتوانید بگید وقتی فایل سولوشن پروژه سی پلاس پلاس را باز کردم برای افزودن این dll و فراخوانی توابع آن عملا در محیط Visual Studio چه کارهایی باید انجام بدم؟

UfnCod3r
سه شنبه 15 مرداد 1392, 15:33 عصر
من به کد dll دسترسی ندارم که آن را در سی پلاس پلاس دوباره بنویسم. اسامی توابع و نحوه کال کردن آنها را در c-sharp می دانم.

مگه شما نمی دونی اونا به راحتی دیکامپایل می شن .:شیطان:
ی دیکامپیلر دات نت دانلود کن . Jet Brain Dot Peek و...
و اون دی ال ال سی شارپ رو باهاش بازکن و کد ها رو ببین :شیطان:

اون جور که شما می خوای اصلا نمیشه . اون لینک ها که دادم کلا همش به روش داینامیک لود کردنه اینطور نیست که کپی کنی تو پروژه و استفاده کنی
اونها هم درد سر خودش رو دارن . و شما باید خودت توابع رو ادرس رو بگیری و ..
در کل خودت بنویسی بهتره . اگه کدهاش بیشتر الگوریتم باشه 3 سوت سی++ میشه کرد .

Yashil01
چهارشنبه 16 مرداد 1392, 12:29 عصر
اون جور که شما می خوای اصلا نمیشه . اون لینک ها که دادم کلا همش به روش داینامیک لود کردنه اینطور نیست که کپی کنی تو پروژه و استفاده کنی
اونها هم درد سر خودش رو دارن . و شما باید خودت توابع رو ادرس رو بگیری و ..
در کل خودت بنویسی بهتره . اگه کدهاش بیشتر الگوریتم باشه 3 سوت سی++ میشه کرد .

سلام - ممنون از راهنمایی شما. فعلا به نظرم دو لینک زیر نزدیکترین راه حل هایی است که پیدا کرده ام. امیدوارم با تست اینها و جستجو و بررسی بیشتر جواب بگیرم.
http://support.microsoft.com/kb/828736
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
با سپاس
یاشیل.

مهرداد صفا
پنج شنبه 17 مرداد 1392, 12:55 عصر
با سلام.
به طور خلاصه اگر dll مورد نظر و اعضای آن Com visible باشند باید ابتدا با ابزار Regasm از ابزارهای .NET اسمبلی مورد نظر را Register کنید. در مرحله بعد برای استفاده از اسمبلی در ابتدای کد با دستور #import "c:\your com.dll" کتابخانه را import کنید.
برای نمونه سازی از کلاسی مثلا به نامtest هم تقریبا به این صورت عمل می شود:

MyNamespace::ItestPtr t1(__uuidof(MyNamespace::test));
t1->method1();

موفق باشید.

Yashil01
پنج شنبه 17 مرداد 1392, 17:21 عصر
سلام - بسیار ممنونم - با آنچه که در لینک زیر توضیح داده شده است توانستم از .dll نوشته شده با C-sharp در برنامه Win32 Cpp استفاده کنم.

http://support.microsoft.com/kb/828736

همانطور که آقای مهرداد صفا نیز توضیح داده است برای کمپایل درست برنامه باید دستور زیر در کامپیوتر اجرا شود:
RegAsm.exe ManagedDLL.dll /tlb:ManagedDLL.tlb /codebase
( با فرض اینکه نام فایل دی ال ال ManagedDLL.dll باشد. )
در کامپیوتر مبدا فایل .exe به درستی آماده و به درستی اجرا میشود.

حال این مشکل را پیگیری می کنم که وقتی این برنامه را برای کاربری ارسال می کنم
چون ManagedDLL.dll در کامپیوتر او رجیستر نشده است موقع اجرای برنامه پیام خطای زیر ظاهر میشود:
"unhandled exception: system.runtime.interopservices.sehexception: external component has thrown an exception"
برای جلوگیری از این خطا الان مجبورم دو فایل ManagedDLL.dll و ManagedDLL.tlb را برای کاربر نیز بفرستم و از او بخواهم که با RegAsm آنها را در کامپیوتر خود رجیستر کند.
آیا راهی وجود دارد که حالا این .dll نوشته با c-sharp را در فایل .exe برنامه که به زبان سی پلاس پلاس Win32 است embed کنم؟ (الویت اول) یا کار رجیسترشن دی ال ال را به نحو ساده و بدون درگیر ساختن کاربر در همان زمان اجرای فایل .exe در کامپیوتر مقصد انجام دهم (الویت دوم) در حالت دوم باید از کاربر بخواهم چه برنامه هایی را در کامپیوتر خود نصب داشته باشد؟
با سپاس از راهنمایی دوستان.
یاشیل.

مهرداد صفا
یک شنبه 20 مرداد 1392, 19:58 عصر
با سلام.
شما می توانید دستور مربوط به register کردن اسمبلی را در installer انجام بدهید. یا یک کنسول بنویسید که یک بار قبل از استفاده از نرم افزار اجرا شده و این کار را انجام دهد.

AftaB66
شنبه 28 دی 1392, 12:13 عصر
سلام.
من فایل tlb. رو ساختم .
ولی چند مشکل دارم .
1-آیا مسیرش فرق می کنه کجا باشه ؟ در روت پروژه باشه یا مثلا در فولدر Debug یا ..
2- import#..به فایل tlb. در صفحه cpp. باشه یا در stdafx.h?
3- بعد از import# زدن دو فایلی که ساخته می شن خیلی اررور دارن مثلا :

Error 11 error C2433: '_ArrayPtr' : 'inline' not permitted on data declarations

باید چکار کنم ؟

AftaB66
شنبه 28 دی 1392, 15:18 عصر
لطفا راهنمایی کنید..