PDA

View Full Version : سوال: فراخواني dll نوشته شده VB6 در #C



MohammadGh2011
یک شنبه 28 خرداد 1391, 23:01 عصر
سلام عليکم
براي مثال من يه تابع نوشتم در ويژوال بيسيک 6 حالا از اون تابع خروجي Dll گرفتم و ميخوام از اون تابع در سي شارپ هم استفاده کنم.لطفا به طور کامل راهنمايي کنيد.



ممنون

Sirwan Afifi
یک شنبه 28 خرداد 1391, 23:19 عصر
یادمه توی یکی از پارت های آموزش سی شارپ AppDev (http://www.appdev.com) به صورت کامل توضیح داده بود همراه با مثال.

مرتضی تقدمی
دوشنبه 29 خرداد 1391, 00:28 صبح
سلام
فکر نمی کنم مشکلی داشته باشه.

MohammadGh2011
دوشنبه 29 خرداد 1391, 09:48 صبح
سلام
ببينيد دوستان من ميتونم اون Dll رو وارد سي شارپ کنم ولي چه طوري با چه دستوراتي از اون استفاده کنم؟

Sirwan Afifi
دوشنبه 29 خرداد 1391, 13:56 عصر
خوب کافیه Using کنی و بعد از توابعش استفاده کنی.

MohammadGh2011
دوشنبه 29 خرداد 1391, 14:12 عصر
سلام جناب Sirwan Afifi
همين کار رو انجام دادم نميشه.يا نه من نميتونم
براي مثال اسم تابع ما gh من اون رو وارد رفرنس کردم و تو دستورات نوشتم
using gh;
و بعد تو يه کامند نوشتم .gh گزينه هاي زير ظاهر ميشه
gh.Class1Class
gh.Class1

و ازش object هم ساختم نشد.


لطفا کامل تر مراحل کار رو توضيح بديد.

tooraj_azizi_1035
دوشنبه 29 خرداد 1391, 15:58 عصر
سلام


using System.Runtime.InteropServices;
using System;

class call_dll {

[StructLayout(LayoutKind.Sequential, Pack=1)]
private struct STRUCT_DLL {
public Int32 count_int;
public IntPtr ints;
}

[DllImport("mingw_dll.dll")]
private static extern int func_dll(
int an_int,
[MarshalAs(UnmanagedType.LPArray)] byte[] string_filled_in_dll,
ref STRUCT_DLL s
);

public static void Main() {

byte[] string_filled_in_dll = new byte[21];


STRUCT_DLL struct_dll = new STRUCT_DLL();
struct_dll.count_int = 5;
int[] ia = new int[5];
ia[0] = 2; ia[1] = 3; ia[2] = 5; ia[3] = 8; ia[4] = 13;

GCHandle gch = GCHandle.Alloc(ia);
struct_dll.ints = Marshal.UnsafeAddrOfPinnedArrayElement(ia, 0);

int ret=func_dll(5,string_filled_in_dll, ref struct_dll);

Console.WriteLine("Return Value: " + ret);
Console.WriteLine("String filled in DLL: " + System.Text.Encoding.ASCII.GetString(string_filled _in_dll));

}
}

MohammadGh2011
دوشنبه 29 خرداد 1391, 17:14 عصر
سلام عليکم
دوست عزيز چي شد يه توضيح بديد چي کار کنم.

MohammadGh2011
سه شنبه 30 خرداد 1391, 22:41 عصر
دوباره سلام
دوستان لطفا يکي يه راهنمايي درست و حسابي بکنه.
اگه ميشه يکي از دوستان که با وي بي 6 هم کار ميکنه يه Dll ساده اي بسازه بعد تو سي شارپ فراخوانيش کنه اگه شد به ما هم اطلاع بده.
مثلا اين دي ال ال (http://s3.picofile.com/file/7412173652/gh.rar.html) که خودم نوشتم خيلي ساده اس ولي نميشه فراخوانيش کنم تو سي شارپ.


خيلي ممنون

barnamenevisforme
چهارشنبه 31 خرداد 1391, 09:02 صبح
سلام

با توجه به آنچه که از دوست عزیزمون آقای tooraj_azizi آموختم،بعضی از dllها در c# و بعضی از اونها در vb.net به عنوان refrence اضافه نمیشوند ولی در دیگری میشوند.
در چنین حالتی ما باید در زبانی که addrefrence امکان پذیر است یک کلاس تعریف کنیم و بعد تک تک متد ها ی dll مبدا رو با آرگومان هاش تعریف کنیم.نتیجه میشه یه dll جدید که حالا در هر دو محیط ازش میشه استفاده کرد.به این میگن مزیت محیط dotnet
88492

MohammadGh2011
چهارشنبه 31 خرداد 1391, 09:48 صبح
سلام عليکم
خيلي ممنونم از شما دوست عزيز ولي اين کدي که داديد براي VB.Net بود لطفا سورس سي شارپ ش رو هم بگذاريد.منتظرم

barnamenevisforme
چهارشنبه 31 خرداد 1391, 15:36 عصر
سلام
دوست عزیز در محلولی(solution) که ضمیمه کردم،اول اومدم dll شما رو در محیط vb.net اضافه کردم،توابع اون رو در یک کلاس تعریف کردم،dll جدید به دست اومد.یه پروژه cs test که با C#‎ هست و یه پروژه vb test که با vb.net هست در اون قرار داره.
در واقع محلول ترکیبی از سه پروژه هست و dll تبدیل شده رو در هر کدوم از زبان های .net میتونید استفاده کنید.
واسه دیدن نتیجه در c# در solution explorer روی cs test راست کلیک کنید و set as startup project رو انتخاب و بعد run کنید.

MohammadGh2011
چهارشنبه 31 خرداد 1391, 16:07 عصر
سلام ممنون
ولي اين وسط VB.Net چيکارست،ميشه بدون وي بي دات نت اين کارها رو انجام داد؟!!

MohammadGh2011
چهارشنبه 31 خرداد 1391, 16:11 عصر
آقا درست شد
من فقط dll رو تو سي شارپ اضافه کردم و تو يه کامند دستور زير رو نوشتم:
gh.Class1 mohamad = new gh.Class1();
mohamad.Msg("hg");

:اشتباه::متعجب::خجالت::متفکر: