ورود

View Full Version : سوال: در مورد ترکیب کد های Native با Managed



khorzu
جمعه 14 آبان 1389, 17:23 عصر
سلام
من می خوام یه اینترفیس دات نت از کتابخانه تحت سی غیر Managed ام داشته باشم تا از #C قابل دسترس بشه و سوالم اینه که آیا این امکان وجود داره که تمام کلاس های و توابع و کتابخانه های استاتیک غیر Managed رو با یه سری کلاس های Wrapper مدیریت شده در یک پروژه CLR Class Library با هم لینک و کامپایل کرد ؟ چنانچه می دانید شدنی می شه؛ اما تا اونجایی که بنده متوجه شدم برای هر جور کدی نمی شه .(مثلا جاهایی که template استفاده شده ؟) می خواستم بدونم محدودیت این روش چیه ... دیدم بعضی جاها یه بار از کلاس ها Native DLL ساختن و بعد یه Managed Wrapper ، این کار چه ضرورتی داره ؟ (در حالی که می شه کتابخونه رو با lib. لینک کرد و کد تمیزتری هم داشت.)

مصطفی ساتکی
شنبه 15 آبان 1389, 20:45 عصر
همین الان مگه ما داریم چیکار می کنیم یه DLL تو Native C++‎ می سازیم اون DLL می دیم تو .Net ازش استفاده می کنند. اینجا ما از کلاس ها تو function مون استفاده می کنیم.
تا جایی که من اطلاع دارم اگر کسی بخاد به طور مستقیم از کلاس های C++‎ تو C#‎ استفاده کنه امکانش وجود نداره ولی Template ها رو مطمئنم که نمیشه.
بایستی منتظر باشیم جناب موسوی یا آقا نیما جواب تکمیل تری به این تاپیک بدن.

khorzu
یک شنبه 16 آبان 1389, 07:57 صبح
ممنون.

همین الان مگه ما داریم چیکار می کنیم یه DLL تو Native C++‎‎‎ می سازیم اون DLL می دیم تو .Net ازش استفاده می کنند. اینجا ما از کلاس ها تو function مون استفاده می کنیم.به نظرم فلسفه Managed C هم همینه ؛ یعنی یه روش معادل ساده تر برای کار طاقت فرسای نوشتن مدخل get و set برای فیلد های کلاس های Native توی DLL رابط .

بایستی منتظر باشیم جناب موسوی یا آقا نیما جواب تکمیل تری به این تاپیک بدن. http://www.pic4ever.com/images/4fvfcja.gif

r00tkit
یک شنبه 16 آبان 1389, 08:36 صبح
می شه مشکلت رو یه بار دیگه درست بگی

khorzu
یک شنبه 16 آبان 1389, 11:03 صبح
می شه مشکلت رو یه بار دیگه درست بگی

شما می خواید یه اینترفیس دات نت از کتابخانه تحت سی غیر Managed اتون داشته باشید تا مثلا از C#‎ قابل دسترس بشه . چی کار می کنید ؟

r00tkit
یک شنبه 16 آبان 1389, 14:38 عصر
شما می خواید یه اینترفیس دات نت از کتابخانه تحت سی غیر Managed اتون داشته باشید تا مثلا از C#‎‎ قابل دسترس بشه . چی کار می کنید ؟


یه پروژهی managed c++ درست می کنم و در قسمت managed قسمت native رو wrap می کنم

تو managed c++ می تونی هر دو نوع کد رو داشته باشی

vcldeveloper
یک شنبه 16 آبان 1389, 15:29 عصر
تا جایی که من اطلاع دارم اگر کسی بخاد به طور مستقیم از کلاس های C++‎‎ تو C#‎‎ استفاده کنه امکانش وجود نداره
برای اینکه به کلاس ها در دات نت دسترسی داشته باشه، میتونه از COM استفاده کنه.

khorzu
دوشنبه 17 آبان 1389, 13:18 عصر
تو managed C++‎‎ می تونی هر دو نوع کد رو داشته باشی اما با اینکلود کردن هدرهای و لینک کردن کتابخانه های استاتیک Native مورد نظرم ، با این که کد ها CLR کامپایل می شند اما با ایمپورت اسمبلی ها به C#‎ کلاس های Wrapper ام وقت new شدن در زمان اجرا خطا می دن . این مشکل در مورد اضافه کردن سایر کتابخانه های Native مثل STL و WinAPI -که از Template هم استفاده می کنند- بوجود نمیاد و از این بابت که کد های native ام در Dll و exe یه Native درست کار می کنند ؛ به نظر میاد حتما محدودیتی در قاطی کردن کد های Native در Managed C به این روش وجود داره . البته یه راه حل اینه که من قسمت به قسمت کد های Native ام رو به پروژه Maneged اضاف کنم تا ببینم کجا مشکل بوجود می آد که کار سختیه و امیدوارم به اینجا کشیده نشه .

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

