PDA

View Full Version : اموزش استفاده از UnmanagedDLL



silentrise
یک شنبه 11 فروردین 1387, 01:07 صبح
سلام
من چند وقت پیشها دستم رسید , که باید با استفاده از اون با دستگاهی ارتباط برقرار میکردم!
من سایت های زیادی رو گشتم اما جواب درستی نگرفتم در آخر ازمون خطا به جوابم رسیدم !
من خودم رو آپ کردم که روش استفاده و فراخوانی رو یاد بگیریم در حقیقت نمیشه ازش استفاده کرد بدون دستگاه !
این لینک هم برای شروع کار , کلیات رو داره !
http://en.csharp-online.net/CSharp_FAQ:_How_do_I_get_DllImport_to_work%3F
باسپاس

silentrise
یک شنبه 11 فروردین 1387, 01:56 صبح
یک برنامه خوب برای Dll ها میتونید هدر, مسیر و..... رو چک کنید !

razavi_university
یک شنبه 11 فروردین 1387, 03:00 صبح
میشه در مورد اون دستگاه توضیح بدی (بیشتر واسه اطلاعات عمومی)

silentrise
یک شنبه 11 فروردین 1387, 11:30 صبح
سلام
این دستگاه کارت ریدر میباشد ContactLess,Smart.... البته دستگاه خوبی نیست , چینی و مشکلات خودش رو داره , من باید بتونم کارت و بخونم و رایت کنم !
از پورت USB استفاده میکنه و یک درایور کوچیک داره !
دوستان در کنار آموزش این موضوع من سورس کد نهایی برنامه رو در آخر آپ می کنم که یه مثال کامل داشته باشیم !
باسپاس

silentrise
یک شنبه 11 فروردین 1387, 22:47 عصر
سلام
دوستان در عکس ضمیمه ساختار کلی این کارو نشان داده شده !
اگه از این سوالی داشتین , لطف کنید بپرسید !
با سپاس

silentrise
پنج شنبه 15 فروردین 1387, 00:28 صبح
سلام
در این پست نمونه ساده از یک Wrapper داریم :

تابع درونDLL با مشخصات :



