C# wie kann ich die pin ein Objekt im Speicher ohne marshalling des Objekts?

Ok hier geht, ich bin mit oracle ContentAccess-Bibliothek in C#, die Bibliothek ist programmiert in C.

Ich verwende einige Funktionen aus der Bibliothek zum extrahieren von text aus verschiedenen Dateien.
die c-Bibliothek nutzt asynchrone Kommunikation von Funktionszeigern (Delegates).
ich habe 1 Klasse und 1 struct ist nötig, um die Funktionen, die Struktur, die aufgerufen wird BaseIO und enthält Funktionen, die Zeiger, die Punkte auf mein code in C# - Dateien Lesen.
alles ist gut, bis cli bewegt meine Klasse, und ich bekomme eine MemoryAccessException.

hier ist die Klasse, Struktur und Funktion, Unterschrift:

[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR CloseDelegate(IntPtr hfile);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR ReadDelegate(IntPtr hfile, IntPtr dataPtr, UInt32 size, IntPtr count);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR WriteDelegate(IntPtr hfile, IntPtr dataPtr, int size, IntPtr count);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR SeekDelegate(IntPtr hfile, int wFrom, int dwOffset);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR TellDelegate(IntPtr hfile, IntPtr dwOffset);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR GetInfoDelegate(IntPtr hfile, UInt32 dwInfoId, IntPtr pInfo);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR Seek64Delegate(IntPtr hfile, ushort wFrom, Int64 dwOffset);
[UnmanagedFunctionPointerAttribute(CallingConvention.Cdecl)]
public delegate DAERR Tell64Delegate(IntPtr hfile, Int64 dwOffset);

struct BaseIO
{
    public CloseDelegate IOCLOSEPROC;
    public ReadDelegate IOREADPROC;
    public WriteDelegate IOWRITEPROC;
    public SeekDelegate IOSEEKPROC;
    public TellDelegate IOTELLPROC;
    public GetInfoDelegate IOGETINFOPROC;
    public IntPtr IOOPENPROC;
    public Seek64Delegate IOSEEK64PROC;
    public Tell64Delegate IOTELL64PROC;
}

[StructLayout(LayoutKind.Sequential)]
class FILE
{
    public BaseIO baseIO;
    public Stream Source;
    public Stream Buffer;
}

[DllImport("sccda.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern DAERR DAOpenDocument(ref IntPtr phDoc, IOTYPE dwSpecType, FILE pSpec, DAFlags dwFlags);

DAERR ist ein enum mit Fehler Werten.

IOTYPE ist ein enum mit hex-Werte, die angeben, was zu tun mit dem Wert pSpec.

DAFlags ist ein enum mit hex-Werte, um anzuzeigen, wie zu behandeln ist, die Datei (Wie ein Archiv, normal, oder autodetect).

oke alles, was funktioniert, und meine Funktionen aufgerufen werden, die auf der verwalteten Seite, wie es sollte, aber nach ein 1-pass, bekomme ich eine MemoryException angibt, das Objekt wurde im Speicher verschoben.

Kann ich nicht nutzen, marshalling, denn dann kann ich nicht verwenden, ein Stream-Objekt in meiner Klasse und können nicht normal Delegierten.

Die Bibliothek sieht nur das erste Objekt in der DATEI, und das ist der struct BaseIO.

Meine Frage ist, ist es möglich, die pin ein Objekt im Speicher ohne marshalling des Objekts?

InformationsquelleAutor Ronald | 2011-02-28
Schreibe einen Kommentar