C # da ishlatiladigan DLLni yaratish

Win CE bilan ishlovchi ICOP VDX-6354 kengash bor. Men C# dasturidan boshqaruv kengashining ovozini boshqarishga harakat qilaman. Barcha playsounds va shunga o'xshash "coredll.dll" platformasini sinab ko'rdim. ulardan hech biri hozirgacha ishlamagan. Shunday qilib mening so'nggi imkoniyatim o'z DLL faylini yaratishdir.

unsigned char inp(short addr)
{
    unsigned char cValue;
    _asm
    {
        mov dx, addr
        in ax, dx
        mov cValue, al
    }
    return cValue;
}
void outp(int addr, unsigned char val)
{
     __asm
    {
        push edx
        mov edx, DWORD PTR addr
        mov al, BYTE PTR val
        out dx, al
        pop edx
    }
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
    outp(0x43, 0xb6);//Set Buzzer
    outp(0x42, (0x1234dc/dwFreq));//Frequency LSB
    outp(0x42, (0x1234dc/dwFreq) >> 8);//Frequency MSB
    outp(0x61, inp(0x61) | 0x3);//Start beep
    Sleep(dwDuration);
    outp(0x61, inp(0x61) & 0xfc);//End beep
    return TRUE;
}

Yuqoridagi kodni taxta ma'lumot sahifasida topishingiz mumkin. Buni DLL sifatida kompilyatsiya qilishni istayman, keyin uni C# dasturida chaqiraman

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);

Men derazadan quyidagi prefiksdan foydalanardim:

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)

Umid qilamanki, men qo'ng'iroqchini boshqarish imkoniyatiga ega bo'lar edim. Muammo shundaki, men uni muvaffaqiyatli tuzib chiqa olmayman. Men bu yerda qadamlar ergashdim, lekin bu menga yordam bermadi.

Qadam-qadam nima qilishim kerak?

EDIT:

Men DLLni qurganman deb o'ylayman. bu erda topilgan DLLni yaratishning yana bir yo'lini sinab ko'rdim.

Endi DLLni C# boshlang'ich loyihasining disk raskadrovka papkasiga nusxalashdi (loyihaning boshqa DLLlari ham ushbu papkada joylashgan). Keyin, MyBeep funktsiyasidan MyBeep.DLL-dan C# loyihasida chaqirishga harakat qilaman:

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);

Lekin bu quyidagi istisnoga ega.

Pwdvoke DLL "MyBeep.dll" topilmadi.

Biror narsani yo'qotaymi? Yuqorida keltirilgan havolalarni tekshirib ko'rmoqchimanki, men hozirda nima qilganimni tushunish uchun DLLni yaratish uchun aldaganman. Hurmat bilan.

9
Qanday derleyici va platforma?
qo'shib qo'ydi muallif flipchart, manba
Nosozliklarni tuzatish uchun DLLni ishga tushirib bo'lmaysiz (uni exe-serverga joylashtirish uchun). "Play" (masalan, disk raskadrovka) tugmasini bosish o'rniga, "Disk raskadasiz kompilyatsiya" buyrug'ini toping.
qo'shib qo'ydi muallif Sam Axe, manba
yo'q, yo'q. Men bunga qodir bo'lganimdek ochiq. Omad.
qo'shib qo'ydi muallif Sam Axe, manba
Nima yutqazdi? Xato xabarlari bormi? Qanday qilib qurdingiz? Muxtasar qilib aytganda, ko'proq ma'lumot oling.
qo'shib qo'ydi muallif David Heffernan, manba
+1 juda muhim savolga o'xshaydi, nima uchun kimdir yopilishga rozi emas.
qo'shib qo'ydi muallif Chris Marisic, manba
@ OğuzSezer - Agar kompilyator taqdim xatolarni post keyin yordam bo'lsangiz. Ajoyib dastlabki ishga tushish, dastur bo'lmagan dasturni disk raskadrovka qilishga urinishni to'xtatishdir. ... bu savol javob berilmaydi biz yana informatin..as kerak.
qo'shib qo'ydi muallif Security Hound, manba
@ O'g'uz Sezer - Siz ariza o'ng joyda keyin uning emas, DLL topa olmasangiz. Qaerga qo'yasiz? Agar uni ro'yxatdan harakat qilmoqda Nima uchun, bu bir COM kutubxona emas, buni qilish kerak emas.
qo'shib qo'ydi muallif Security Hound, manba
u faqat muvaffaqiyatli kompilyatsiya qilmadi. Men savolimda aytib o'tganimdek, men "qanday qilib" o'rganishim kerakligini asta-sekin kuzatib qoldim. Men kompilyatsiya qilmoqchi bo'lganimda, "Debug sessiyasida bajarilishi mumkin" deb so'radi. Dropboxda mavjud bo'lgan yagona executable - bu RegSvr32. RegSvr32 ni tanlaganda va uni davom ettirganda, u alohida foydalanish uchun ogohlantiruvchi ekranda regsrv32 [/ u] [/ s] [/ n] [/ i] va hokazolarni ishlatadi va kompilyatorda hech qanday xato qilmaydi.
qo'shib qo'ydi muallif Oğuz Sezer, manba
Visual Studio 2005. bo'sh C ++ loyihasi (dastur turi DLL).
qo'shib qo'ydi muallif Oğuz Sezer, manba
@Boo Iltimos, aniqroq tushunishingiz mumkin, men bundan oldin qilmaganman.
qo'shib qo'ydi muallif Oğuz Sezer, manba
@Ramhound va boshqalar hech qanday xato qilmaydi. regsrv32 ogohlantirish ekrani ochiladi va kompilyatsiya to'xtaydi. Ogohlantirishning pop-up ekranda ishlatiladi: regsrv32 [/ u] [/ s] [/ n] [/ i]. Ehtimol, kimdir bundan oldin C# da ishlatiladigan DLLni yaratish haqida gapirib berishi mumkin edi.
qo'shib qo'ydi muallif Oğuz Sezer, manba
@Ramhound DLLni C# boshlang'ich loyihasining disk raskadrovka papkasiga nusxalashdi (loyihaning boshqa DLLlari bu papkada ham mavjud)
qo'shib qo'ydi muallif Oğuz Sezer, manba

2 javoblar

Sizda mavjud bo'lgan ikkita muammo bor:

  1. DLL tuzishingiz kerak, uni sinab va disk raskadrovka qilmang. C# loyihasi bilan bir xil loyihada bo'lsa, C# loyihasini boshlang'ich loyihasi sifatida belgilang (agar loyiha faylida o'ng tugmasini bosing), agar siz faqat tuzishni boshlash o'rniga Build ni tanlashingiz kerak bo'lsa (agar siz qisqa bu Ctrl + Shift + B [C # muhitini sozlashdan foydalanayotgan bo'lsangiz] yoki F7 [C ++ muhitini sozlashdan foydalanayotgan bo'lsangiz] bo'lishi mumkin).

  2. To'g'ri joyda DLL-ga ega bo'lishingiz kerak. Agar siz buni avtomatizatsiya qilishni istasangiz, u holda C ++ loyihasiga (loyiha xususiyatlari, to'g'ri xatolikni tuzsam, keyinchalik tuzilgan xatti-harakatlar tuzish) "code" copy "$ (TargetPath) (SolutionDir) \ CsProj \ bin \ $ (ConfigurationName) \ *. * "

Ushbu makrolardan ba'zilari biroz tashqariga chiqishi mumkin, lekin umumiy g'oyani olishingiz kerak.

E'tiroz: C ++ loyihangiz C# loyihasidan oldin tuzilganligiga ishonch hosil qilishingiz kerak. C# loyiha faylini o'ng tugmasini bosing va Project Dependencies-ga o'ting, so'ngra C ++ kutubxonasini "Depending on" qutisiga belgilang. Sizning post-build qadamingiz ishlashiga ishonch hosil qilish uchun, faqat C ++ loyihasini o'zingiz yaratib ko'ring va uni tekshiring DLLni C# loyihasidagi to'g'ri katalogga nusxa ko'chiring. U chiqmas oynada xatolarni belgilaydi. Agar siz DLL tuzish uchun ushbu qo'llanmani o'qirdingiz, siz OK bo'lishi kerak.

1
qo'shib qo'ydi
Yo'q, hali ham ishlamayapti ...
qo'shib qo'ydi muallif Oğuz Sezer, manba

Xato xabari aks etmasa ham, eksport qilingan funktsiyaning nomini tekshirishingiz kerak. Win32 uchun doimo ushbu vosita dan foydalaning. Idoralar dll uchun, ehtimol DUMPBIN/EXPORTS < a> ishlaydi.

Funktsiya nomi __ MyBeep deb nomlanadi. Men ushbu prefiksning C konvensiyasi deb hisoblayman.

0
qo'shib qo'ydi