Avatar billede finger Nybegynder
19. juni 2003 - 11:44 Der er 8 kommentarer og
1 løsning

Legacy? import af C++ dll i C#

Hejsa.

Jeg har en håndfuld C++ dll'er som jeg vil benytte mig af i C#. Jeg har ikke selv skrevet Dll'erne men jeg har adgang til source koden. C++ er ikke liiiiige det sprog som jeg er bedst til. Det tager lang tid for mig at læse det igennem.
Anyway. Hvordan benytter jeg mig af disse Dll'er? hvordan importerer jeg dem, instantierer dem og hvordan kalder jeg metoder i dem?

Jeg har søgt rundt omkring på nettet og kan se jeg måske skal have gang i noget Unsafe code eller bruge P/Invoke som jeg ikke kender noget til.

Er der nogen der kan forklare logikken omkring det og fremholde nogle links med eksempler der virker?
Avatar billede finger Nybegynder
19. juni 2003 - 11:48 #1
det skal lige tilføjes at det ikke er COM kode jeg vil importere.
Jeg har også en fornemmelse af at det måske har noget at gøre med Legacy??
Avatar billede finger Nybegynder
19. juni 2003 - 12:37 #3
hmmm. jeg ledte nu efter lidt mere end bare et link.
Avatar billede erve Nybegynder
19. juni 2003 - 12:54 #4
Ude på linket er der flg eksempel. Er det ikke det du søger?
[C#]
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",  SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
Avatar billede finger Nybegynder
19. juni 2003 - 14:10 #5
jeg tror jeg har tydet mig frem til hvordan det skal laves, men jeg får en ryntime error hvor den siger at den ikke kan finde entrypoint for den funktion jeg vil kalde. Nogen der kan hjælpe?


her er fejlen:
---------------
System.EntryPointNotFoundException: Unable to find an entry point named LukOp in DLL PosEpson_com.dll.\r\n  at DLLImportTest.Form1.LukOp(Byte b)\r\n  at DLLImportTest.Form1.button1_Click(Object sender, EventArgs e) in form1.cs:line 95
---------------

og her er lidt af min kode:

-------------------
using System.Runtime.InteropServices;

public class Form1 : System.Windows.Forms.Form
{
[DllImport("PosEpson_com.dll", EntryPoint="LukOp", SetLastError=true,
            CharSet=CharSet.Unicode, ExactSpelling=true,
            CallingConvention=CallingConvention.StdCall)]
            public static extern string LukOp(byte b);


private void button1_Click(object sender, System.EventArgs e)
{
try
{
    byte b = 4;
    LukOp(b);

    MessageBox.Show("g");
}
catch(Exception ex)
{
    MessageBox.Show(ex.ToString());
}
}
--------------
Avatar billede finger Nybegynder
19. juni 2003 - 14:11 #6
jeg har også prøvet at lave en dump af dll'en og det ser ud til at metoden burde være der!

D:\ww>dumpbin -exports posepson_com.dll
Microsoft (R) COFF/PE Dumper Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file posepson_com.dll

File Type: DLL

  Section contains the following exports for PosEpson_com.dll

    00000000 characteristics
          0 time date stamp Thu Jan 01 01:00:00 1970
        0.00 version
          1 ordinal base
          13 number of functions
          13 number of names

    ordinal hint RVA      name

          1    0 000010D0 LibMain
        13    1 00001E30 OposFkt
          2    2 00001830 W?$ct:PosDrv$n()_
          3    3 00001840 W?$dt:PosDrv$n()_
          4    4 000018C0 W?HentInfo$:PosDrv$n(irnirn$WString$$)$DP_STATUS$$
        12    5 00001DB0 W?Konverter$:PosDrv$n(aq)a
        11    6 00001D40 W?Konverter$:PosDrv$n(rn$WString$$q)v
          6    7 00001B40 W?LukOp$:PosDrv$n(a)$DP_STATUS$$
          8    8 00001C40 W?Print$:PosDrv$n(rn$WString$$)$DP_STATUS$$
          7    9 00001BC0 W?PrinterKlip$:PosDrv$n(i)$DP_STATUS$$
          5    A 00001AB0 W?Skriv$:PosDrv$n(rn$WString$$rn$2$)$DP_STATUS$$
        10    B 00001D00 W?WriteString$:PosDrv$n($WBuffer$$)i
          9    C 00001CC0 W?WriteString$:PosDrv$n($WString$$)i

  Summary

        1000 .bss
        1000 .edata
        1000 .idata
        1000 .reloc
        3000 .rsrc
        2000 AUTO
        1000 DGROUP
Avatar billede kichian Nybegynder
23. juni 2003 - 12:45 #7
Det ser ud til at dit DLL indeholder et object PosDrv, som så indeholder funktionen LukOp().
Så du skal først instansiere et PosDrv-object og så kalde metoden på dette objekt..
Avatar billede finger Nybegynder
24. juni 2003 - 14:56 #8
Jeg fik det aldrig til at virke og eftersom der ikke var nogen der kunne hjælpe mig med spørgsmålet lukker jeg det nu.
Jeg har ordnet det på anden vis.
Avatar billede finger Nybegynder
25. juni 2003 - 09:31 #9
-
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