Avatar billede simsen Mester
03. januar 2012 - 15:48 Der er 13 kommentarer og
1 løsning

Platform invoke [DllImport("ri.dll")]

Hej,

Jeg har et program, hvor programudbyder har lavet en wrapper til pc (C# VS framework 2.0)....Den har en test eksempel (som burde køre) hvis altså man har programmet (navigationsprogram) kørende....

Godt så langt - jeg har programmet kørende og kan se i Programmer(x86)\Programnavnet\ at der også ligger en ri.dll fil.....

Nu vil jeg så fra wrapperen køre wrapperen men får hele tiden en fejlmeddelelse, der siger at den ikke kan finde ri.dll...

Jeg kan se i programmet den bruger ri.dll hele tiden f.eks.;

[DllImport("ri.dll")]
        public static extern int RI_GetDLLVersion();

Det programudbyderen har sagt til mig, er at at jeg skal installere programmet og køre det - så vil den finde filen....jeg har installeret programmet (ikke 127 gange men tæt ved) og kører programmet når jeg forsøger at tilgå filen....uden held.....

Jeg har forsøgt at lægge ri.dll filen i bin (både release og debug) folderen på wrapperen....uden held.

Da jeg ikke har en hujende fis forstand på Platform invoke - så håber jeg én herinde kan fortælle mig, hvor jeg skal lægge ri.dll henne på maskinen, så mit program kan finde den?

Hvis det er til nogen hjælp - kører jeg Windows7 64 bit version
Avatar billede runesoft Nybegynder
03. januar 2012 - 17:40 #1
Hvis det er en com dll, skal du nok have registreret dll'en.  prøv "regsvr32 ri.dll"  eller hvis det er en 32 bit dll så brug den der ligger i c:\windows\syswow64\regsvr32.exe
Avatar billede arne_v Ekspert
03. januar 2012 - 17:50 #2
Du kan faktisk angive fuld sti i DllImport !
Avatar billede bvli Praktikant
04. januar 2012 - 03:51 #3
Har ri.dll evt nogle afhængigheder du ikke får kopieret med over? Prøv evt at smide programmets installationsbibliotek i libpath.
Avatar billede simsen Mester
04. januar 2012 - 08:29 #4
runesoft

Jeg har forsøgt begge og begge får jeg følgende fejlmeddelelse: Modulet blev indlæst men indsætningspunktet DllRegisterServer blev ikke fundet.

Arne

Jeg brugte så:
[DllImport("C:\\Program Files (x86)\\truck navigator 5\\ri.dll")]

Med din tilgang får jeg så en ny fejlmeddelelse:

System.BadImageFormatException: Det blev forsøgt at indlæse et program med et forkert format.

bvli
Jeg er fuldstændig tumpet ..... hvor og hvordan og hvorledes er libpath (er det bin mappen?) - og skal jeg bare kopiere installations mappen i den mappe (jeg ikke er klar over hvad du mener)?
Avatar billede bvli Praktikant
04. januar 2012 - 10:17 #5
Libpath er en environment variable der specificerer directories hvor .net leder efter .dll'er når den skal lave p/invoke. Og resultatet ville sikkert blive det samme, som det du får når du refererer den direkte. Selvom lige præcis den fejlmeddelelse lyder lidt suspekt.

Du bør nok smide stacktrace'en med også, så vi kan se hvad/hvor det fejler.

Du kan/skal  ikke bruge regsvr23, da de jo ikke er com-interop du laver.
Avatar billede simsen Mester
04. januar 2012 - 10:18 #6
Jeg vender frygtelig tilbage...

Som skrevet til Arne, så virkede det ikke ved brug af deres test projekt....

Jeg forsøgte mig selv så med mit eget program og brugte så en metode, de ikke havde i deres test projekt...og nu kører den.

MEN det er ikke holdbart - jeg kan jo ikke skrive den absolutte sti ind og så håbe, at brugerne har installeret den i default mappen (som jeg har gjort). De kan jo sagtens have installeret den i en anden mappe.
Avatar billede bvli Praktikant
04. januar 2012 - 10:21 #7
I øvrigt er denne artikel ret lærerig mht interop - den er skrevet i forbindelse med mono - men det meste er mindst lige så brugbart i MS .net.

http://www.mono-project.com/Interop_with_Native_Libraries
Avatar billede simsen Mester
04. januar 2012 - 10:50 #8
bvli
Jeg skal have alting skåret ud i pap ;-)

Det du kalder libpaths - er det det samme som Reference Paths - som jeg finder ved at højreklikke på projektet og vælge Properties.

Hvis ja, så har jeg forsøgt dette uden held. Hmmm det skal siges, jeg forsøgte jo selvfølgelig ved deres test projekt, så kan være det faktisk også virker, hvis jeg forsøger med min egen metode.

Tak for linket - det vil jeg sætte mig ned og læse :-)
Avatar billede bvli Praktikant
04. januar 2012 - 11:01 #9
Nej det er det ikke. Det er en måde runtime'n resolver på.

Du har ret du ikke skal hardcode stien til dll'en. Du skal kopiere alle de .dll'er du skal bruge fra programmet til dit eget programs afviklingsbibliotek. (altså nrå du debugger så til <projektnavn>\bin\debug)
Avatar billede simsen Mester
04. januar 2012 - 14:47 #10
bvli

Det forsøgte jeg allerførst og så ville det ikke køre. Men måske det har noget at gøre med at programmet SKAL køre for at jeg kan tilgå dll filen? Og så er det jo ikke den samme dll fil programmet og mit program har fat i?

Altså jeg starter programmet op - som ligger i:

C:\\Program Files (x86)\\truck navigator 5\\

Også der ri.dll'en ligger.

Når jeg så hard koder stien ind i mit program, så vil den godt køre fra mit program.

Hvis jeg kører programmet og ligger ri.dll'en i min bin folder (og fjerner stien til ri.dll), så vil den IKKE køre fra mit program.
Avatar billede arne_v Ekspert
05. januar 2012 - 02:11 #11
Koerer den hvis den ligger i et dir i gode gamle PATH environment variabel? (uden dir angivelse i DllImport)
Avatar billede simsen Mester
05. januar 2012 - 11:56 #12
Arne

Det hjalp heller ikke :-(
Avatar billede simsen Mester
09. januar 2012 - 08:06 #13
Lukker den lige - har opgivet for nu (vender måske frygtelig tilbage).

bvli og Arne gider i smide et svar - så får I lov til at dele pointsene og tak fordi I har gidet forsøge at hjælpe mig :-)
Avatar billede arne_v Ekspert
15. januar 2012 - 03:59 #14
ok
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