Як стварыць DLL, якая будзе выкарыстоўвацца ў C #

У мяне ёсць ICOP VDX-6354 дошка пад кіраваннем Win CE. Я спрабую кантраляваць зумер дошкі з маёй C# праграмы. Я перакаштаваў усе PlaySound і г.д. «coredll.dll» платформы выкліканага праграмы. ні адзін з іх не працаваў да гэтага часу. Так што мой апошні шанец, каб стварыць свой уласны DLL.

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;
}

Прыведзены вышэй код даступны ў спецыфікацыі платы. Я хачу, каб скампіляваць яго як DLL затым выклікаць яго ў маёй праграме C#, як

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

Я выкарыстаў прэфікс наступным чынам, калі я склаў:

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

Так што, спадзяюся, я змагу кантраляваць зумер. Мая праблема ў тым, што я не магла быць паспяховай кампіляцыі. Я рушыў услед крокі тут , але гэта не дапамагло мне.

Што я павінен рабіць крок за крокам?

EDIT:

Я думаю, што я пабудаваў DLL. Я паспрабаваў іншы спосаб пабудаваць DLL знайсці тут .

Зараз, я скапіяваў DLL ў тэчку Debug майго C# загрузнага праекта (Іншыя бібліятэкі праекта таксама ў гэтай тэчцы). Тады я спрабую выклікаць функцыю MyBeep з MyBeep.DLL ў маім C# праекце:

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

Але гэта дае наступнае выключэнне.

<�Р> Не ўдаецца знайсці PInvoke DLL 'MyBeep.dll'.

Ці магу я што-то адсутнічае? Калі ласка, праверце спасылкі, прыведзеныя вышэй, што я падмануў пабудаваць DLL, каб зразумець, што я зрабіў да гэтага часу. З найлепшымі пажаданнямі.

9
Які кампілятар і платформа?
дададзена аўтар flipchart, крыніца
Вы не можаце стварыць DLL для адладкі (без ехе правесці яго). Замест націску на кнопку "Play" (напрыклад, Debug), знайсці «Кампіляцыя без адладкі" каманды.
дададзена аўтар Sam Axe, крыніца
ммм, няма. Гэта так жа ясна, як я здольны быць. Поспехаў.
дададзена аўтар Sam Axe, крыніца
Што не атрымалася? Паведамленні пра памылкі? Як вы будуеце? Карацей кажучы, больш дэталяў, калі ласка.
дададзена аўтар David Heffernan, крыніца
+1 здаецца вельмі рэальным пытаннем, не ведаю, чаму хтосьці прагаласаваў, каб закрыць.
дададзена аўтар Chris Marisic, крыніца
@ OğuzSezer - Калі вы хочаце дапамагчы, то выкладваюць памылкі, якія прадстаўляюцца кампілятары. Вялікае першае пачатак было б спыніць спробы адладзіць тое, што не з'яўляецца дадаткам. Нам трэба больш informatin..as гэта ... гэтае пытанне не можа быць дадзены адказ.
дададзена аўтар Security Hound, крыніца
@ Огуз Sezer - Калі прыкладанне не можа знайсці DLL, то яго не ў патрэбным месцы. Дзе вы пакласці яго? Чаму вы спрабуеце зарэгістраваць яго, вам не трэба рабіць, гэта не COM бібліятэка.
дададзена аўтар Security Hound, крыніца
ён проста не кампіляваць паспяхова. Як я ўжо казаў у маім пытанні, я рушыў услед за «як» падручнік крок за крокам. Калі я паспрабаваў скампіляваць яго папрасілі «выкананы файл для адладкі сесіі». І адзіны выкананы файл даступны на раздатачным з'яўляецца RegSvr32. Калі я выбіраю regsvr32 і па-ранейшаму, ён кажа, выкарыстанне: regsrv32 [/ u] [/ s] [/ п] [/ i] і да т.п. на асобным экране папярэджання і гэта не дае якой-небудзь памылкі ў кампілятар.
дададзена аўтар Oğuz Sezer, крыніца
Visual Studio 2005. пусты C ++ праект (дадатак тыпу DLL).
дададзена аўтар Oğuz Sezer, крыніца
@Boo Ці можаце вы быць больш ясным, калі ласка, я не рабіў гэтага раней.
дададзена аўтар Oğuz Sezer, крыніца
@Ramhound VS не дае якіх-небудзь памылак. regsrv32 экран папярэджання выскачыць і кампіляцыя спыняецца. На ўсплываючым акне папярэджання, ён кажа, што выкарыстанне: regsrv32 [/ u] [/ s] [/ п] [/ i]. Можа быць, хтосьці гэта зрабіў, перш чым можа сказаць мне, як пабудаваць DLL, якая будзе выкарыстоўвацца ў C #
дададзена аўтар Oğuz Sezer, крыніца
@Ramhound Я скапіяваў DLL ў тэчку Debug майго C# загрузнага праекта (Іншыя бібліятэкі праекта таксама ў гэтай тэчцы)
дададзена аўтар Oğuz Sezer, крыніца

2 адказы

Там дзве праблемы, якія вы атрымалі:

  1. Вам трэба пабудаваць бібліятэку DLL, а не спрабаваць і адладзіць яго. Калі гэта ў тым жа праекце, што і праект C# затым ўсталяваць C# праект як праект запуску (пстрыкніце правай кнопкай мышы на файле праекта), калі не, то вам проста трэба выбраць Пабудаваць замест Start Debugging (калі вы выкарыстоўваеце ярлык ключы гэта, верагодна, будзе Ctrl + Shift + B [пры выкарыстанні # асяроддзя C ўстаноўкі] або [F7, калі вы выкарыстоўваеце C ++ налады асяроддзя]).

  2. Вы павінны мець DLL ў патрэбным месцы. Калі вы хочаце аўтаматызаваць гэты працэс, то проста дадаць крок пасля зборкі для праекта C ++ (ўласцівасці праекта, пабудаваць дзеянні, калі я правільна памятаю, і пасля зборкі), які робіць нешта накшталт Копія «$ (TargetPath)» «$ (SolutionDir) \ CsProj \ Bin \ $ (ConfigurationName) \ *. * "

Некаторыя з гэтых макрасаў могуць быць трохі прэч, але вы павінны атрымаць агульнае ўяўленне.

EDIT: Акрамя таго, неабходна пераканацца, што ваш праект C ++ будуе да вашага праекта C #. Пстрыкніце правай кнопкай мышы на файле # праекта C, і перайсці да Project залежнасцямі, то адзначце бібліятэку C ++ у Depends на скрынцы. Для таго, каб пераканацца, што ваш крок пасля зборкі працуе толькі паспрабаваць будаўнічы праект C ++ самастойна і праверкі яго капіюе DLL ў патрэбны каталог ў праекце C #. Гэта будзе памылка сцяга ў акне вываду, калі гэта не так. Калі вы вынікалі гэтаму падручніку, каб стварыць DLL, вы павінны быць у парадку.

1
дададзена
Неа, да гэтага часу не працуе ...
дададзена аўтар Oğuz Sezer, крыніца

Нават калі паведамленне пра памылку кажа пра адваротнае, вы павінны праверыць імя экспартуемай функцыі. Для Win32 я заўсёды выкарыстоўваю гэтага інструмента . Для DLL CE, магчыма, Dumpbin/ЭКСПАРТ </а> працуе.

Імя functon, хутчэй за ўсё, будзе называцца __ MyBeep : Я лічу, што гэты прэфікс З умоўнасцю.

0
дададзена