-------------------------------------------------------------------
توی این (http://www.codeproject.com/KB/mcpp/mixnetnative.aspx) مقاله سایت CodeProject برای انتقال کلاس های Native به Net. این معماری رو توصیه می کنه. البته من سعی نکردم تا ببینم توی این حالت مشکلی بوجود می آد یا نه ؛ چون قصدم این بود که به کد های Native ام دست نزنم - که توی این حالت برای ساختن Native DLL این کار واجبه - ولی به نظر می آد جواب نهایی این مشکل همین باشه .


http://www.codeproject.com/KB/mcpp/mixnetnative/Fig2_-_Managed_calling_native.png

mehdi.mousavi
چهارشنبه 19 آبان 1389, 19:29 عصر
اما با ایمپورت اسمبلی ها به C#‎‎ کلاس های Wrapper ام وقت new شدن در زمان اجرا خطا می دن. قصدم این بود که به کد های Native ام دست نزنم

سلام.
ابتدا بفرمایید با چه خطایی مواجه میشید. همینطور بفرمایید منظورتون از دست نزدن به کدهای Native چیه. بالاخره که باید توابع (یا کلاسهای) مورد نظر در اون Native DLL اتون رو Export کنید تا بشه از طریق Mixed DLL بهش دسترسی پیدا کرد.

Sample ای که در CodeProject معرفی کردید کاملا پاسخ گوی نیازی شما هستش. Sample رو ابتدا دریافت کنید (http://www.codeproject.com/KB/mcpp/mixnetnative/Mixing_.NET_and_Native_code.zip)، پس از اینکه Unzip اش کردید، Solution ای به اسم CLR calling Native وجود داره که اونو باید باز کنید. این Solution حاوی 3 پروژه دیگه هستش:


AdR.Samples.CLRCallingNative.CLRClient
AdR.Samples.CLRCallingNative.MixedDLL
AdR.Samples.CLRCallingNative.NativeDLL

پروژه CLRClient که با MixedDLL در ارتباطه، یه کلاسی به اسم Person برای Wrap کردن CPerson در NativeDLL داره که CLRClient با این Person در ارتباطه. فقط MixedDLL اش یه ایرادی داره، اونم اینکه توی فایل AdR.Samples.CLRCallingNative.MixedDLL.h اونجاییکه متود مورد نظر رو DllImport کرده، باید حتما EntryPoint مورد نظرش رو میداد، در نتیجه درستش اینه:

[DllImport("AdR.Samples.CLRCallingNative.NativeDLL.dll", EntryPoint="fnAdRSamplesCLRCallingNativeNativeDLL")]
static int fnNativeDLL();


ضمنا دقت کنید که .NET Framework مورد استفاده در هر سه پروژه یکی باشه، تا برنامه بدرستی کامپایل بشه. بررسی این سه پروژه به سرعت مشکل شما رو میتونه رفع کنه.

با اینحال، اگر بفرمایید دقیقا چه پیام خطایی می گیرید، شاید بتونم بهتر کمک کنم (شاید هم مشکل شما در همون EntryPoint ای باشه که بهش اشاره کردم...)

موفق باشید.

khorzu
پنج شنبه 20 آبان 1389, 07:20 صبح
همینطور بفرمایید منظورتون از دست نزدن به کدهای Native چیه. بالاخره که باید توابع (یا کلاسهای) مورد نظر در اون Native DLL اتون رو Export کنید تا بشه از طریق Mixed DLL بهش دسترسی پیدا کرد.خدا پدرتونوبیامرزه . سوال من دقیقا همین جاست . من می خوام این بلاک Native DLL رو از این مجموعه حذف کنم و بجاش کتابخونمو استاتیک با Mixed DLL لینک کنم .این کار شدنی میشه (من برای lua همین جوری Wrapper نوشتم) و همچنین اینجوری کد های Native هم لازم نیست دست کاری بشه . سوال اینه که این کار چه محدودیتی داره ؟ چون با کتابخونه ای که خودم نوشتم مشکلی که عرض کردم پیش می آد.
ایراد هم روی مثلا :

Application.Run(new Form1());اینو میده :

An unhandled exception of type 'System.BadImageFormatException' occurred in WindowsFormsApplication1.exe

Additional information: is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
Form1 یه فیلد از Class Wrapper ام داره.

mehdi.mousavi
پنج شنبه 20 آبان 1389, 21:54 عصر
خدا پدرتونوبیامرزه . سوال من دقیقا همین جاست . من می خوام این بلاک Native DLL رو از این مجموعه حذف کنم و بجاش کتابخونمو استاتیک با Mixed DLL لینک کنم .این کار شدنی میشه (من برای lua همین جوری Wrapper نوشتم) و همچنین اینجوری کد های Native هم لازم نیست دست کاری بشه . سوال اینه که این کار چه محدودیتی داره ؟ چون با کتابخونه ای که خودم نوشتم مشکلی که عرض کردم پیش می آد. ایراد هم روی مثلا :

سلام.
من همون Sample رو امروز توی خونه روی سیستمم که Windows 7 - 64BIT هستش آزمایش کردم و با تعجب دیدم منم همون خطای BadImageFormatException رو میگیرم. در نتیجه، بلافاصله متوجه شدم که احتمالا Target Platform پروژه های AdR.Samples.CLRCallingNative.MixedDLL و AdR.Samples.CLRCallingNative.NativeDLL توسط برنامه نویس، X86 در نظر گرفته شده. در عین حال، پروژه AdR.Samples.CLRCallingNative.CLRClient چون تحت .NET هستش، بصورت پیش فرض Any CPU در نظر گرفته میشه و چون OS من 64 بیتی هستش، پروژه CLR من داره برای X64 کامپایل میشه. پس باید همه رو یکی میکردم. برای اینکار، روی پروژه AdR.Samples.CLRCallingNative.CLRClient کلید سمت راست Mouse رو زدم و گزینه Properties رو انتخاب کردم، سپس Target Platform رو X86 گذاشتم و Bingo! مشکل رفع شد!

در نتیجه احتمال زیاد مشکل شما هم همینه. کافیه تا Target Platform همه پروژه ها رو یکی بذارید تا دیگه BadImageFormatException رخ نده.

موفق باشید.