C # -де пайдаланылатын DLL жасау жолы

Менің Win CE-ді басқаратын ICOP VDX-6354 тақтасы бар. Мен 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-ді

C# стартап жобасының Debug папкасына көшірдім (Жобаның басқа DLL-лері де осы қалтада). Содан кейін MyBeep функциясын менің C# жобасында MyBeep.DLL шақыруға тырысамын:

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

Бірақ келесі ерекшелік береді.

'MyBeep.dll' PInvoke DLL таба алмады.

Мен бірдеңе жетіспеймін бе? Жоғарыда келтірілген сілтемелерді тексеріп шығыңыз, олар мен жасағанымды түсіну үшін DLL-ті құруға алданған едім. Құрметпен.

9
Қандай компилятор және платформа?
қосылды автор flipchart, көзі
DLL-ді отладтау үшін бастау мүмкін емес (оны exe-ке хосттаусыз). «Ойнату» (мысалы, «Debug») түймесін басу орнына «Отладтаусыз компиляциялау» пәрменін табыңыз.
қосылды автор Sam Axe, көзі
ухм, жоқ. Бұл мен сияқты болуы мүмкін, сондықтан айқын. Іске сәт.
қосылды автор Sam Axe, көзі
Не істемеді? Қате туралы хабарлар? Сіз қалай құрдық? Қысқаша айтқанда, толығырақ ақпарат.
қосылды автор David Heffernan, көзі
+1 нақты бір сұрақ сияқты көрінеді, неге біреу жабу үшін дауыс берді.
қосылды автор Chris Marisic, көзі
@ OğuzSezer - Егер сіз көмек алғыңыз келсе, онда берілген компилятор қателерді жіберіңіз. Алғашқы бастама - бұл қолданбайтын нәрсені түзетуді тоқтату. Бізге қосымша ақпараттар қажет ... бұл ... бұл сұраққа жауап берілмейді.
қосылды автор Security Hound, көзі
@ Огуз Сезер - Егер сізде қосымшаның таба алмасаңыз dll, онда ол дұрыс жерде орналасқан. Сіз оны қай жерге қойасыз? Неліктен оны тіркеуге тырысасыз, мұны істеудің қажеті жоқ, бұл COM кітапханасы емес.
қосылды автор Security Hound, көзі
бұл жай ғана сәтті құрастырылмады. Мен өзімнің сұрағымда айтқанымдай, мен «қалай үйренуге» қадам жасадым. Мен оны жинауға тырысқанда, «Орындалатын Debug Session үшін орындалатын» сұрады. Және dropbox ішіндегі жалғыз орындалатын файл - RegSvr32. Мен RegSvr32 таңдаған кезде және жалғастыруда, regsrv32 [/ u] [/ s] [/ n] [/ i] және т.б. пайдалану туралы айтады және бұл компиляторда ешқандай қате бермейді.
қосылды автор Oğuz Sezer, көзі
Visual Studio 2005. Бос C ++ жобасы (DLL бағдарламасының түрі).
қосылды автор Oğuz Sezer, көзі
@Boo Мүмкін, сіз анықырақ бола аласыз ба, мен мұны бұрын орындаған жоқпын.
қосылды автор Oğuz Sezer, көзі
@Ramhound VS ешқандай қате бермейді. regsrv32 ескерту экраны пайда болады және компиляция тоқтайды. Ескертудің қалқымалы экранында ол қолданылуын айтады: regsrv32 [/ u] [/ s] [/ n] [/ i]. Мүмкін, біреу оны C# -де қолданылатын DLL-ны қалай құруға болатынын айтқан еді
қосылды автор Oğuz Sezer, көзі
@Ramhound Мен C# стартап жобасының Debug қалтасына DLL көшіріп алдым (Жобадағы басқа DLL файлдары да осы қалтада)
қосылды автор Oğuz Sezer, көзі

2 жауаптар

Сізде екі мәселе бар:

  1. Dll-ді құру керек, оны сынап көрмейсіз. Егер сіздің C# жобасы сияқты жобада болса, C# жобасын іске қосу жобасы ретінде орнатыңыз (жобаның файлына тінтуірдің оң жағын басыңыз), егер болмаса, құрылысты бастауды емес, құрылысты таңдауға тура келеді (егер сіз төте жолды пайдаланып жатсаңыз) пернелерді Ctrl + Shift + B (C # ортасын орнатуды пайдалансаңыз) немесе F7 [C ++ ортасын орнатуды пайдалансаңыз]) болады.

  2. Сіз дұрыс жерде DLL болуы керек. Егер сіз оны автоматтандыруды қаласаңыз, онда C ++ жобасына (жоба сипаттары, дұрыс еске түсірсем, әрекеттерді құрастыру және кейіннен құрастыру) кейінгі қадамды қосыңыз, бұл copy «$ (TargetPath) сияқты» «$ (SolutionDir) \ CsProj \ bin \ $ (ConfigurationName) \ *. * «

Бұл макростардың кейбірі аз болуы мүмкін, бірақ жалпы идеяны алу керек.

EDIT: C ++ жобаңыздың C# жобасының алдында құрылуына көз жеткізуіңіз керек. C# жобасының файлын тінтуірдің оң жақ түймешігімен нұқыңыз және Project Dependences бөліміне өтіңіз, содан кейін C ++ кітапханасына Depends on box құсбелгісін қойыңыз. Сіздің кейінгі қадамыңыз жұмыс істеп тұрғанына көз жеткізу үшін, C ++ жобасын өз бетіңізбен жасаңыз және оны тексеріп, DLL файлын C# жобасындағы дұрыс каталогқа көшіріңіз. Егер ол болмаса, ол шығыс терезесінде қателерді белгілейді. Егер сіз DLL-ті жасау үшін осы оқулықты орындасаңыз, сізде жақсы болуы керек.

1
қосылды
жоқ, әлі жұмыс істемейді ...
қосылды автор Oğuz Sezer, көзі

Қате туралы хабарда басқаша айтылмаса да, экспортталған функцияның атауын тексеру керек. Win32 үшін әрқашан бұл құралды пайдаланады. CE dll үшін DUMPBIN/EXPORTS a> жұмыс істейді.

Функция атауы __ MyBeep деп аталады. Мен бұл префикс C конвенциясы деп есептеймін.

0
қосылды