minos5000
2008-09-02, 17:09:50
Hi,
ich benötige für ein C# Programm zugriff auf eine unmanaged DLL und habe nun das Problem, dass sich die Anwendung beim Aufruf der aus der DLL importierten Funktion aufhängt. Ich habe die Theorie, dass die DLL Probleme hat mit der Referenz die ich beim Aufruf übergebe.
Ich habe bisher noch nie was mit Marshalling gemacht und wollte die Profis hier bitten sich meine C# Structs mal anzusehen, ob darin ein Fehler ist.
Die Originalstructs aus den zur DLL gehörigen Headerdateien und der Aufruf der Funktion sehen so aus:
struct SWI_STRUCT_ApiStartup
{
unsigned long sizeStruct;
SWI_STRUCT_Logging sLogging;
};
struct SWI_STRUCT_Logging
{
unsgined long sizeStruct;
TCHAR szFileName[LENGTH_LogFileName];
bool bEnable;
};
SWI_API SWI_RCODE SwiApiStartup(SWI_STRUCT_ApiStartup *pOpenParams);
Und hier meine Versuche, das ganze unter C# zum laufen zu bekommen:
[StructLayout(LayoutKind.Sequential)]
public struct SWI_STRUCT_ApiStartup
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 sizeStruct;
public SWI_STRUCT_Logging sLogging;
}
[StructLayout(LayoutKind.Sequential)]
public struct SWI_STRUCT_Logging
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 sizeStruct;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] szFileName;
public bool enabled;
}
public enum SWI_TYPE_Device{...}
[DllImport(@"c:\\SwiApiInterface.dll")]
public static extern SWI_RCODE SwiApiStartup(ref SWI_STRUCT_ApiStartup sOpenParams);
Besten Dank
minos
ich benötige für ein C# Programm zugriff auf eine unmanaged DLL und habe nun das Problem, dass sich die Anwendung beim Aufruf der aus der DLL importierten Funktion aufhängt. Ich habe die Theorie, dass die DLL Probleme hat mit der Referenz die ich beim Aufruf übergebe.
Ich habe bisher noch nie was mit Marshalling gemacht und wollte die Profis hier bitten sich meine C# Structs mal anzusehen, ob darin ein Fehler ist.
Die Originalstructs aus den zur DLL gehörigen Headerdateien und der Aufruf der Funktion sehen so aus:
struct SWI_STRUCT_ApiStartup
{
unsigned long sizeStruct;
SWI_STRUCT_Logging sLogging;
};
struct SWI_STRUCT_Logging
{
unsgined long sizeStruct;
TCHAR szFileName[LENGTH_LogFileName];
bool bEnable;
};
SWI_API SWI_RCODE SwiApiStartup(SWI_STRUCT_ApiStartup *pOpenParams);
Und hier meine Versuche, das ganze unter C# zum laufen zu bekommen:
[StructLayout(LayoutKind.Sequential)]
public struct SWI_STRUCT_ApiStartup
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 sizeStruct;
public SWI_STRUCT_Logging sLogging;
}
[StructLayout(LayoutKind.Sequential)]
public struct SWI_STRUCT_Logging
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 sizeStruct;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] szFileName;
public bool enabled;
}
public enum SWI_TYPE_Device{...}
[DllImport(@"c:\\SwiApiInterface.dll")]
public static extern SWI_RCODE SwiApiStartup(ref SWI_STRUCT_ApiStartup sOpenParams);
Besten Dank
minos