2009-11-13 1 views
2

Quel est le meilleur moyen d'obtenir un morceau de mémoire (par exemple, void *) d'un serveur COM vers C#?Obtention d'un tableau d'octets hors de processus C++ COM vers C#

Nous avons utilisé un IStream (en utilisant CreateStreamOnHGlobal) et en le renvoyant, ce qui a fonctionné. Cependant, lorsque nous avons essayé cela sur x64 CLR avec x32 C++ COM, il explose.

Le COM doit être x32 car il utilise des DLL externes de 32 bits. Le C# pourrait être forcé à fonctionner en 32 bits, mais le défi est de continuer à tourner en x64.

Répondre

1

Répondre à ma propre question. Lorsque vous renvoyez un IStream à partir de votre propre serveur COM, la DLL d'interopérabilité .NET place un IStream dans son interface. Par exemple, disons que la bibliothèque de type est MyComServer, alors l'interop accueillera une classe MyComServer.Interop.IStream.

Cette classe IStream possède des fonctions telles que RemoteRead, RemoteWrite, etc. Elles prennent un octet de référence comme premier paramètre. Utilisation de ceux-ci a bien fonctionné sur 32 bits à 32 bits, mais cette référence devient probablement un pointeur et ainsi de suite 64 à 32 quelque chose a mal tourné.

La solution consiste à convertir le fichier MyComServer.Interop.IStream en System.Runtime.InteropServices.ComTypes.IStream en utilisant "as" (ou juste cast probablement). Cela prend alors un octet plus familier [], int count et IntPtr pour la taille de retour.

Le IntPtr est ennuyeux car il pourrait être un hors int, mais j'utilisé (en tapant ceci dans la main afin de ne pas compilateur vérifié ..)

byte[] buffer = new byte[100]; 
IntPtr ptr = Marshall.AllocHGlobal(sizeof(int)); 
stream.Read(buffer, 100, ptr); 
0

Si vous avez .NET 3.5, jetez un oeil à System.IO.Pipes - créez un nom de pipe bien connu et faites-le passer du code non géré avec le Win32 named pipes APIs.

+0

Malheureusement, nous sommes sur .NET 2.0 (encore parfois des clients n'aime toujours pas avoir à installer 3.5 - quand Windows 7 sera le plus utilisé, les gens ne l'installeront pas. – MrPurpleStreak