PDA

View Full Version : استفاده از توابع Unmanaged dll در c#



smt1383
چهارشنبه 31 شهریور 1389, 09:59 صبح
با سلام خدمت دوستان
من می خواستم از توابع یک unmanaged dll در سی شارپ استفاده کنم. یکی از این توابع در آن dll بدین صورت است:


C/C++
int read (int portCode, char *buf, int len);

من این تابع را به صورت زیر در سی شارپ وارد کردم:


[DllImport("unmanaged.dll")]
public static extern int read(int portCode, char* buf, int len);

حال با توجه به اینکه پس از اجرای متد read نتایج را در یک متغیر از نوع char* میریزد من نمیدانم چگونه باید از این تابع استفاده کنم. من می خواهم هر تعداد کاراکتر که توسط دستور read خوانده شد در آرایه ای از کاراکترها برگردانده شود و نه در متغیری از نوع اشاره گر. ممنون می شوم اگر دوستان راهنمایی کنند

fjm11100
چهارشنبه 31 شهریور 1389, 13:40 عصر
میتونی از پوینتر هم استفاده کنی توی C# اگر نه باید یک متد کمکی توی C++ بنویسی و اونجا تبدیل کنی و توی c# استفاده اش کنی

smt1383
چهارشنبه 31 شهریور 1389, 14:04 عصر
به بدنه متدهای اجرا شده در c++ دسترسی ندارم. فقط فایل dll را در اختیار دارم و اینکه چه توابعی با چه ورودی خروجی هایی در آن تعریف شده است. اما ممکن است راهنمایی کنید در سی شارپ چگونه می شود تبدیل کرد؟ یعنی چگونه یک پوینتر تعریف کنم که به یک آرایه از جنس کاراکتر اشاره کند و این پوینتر را به عنوان ورودی به تابع read ارسال کنم به طوریکه مقادیر برگردانده شده توسط تابع read داخل آرایه ذخیره شود.

cheshm6k
چهارشنبه 31 شهریور 1389, 15:33 عصر
سلام .
اینجا : http://barnamenevis.org/forum/showthread.php?t=245471

مشابه مشکل شما پرسیده شده . باید ببینید C# پارامترهای ورودی تابع شما در dll رو به چه صورت میشناسه و نسبت به همون، نوع پارامتر رو انتخاب کنی.

موفق باشید.

smt1383
دوشنبه 05 مهر 1389, 16:12 عصر
با تشکر از دوستان
راحت ترین راهی که پیدا کردم استفاده از StringBuilder بود بدین ترتیب:


[DllImport("unmanaged.dll")]
public static extern int read(int portCode, StringBuilder sb, int len);

حال برای فراخوانی هم بدین ترتیب عمل می کنیم:


StringBuilder sb=new StringBuilder();
read(0,sb,16);
label1.text=sb.ToString();