BOOL WINAPI ConnectionUSBDevice(void
return:
true: Open USB port Success
False:Open USB port Error




کدی که درون کلاس باید نوشته شود :





static class Wrapper
{
[DllImport("HYMifare.dll")]
private static extern bool ConnectionUSBDevice();

public static bool OpenDevice()
{
return ConnectionUSBDevice();
}
}



فضای نام :




using System.Runtime.InteropServices;


طریقه استفاده درون برنامه :




bool isopen;
isopen = Wrapper.OpenDevice();




اگر سوالی در رابطه با کد داشتین بپرسین !
من توضیح ندادم که سوال بفرمایید !
باسپاس

razavi_university
پنج شنبه 15 فروردین 1387, 02:22 صبح
میشه پروژه رو ضمیمه کنی اینطوری یکم گنگه (البته واسه من که ضریب هوشیم یکم پایینه:چشمک: )

silentrise
پنج شنبه 15 فروردین 1387, 15:07 عصر
میشه پروژه رو ضمیمه کنی اینطوری یکم گنگه (البته واسه من که ضریب هوشیم یکم پایینه:چشمک: )

سلام
دوست عزیز کلا این موضوع گنگه , یه خورده پروژه نا مرتب به همین دلیل اجازه بدید دیرتر آپ کنم !
چون در اون صورت سوالات جانبی بیشتر میشه ! سعی میکنم تو همین چند روز مرتب کنم ! و بعد آپ بشه که من شرمنده نشم !
با سپاس از پیگیری دوستان

silentrise
جمعه 16 فروردین 1387, 03:45 صبح
سلام
امشب تو گشت و گذارم تو اینترنت به موضوع جالب و مربوط به تاپیک برخوردم !
در لینک زیر مسله تعریف شده که قسمت استفاده از DLL برای ما مهم ! UnmanagedDLL
می باشد!
http://www.codeproject.com/KB/cs/csppleds.aspx?msg=2492700#xx2492700xx
باسپاس

silentrise
جمعه 16 فروردین 1387, 23:33 عصر
سلام
من خودم سوال دارم ؟
در DotNetPlatform بیس همه چیز Object است ! ؟
در سی و سی پ پ و .... بیس , پوینترهاست ؟
ممنون میشم که در فهم این موضوع کمکم کنید !
باسپاس

razavi_university
شنبه 17 فروردین 1387, 12:29 عصر
فکر کنم توی مقاله‌ای که ترجمه کردم در ای مورد بحث شده

mosini
یک شنبه 18 فروردین 1387, 08:22 صبح
you can get the answer by following:
در این مقاله می خوام در مورد Dll هایی صحبت بکنم که به زبان های برنامه نویسی قدیمی نوشته شده اند.واقعیت اینه که من زیاد حال و حوصله نوشتن ندارم ولی چون امروز حال دارم و یه خورده بیکارم ،این مقاله رو می نویسم البته از همین اول بگم که شاید وسطش حال نداشته باشم و بیخیال نوشتن بشم.دیگه ببخشید.
.................................................. .................................................. .................................
ابتدا یه پیش توضیحات و مقدماتی نیاز هست که بتونین بیان توی باغ .خب Dll ها یی که شما توی دات نت می سازید همگی managed محسوب می شوند و اگه بخواین که از اون dll ها توی مثلا یه زبان دیگه برنامه نویسی توی دات نت استفاده کنید خیلی راحت اول از solution explorer روی Reference راست کلیک می کنید و از tab اِ Browse اون dll تون رو پیدا می کنید و کار تمومه.بعدش هم برای استفاده توی برنامتون کافیه یه using yourDllName به بخش usingها اضافه کنید.(توجه:بجای yourDllName باید اون dllتون رو بنویسید-از این توضیح کاملتر دیگه یافت نمی شه!).

خب حالا دیگه می تونید از اون متد ها و property و فیلدها ی توی dll تون استفاده کنید.خب این کار برای dll های به اصطلاح managed شده جواب میده،اومدیم و خواستین از یه dll قدیمی ای که توی VB 6 یا توی C نوشته شده استفاده کنید اونوقت اگه کار های قبلی رو ادامه بدین مثل خر توی گل می مونید پس این کار رو نکنید .(به حرفم گوش کنین به نفعتونه).خب چی کار باید کرد؟

این جاست که باید اول در مورد unamanaged code بحرفم.به کد هایی که با .net نوشته نشدن unamanaged code گویند.این dll های قدیمی هم پس معمولند که unamanaged code هستند.OK.حالا یه خبر خوب دات نت به شما امکان استفاده از اون dll ها رو هم میده.چه جوری؟
خیلی راحت باید از ساختار زیر استفاده کنین:

DllImport ("yourOldDLL.dll",CallingConvention=CallingConvent ion.Cdecl, EntryPoint="MethodNameInOldDll",CharSet=CharSet.An si)"

public static extern int MyMethodInDotNet(int nComType, [MarshalAs(UnmanagedType.LPStr)] String Param);
خب حالا فک کنم وقتشه دیگه بیخیال نوشتن بشم
نه بابا نترسین توضیح کد بالا رو میدم:
DllImport برای افزودن یه dll هست که unamanaged نوشته شده.yourOldDLL.dll هم اسم اون dll قدیمیه هست که می خواین وارد برنامتون کنین.CallingConvention هم مربوط به ساختاری داره که کامپایلر مربوط به اون dll اونو compile کرده.اگه dll شما به زبان C نوشته شده باید بدنین که calling conventionیی که کامپایلرش بکار می بره Cdecl هست(پس گیج نزنین که این Cdecl دیگه چیه اگه وقت کردم یه تاپیک جامع در مورد calling convention می زارم(از "ز" یی که توی می زارم گذاستم ایراد نگیرید)).اگه از یه win api استفاده می خواین بکنین از stdcall استفاده کنین بجای Cdeclتوی کد بالا.خب دیگه چی مونده آهان EntryPoint .جلوی این قسمت که نوشتم MethodNameInOldDll مشخص می کنه آقا اسم فرضا متدی که توی dll هست و من می خوام از اون استفاده کنم MethodNameInOldDll هست.CharSet هم میگه که این متد توی dll من اگه Ansi باشه دیگه فارسی نویسی باید بیخیال شیم.(نقطه بریم سر خط)

razavi_university
یک شنبه 18 فروردین 1387, 22:41 عصر
you can get the answer by following:
در این مقاله می خوام در مورد Dll هایی صحبت بکنم که به زبان های برنامه نویسی قدیمی نوشته شده اند.واقعیت اینه که من زیاد حال و حوصله نوشتن ندارم ولی چون امروز حال دارم و یه خورده بیکارم ،این مقاله رو می نویسم البته از همین اول بگم که شاید وسطش حال نداشته باشم و بیخیال نوشتن بشم.دیگه ببخشید.

دوست عزیز این چند خط که مقاله حساب نمیشه، حداقل چند صفحه‌ای بنویس :متفکر:
البته در رابطه با حالت مدیرت نشده(Unmanaged) و مشکلاتی که در کار با انها در محیط مدیریت شده پیدا می‌کنید در مقاله ی که چند وقت پیش گذاشتم بحث شده.
این توضیحات را واسه این گفتم که اگه قصد ترجمه و یا نوشتن مقاله‌ای را دارید بتونین از اون استفاده کنین و کار دوباره انجام ندین:چشمک:

mosini
سه شنبه 20 فروردین 1387, 14:05 عصر
عجب،آقای رضوی به خاطر تشویق هاتون ممنونم:لبخند:
بگذریم.در مورد استفاده از unmanaged در managed --environment بحث بسیار است که باور کنید وقت ندارم همش رو بگم.در مورد Calling Convention و Entry Point و Exact Spelling هم بحث میشه.بگزریم فقط اینو بگم که اگه در محیط managed بخواین که نام مستعار برای اون dll یی که متد قدیمیه توش هست بیارین باید حتما از attribute اِ Entry Point استفاده کنید.Calling convention بر اساس دانش من یعنی چگونه پارامتر های یک متد به stack ارسال بشه , همچنین چه جوری stack خالی بشه.در واقع وقتی compiler سی شارپ می خواد که کد unmanaged را اجرا کنه اگه شما calling convention ننویسید ممکنه که به خطابر بخورین،ببینید گفتم ممکنه نه همیشه،ولی اگه می خواهید که حتما برنامتون درست عمل کنه از calling convention استفاده کنین و در این حالت compiler می دونه که چه جوری باید پارامتر ها رو ارسال کنه و stack رو خالی کنه.حالا می خواستم از دوستانی که فکر می کنن من مطالبم رو از جایی ترجمه می کنم خواهش کنم متن اصلی اون کتاب رو بیارن.قابل توجه رضوی:چشمک:
---------------------------------------------------------------------------------------------------
Try Not To Put Your Works For the Day After,FIRST THINGS FIRST
kabi upna kam ko dusra din nahi keho,peyla kam peyla

razavi_university
سه شنبه 20 فروردین 1387, 16:17 عصر
دوست عزیز اشتباه برداشت کردی
قصد من کم ارزش کردن کار شما نبود بلکه کمک به ارائه مطالب جدیدتر بود.
اگر باعث رنجش شما شدم واقعا معذرت می‌خوام

mosini
چهارشنبه 21 فروردین 1387, 08:57 صبح
خواهش می کنم.any way the life is short,be cool!:چشمک:

mosini
چهارشنبه 21 فروردین 1387, 09:38 صبح
خب در مورد این که بیس همه چیز در #C شی است،شک نکن.شما کلا هر برنامه ای که می نویسی مجبوری از یه کلاس استفاده کنی.اینو بگم که مفهوم شی و کلاس ،درواقع جدا از هم نسیت.شی در واقع موجود جانداری است از کلاس بی جان خودش.یعنی یه کلاس در واقع ساختار کلی هست و شی نمود کاری آن در برنامه است.در واقع شما از طریق کلاس می تونی دسته بندی انجام بدی.همین.کلا دلیل بوجود اومدن متد و کلاس و namespace همین بوده.قبل ها که کلاس و شی استفاده نمی شد، شما با انبوهی از متغیر ها و توابع و پارامترها و نوع های بازگشتی سر و کار داشتی که به عبارتی پدرت در میومد تا بخواهی دید کلی روی برنامت داشته باشی،ولی حالا با #C خیلی راحت برای اون چیز هایی که به هم مرتبط می یای کلاس تعریف میکنی و چیزی که باهاش درگیر می شی تعداد زیادی شی از اون کلاس هاست.با این روش دستیابی به اون چیزی که می خوای خیلی راحت میشه.امیدوارم تونسته باشم کمکت کرده باشم .

mosini
چهارشنبه 21 فروردین 1387, 09:39 صبح
سلام
من خودم سوال دارم ؟
در DotNetPlatform بیس همه چیز Object است ! ؟
در سی و سی پ پ و .... بیس , پوینترهاست ؟
ممنون میشم که در فهم این موضوع کمکم کنید !
باسپاس

خب در مورد این که بیس همه چیز در #C شی است،شک نکن.شما کلا هر برنامه ای که می نویسی مجبوری از یه کلاس استفاده کنی.اینو بگم که مفهوم شی و کلاس ،درواقع جدا از هم نسیت.شی در واقع موجود جانداری است از کلاس بی جان خودش.یعنی یه کلاس در واقع ساختار کلی هست و شی نمود کاری آن در برنامه است.در واقع شما از طریق کلاس می تونی دسته بندی انجام بدی.همین.کلا دلیل بوجود اومدن متد و کلاس و namespace همین بوده.قبل ها که کلاس و شی استفاده نمی شد، شما با انبوهی از متغیر ها و توابع و پارامترها و نوع های بازگشتی سر و کار داشتی که به عبارتی پدرت در میومد تا بخواهی دید کلی روی برنامت داشته باشی،ولی حالا با #C خیلی راحت برای اون چیز هایی که به هم مرتبط می یای کلاس تعریف میکنی و چیزی که باهاش درگیر می شی تعداد زیادی شی از اون کلاس هاست.با این روش دستیابی به اون چیزی که می خوای خیلی راحت میشه.امیدوارم تونسته باشم کمکت کرده باشم .

mosini
چهارشنبه 21 فروردین 1387, 09:52 صبح
سلام
من خودم سوال دارم ؟
در DotNetPlatform بیس همه چیز Object است ! ؟
در سی و سی پ پ و .... بیس , پوینترهاست ؟
ممنون میشم که در فهم این موضوع کمکم کنید !
باسپاس

خب در مورد این که بیس همه چیز در #C شی است،شک نکن.شما کلا هر برنامه ای که می نویسی مجبوری از یه کلاس استفاده کنی.اینو بگم که مفهوم شی و کلاس ،درواقع جدا از هم نسیت.شی در واقع موجود جانداری است از کلاس بی جان خودش.یعنی یه کلاس در واقع ساختار کلی هست و شی نمود کاری آن در برنامه است.در واقع شما از طریق کلاس می تونی دسته بندی انجام بدی.همین.کلا دلیل بوجود اومدن متد و کلاس و namespace همین بوده.قبل ها که کلاس و شی استفاده نمی شد، شما با انبوهی از متغیر ها و توابع و پارامترها و نوع های بازگشتی سر و کار داشتی که به عبارتی پدرت در میومد تا بخواهی دید کلی روی برنامت داشته باشی،ولی حالا با #C خیلی راحت برای اون چیز هایی که به هم مرتبط می یای کلاس تعریف میکنی و چیزی که باهاش درگیر می شی تعداد زیادی شی از اون کلاس هاست.با این روش دستیابی به اون چیزی که می خوای خیلی راحت میشه.امیدوارم تونسته باشم کمکت کرده باشم .

mjzamani
چهارشنبه 04 اردیبهشت 1387, 17:33 عصر
سلام به همگی!
من یک Unmanaged DLL دارم که درواقع درایور یک دستگاه است که با استفاده از پورت سریال به کامپیوتر وصل می شود. میخوام با این دستگاه با استفاده از C# ارتباط برقرار کنم.
اما مشکل اینه که من نمی دونم که متدهاش چیه.:گریه:
آیا اصلا می تونم از این dll استفاده کنم؟:متفکر:
اگه امکانش هست چه جوری؟

silentrise
یک شنبه 08 اردیبهشت 1387, 02:37 صبح
سلام به همگی!
من یک Unmanaged DLL دارم که درواقع درایور یک دستگاه است که با استفاده از پورت سریال به کامپیوتر وصل می شود. میخوام با این دستگاه با استفاده از C# ارتباط برقرار کنم.
اما مشکل اینه که من نمی دونم که متدهاش چیه.:گریه:
آیا اصلا می تونم از این dll استفاده کنم؟:متفکر:
اگه امکانش هست چه جوری؟

دوست عزیز پست 5 و 6 رو نگاه کن !

mjzamani
دوشنبه 23 اردیبهشت 1387, 16:12 عصر
درسته من همین کار رو انجام دادم!
امّا مسئله ای که هست اینه که تابعی که من می خوام باهاش کار کنم، پارامتر پوینتر می گیره.
زمانی که من می خوام اونا فراخونی کنم توی C#.net خطای استفاده از حافظه و یه چیزی شبیه به این رو میده.
اگه بتونید کمکم کنید ممنون می شم.

silentrise
پنج شنبه 06 تیر 1387, 01:04 صبح
سلام
بعد از N وقت اومدم ! :خجالت:
دوست عزیز این واسه شروع کد زدن پوینتر !
اگه سوالی داری در خدمتم !
با سپاس