Hoe een DLL te maken die gebruikt zal worden in C #

Ik heb een ICOP VDX-6354-kaart met Win CE. Ik probeer de zoemer van het bord te besturen vanuit mijn C# -programma. Ik heb geprobeerd alle afspeelgeluiden enz. "Coredll.dll" platform aan te roepen. geen van hen werkte tot nu toe. Dus mijn laatste kans is om mijn eigen DLL te maken.

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

De bovenstaande code is beschikbaar in de datasheet van het bord. Ik wil het compileren als een DLL en het vervolgens in mijn C# -programma aanroepen

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

Ik heb een voorvoegsel als volgt gebruikt toen ik het compileerde:

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

Zodat hopelijk ik de zoemer zou kunnen controleren. Mijn probleem is dat ik er niet in zou slagen om het te compileren. Ik volgde de stappen hier maar het hielp mij niet.

Wat moet ik stap voor stap doen?

BEWERK:

Ik denk dat ik het DLL-bestand heb gebouwd. Ik heb een andere manier geprobeerd om het DLL-bestand hier te bouwen.

Nu heb ik de DLL gekopieerd naar de debugmap van mijn C# opstartproject (andere DLL's van het project bevinden zich ook in deze map). Vervolgens probeer ik MyBeep-functie op te roepen van MyBeep.DLL in mijn C# -project door:

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

Maar het geeft de volgende uitzondering.

Kan PInvoke DLL 'MyBeep.dll'.

niet vinden

Mis ik iets? Controleer de links hierboven gegeven dat ik vals speelde om het DLL-bestand te bouwen om te begrijpen wat ik tot nu toe heb gedaan. Vriendelijke groeten.

9
Welke compiler en platform?
toegevoegd de auteur flipchart, de bron
U kunt een dll niet starten voor foutopsporing (zonder een exe om het te hosten). In plaats van op de knop "Afspelen" (bijv. Foutopsporing) te klikken, vindt u de opdracht "Compileren zonder foutopsporing".
toegevoegd de auteur Sam Axe, de bron
uhm, nee. Dat is zo duidelijk als ik kan zijn. Succes.
toegevoegd de auteur Sam Axe, de bron
Wat is mislukt? Foutmeldingen? Hoe heb je gebouwd? Kortom, meer details alstublieft.
toegevoegd de auteur David Heffernan, de bron
+1 lijkt een zeer reële vraag, niet zeker waarom iemand heeft besloten te sluiten.
toegevoegd de auteur Chris Marisic, de bron
@ OğuzSezer - Als je hulp nodig hebt, plaats dan de fouten die door de compiler zijn opgegeven. Een goede eerste start zou zijn om te stoppen met proberen iets te debuggen dat geen applicatie is. We hebben meer informatie nodig ... zoals is ... deze vraag kan geen antwoord krijgen.
toegevoegd de auteur Security Hound, de bron
@ Oğuz Sezer - Als uw toepassing de DLL niet kan vinden, is deze niet op de juiste locatie. Waar zet je het op? Waarom probeer je het te registreren, dat hoef je niet te doen, dit is geen COM-bibliotheek.
toegevoegd de auteur Security Hound, de bron
het compileerde gewoon niet goed. Zoals ik in mijn vraag stelde, volgde ik stap voor stap een tutorial "how to". Toen ik probeerde te compileren, vroeg ik om "Executable for Debug Session". En het enige uitvoerbare bestand dat beschikbaar is in de dropbox is RegSvr32. Wanneer ik RegSvr32 kies en doorga, staat er in een afzonderlijk waarschuwingsscherm gebruik: regsrv32 [/ u] [/ s] [/ n] [/ i] enz. En het geeft geen enkele fout in de compiler.
toegevoegd de auteur Oğuz Sezer, de bron
Visual Studio 2005. leeg C ++ -project (DLL van het applicatietype).
toegevoegd de auteur Oğuz Sezer, de bron
@Boo Kan je duidelijker zijn, alsjeblieft, ik heb dit niet eerder gedaan.
toegevoegd de auteur Oğuz Sezer, de bron
@Ramhound VS geeft geen fouten. regsrv32-waarschuwingsscherm verschijnt en de compilatie stopt. Op het waarschuwingspop-upscherm staat het gebruik: regsrv32 [/ u] [/ s] [/ n] [/ i]. Misschien heeft iemand dit eerder gedaan, kan me vertellen hoe ik een DLL moet bouwen die zal worden gebruikt in C #
toegevoegd de auteur Oğuz Sezer, de bron
@Ramhound Ik heb de DLL gekopieerd naar de map Debug van mijn C# opstartproject (andere DLL's van het project staan ​​ook in deze map)
toegevoegd de auteur Oğuz Sezer, de bron

2 antwoord

Er zijn twee problemen die je hebt:

  1. Je moet de dll bouwen, niet proberen en debuggen. Als het zich in hetzelfde project als uw C# -project bevindt, stel dan het C# -project in als het startproject (klik met de rechtermuisknop op het projectbestand), anders moet u gewoon Build selecteren in plaats van Start Debugging (als u een snelkoppeling gebruikt) toetsen is dit waarschijnlijk Ctrl + Shift + B [bij gebruik van de C# -omgeving setup] of F7 [als u de C ++ -omgeving setup gebruikt]).

  2. U moet het DLL-bestand op de juiste locatie hebben. Als u dit wilt automatiseren, voegt u gewoon een post-buildstap toe aan het C ++ -project (projecteigenschappen, acties bouwen als ik me goed herinner en post-build), wat iets doet als kopiëren "$ (TargetPath)" "$ (SolutionDir) \ csproj \ bin \ $ (ConfigurationName) \ *. * "

Sommige van die macro's kunnen een beetje afwijken, maar u moet het algemene idee krijgen.

EDIT: Je moet ook ervoor zorgen dat je C ++ -project bouwt voor je C# -project. Klik met de rechtermuisknop op uw C# -projectbestand en ga naar Projectafhankelijkheden en vink vervolgens de C ++ -bibliotheek aan in het vak Afhankelijk van. Om er zeker van te zijn dat uw post-buildstap werkt, probeert u gewoon het C ++ -project zelf te bouwen en door het te controleren, kopieert u het DLL-bestand naar de juiste map in uw C# -project. Het zal fouten markeren in het outputvenster als dit niet het geval is. Als u die zelfstudie hebt gevolgd om een ​​DLL-bestand te maken, zou dit in orde moeten zijn.

1
toegevoegd
nee, nog steeds niet aan het werk ...
toegevoegd de auteur Oğuz Sezer, de bron

Hoewel de foutmelding anders aangeeft, moet u de naam van de geëxporteerde functie controleren. Voor Win32 gebruik ik altijd deze tool . Voor een CE-dll, misschien DUMPBIN/EXPORTS werkt.

De functon-naam wordt waarschijnlijk __ MyBeep genoemd: ik geloof dat dit voorvoegsel een C-conventie is.

0
toegevoegd