Hej, long i vb betyder att du ska ha int i C# och antagligen UnmanagedType.I4 Hej Simon, sen kan man ju googla också.. kolla ifall du hittar nåt vettigt här: http://www.webforum.nu/printthread.php?t=149943&page=2&pp=25 Hej Simon, Importera C++ dll till C#
Jag hoppas att jag valde rätt forum för mig fråga, i annat fall ber jag om ursäkt.
Jag behöver importera en dll som är skriven i C++ för att använda dess funktioner i C#. För att importera en funktion som heter AdkClose från denna dll har jag gjort såhär:
[DllImport("Adk.dll")]
public static extern void AdkClose();
Detta verkar fungera bra så till vida att jag kan anropa funktionen utan att några exceptions slängs. Jag antar alltså att det gick bra att importera AdkClose. När jag sedan ska importera funktionen AdkOpen som är lite mer komplicerad (den returnerar en struct) och tar två strängar som input gör jag på följande sätt:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 2)]
public struct ADK_ERROR {
[MarshalAs(UnmanagedType.I8)]
public long lRc;
[MarshalAs(UnmanagedType.I8)]
public long lDbTable;
[MarshalAs(UnmanagedType.I8)]
public long lField;
[MarshalAs(UnmanagedType.I8)]
public long lFunction;
[MarshalAs(UnmanagedType.I8)]
public long lProgramPart;
}
[DllImport("Adk.dll")]
public static extern ADK_ERROR AdkOpen(String systemPath, String companyPath);
Först deklarerar jag alltså structen som AdkOpen kommer returnera och sedan importerar jag funktionen AdkOpen. När jag sedan anropar AdkOpen får jag dock ett System.EntryPointNotFoundException. Jag antar att detta är tänkt att betyda att AdkOpen inte finns i dllen?
Jag har ett exempel på hur man ska imporera de två funktionerna i Visual Basic och då ser det ut såhär:
Public Type ADKERROR
lRc As Long
lDbTable As Long
lField As Long
lFunction As Long
lProgramPart As Long
End Type
Public Declare Function AdkOpen Lib "adk.dll" _
Alias "_AdkOpen@8" (ByVal pszSystemPath As String, _
ByVal pszFtgPath As String) As ADKERROR
Public Declare Function AdkClose Lib "adk.dll" _
Alias "_AdkClose@0" () As Long
Jag har inte någon vidare koll på VB syntax och har därför svårt att översätta ovanstående till C#. Tex. vet jag inte vad @8 innebär i Alias "_AdkOpen@8" och heller inte varför AdkOpen föregås av ett understreck. Jag vet att de båda funktionerna (AdkOpen och AdkClose) finns deklarerade utan några understreck i dllen och ett slags bevis på det är att jag i C# kan köra raden public static extern void AdkClose(); men om jag kör public static extern void _AdkClose(); får jag ett System.EntryPointNotFoundException.
Om någon kan hjälpa mig med att lista ut varför jag misslyckas med att importera AdkOpen skulle jag bli väldigt glad. Tack på förhand för hjälpen.
/Robert KajicSv: Importera C++ dll till C#
Sv:Importera C++ dll till C#
Tack för ditt svar. Jag ändrade i deklarationen för min struct till följande:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 2)]
public struct ADK_ERROR {
[MarshalAs(UnmanagedType.I4)]
public int lRc;
[MarshalAs(UnmanagedType.I4)]
public int lDbTable;
[MarshalAs(UnmanagedType.I4)]
public int lField;
[MarshalAs(UnmanagedType.I4)]
public int lFunction;
[MarshalAs(UnmanagedType.I4)]
public int lProgramPart;
}
Tyvärr gjorde det här varken från eller till för mitt nuvarande problem. Jag får fortfarande samma System.EntryPointNotFoundException. Jag antar dock att jag hade fått problem med min dåligt deklarerade struct senare (om jag nu lyckas importera AdkOpen) och förhoppningsvis slipper jag det nu när jag ändrat i structen.
/Robert KajicSv: Importera C++ dll till C#
Sv:Importera C++ dll till C#
Tack så jättemycket för hjälpen. Borde som du själv säger ha googlat men av någon anledning kände jag att mitt problem var såpass specifikt att jag inte visste vad jag skulle söka efter. Nu har jag iaf. kommit vidare och tom. lyckats ansluta till SPCS.
/Robert Kajic