03. januar 2012 - 15:48Der 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
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
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)?
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.
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.
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 :-)
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)
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.
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.