Avatar billede ssboisen Nybegynder
11. september 2006 - 10:36 Der er 6 kommentarer

Brug af C/C++ dll fil i C#

Hej,

Jeg står og skal benytte mig af en unmanaged dll fil der er skrevet i C++ eller C. Jeg har .dll, .lib og .h filen tilrådighed og har prøvet at benytte mig af fremgangsmåden i en artikel på codeproject.

Problemet opstår idet jeg prøver at benytte mig af en function i dll'en.

Jeg fanger følgende exception:

System.EntryPointNotFoundException: Unable to find an entry point named 'IsOnLin
eOk' in DLL 'USBC.dll'.
  at Win32.IsOnLineOk()

Fra guiden på codeproject ved jeg at det skyldes at extern "C" mangler i dll-filen og compileren kan derfor ikke finde functionen IsOnLineOk() i dll-filen. Problemet er at jeg som sagt ikke har source-koden til dll'en, så jeg kan ikke rette i den.

Hvordan kan jeg benytte mig af .dll filen?
Avatar billede ssboisen Nybegynder
11. september 2006 - 10:37 #1
For forståelsens skyld får i lige den kode jeg kører i C#:

using System;
using System.Runtime.InteropServices;

public class Win32
{
    [DllImport("USBC.dll")]
    public static extern bool IsOnLineOk();

    static void Main()
    {
        try {
        IsOnLineOk();
          } catch(EntryPointNotFoundException e) {
            Console.WriteLine(e.ToString());
        }
    }
}
Avatar billede coderdk Praktikant
11. september 2006 - 10:46 #2
Prøv med:

[DllImport("USBC.dll", EntryPoint="førstefunktion_i_h",ExactSpelling=false,CallingConvention=CallingConvention.Cdecl)]

og se om det virker... førstefunktion_i_h er den første funktion i .h-filen - du kan måske bruge dumpbin.exe for at se hvad dit entrypoint skal være...
Avatar billede ssboisen Nybegynder
11. september 2006 - 12:13 #3
Hej,

Det skal lige siges at dll'en er en controller til kommunikation med en robot via USB.

Jeg forsøgte tidligere at sætte entrypoint til en funktion (IsOnlineOk() (som jeg fandt m dumpbin -extract usbc.dll) ) et stykke inde i koden. Det fungerede umiddelbart som det skulle (jeg tjekkede om der var forbindelse til roboten via USB og fik false (robotten var ikke forbundet)).

Skulle det have nogen speciel effekt at det er den første funktion? ´
Avatar billede ssboisen Nybegynder
11. september 2006 - 12:15 #4
Hvilken effekt har ExactSpelling og CallingConvention? Dem benyttede jeg ikke da jeg satte EntryPoint til isonlineok()
Avatar billede coderdk Praktikant
11. september 2006 - 12:20 #5
Avatar billede ssboisen Nybegynder
11. september 2006 - 12:29 #6
Efter hvad jeg har kunnet læse mig frem til i guiden på codeproject er problemet at der i dllen ikke er benyttet extern "C", det medfører at compileren dekorerer funktionsnavnet til brug ved f.eks. operatoroverloading.

Er det muligt at det vil virke hvis jeg sætter ExactSpelling til false og derefter dropper at indsætte et entrypoint? Jeg kunne forestille mig at compileren selv kan finde entrypointet selvom jeg ikke har det eksakte funktionsnavn.

Grunden til at jeg spørger er at jeg ikke har mulighed for at teste det pt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester