C# comment puis-je broches à un objet en mémoire sans sérialisation de l'objet?

Ok ici ça va, je suis en utilisant oracle ContentAccess bibliothèque en C#, la bibliothèque est programmé en C.

- Je utiliser certaines fonctions de la bibliothèque pour extraire du texte à partir de diffrent fichiers.
la bibliothèque c utilise asynchrone de la communication par des pointeurs de fonction (les Délégués).
j'ai 1 classe et 1 struct ce qui est nécessaire pour utiliser les fonctions, la structure est appelé BaseIO et contient des pointeurs de fonctions qui pointe vers mon code en C# pour lire des fichiers.
tout va bien, jusqu'à ce que la cli se déplace ma classe, et j'obtiens un MemoryAccessException.

ici, c'est la classe, la structure et la fonction de signature:

[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 est un enum avec des valeurs d'erreur.

IOTYPE est un enum avec des valeurs hexadécimales pour indiquer quoi faire avec la valeur pSpec.

DAFlags est un enum avec des valeurs hexadécimales pour indiquer la façon de traiter le fichier (Comme une archive, normal, ou détection automatique).

oke chaque chose fonctionne, et mes fonctions appelées sur le côté géré comme il se doit, mais après 1 passe, je reçois un MemoryException indiquant que l'objet a été déplacé dans la mémoire.

Je ne peux pas utiliser le regroupement parce que je ne peux pas utiliser un objet de Flux de données dans ma classe et ne pouvez pas faire un usage normal des délégués.

La bibliothèque ne regarde que le premier objet dans le FICHIER et qui est la structure BaseIO.

Ma question est, est-il possible d'épingler un objet en mémoire sans sérialisation de l'objet?

OriginalL'auteur Ronald | 2011-02-28