Question

Je dois passer un InParameter de mon application C # à une fonction exportée à partir d'une DLL VC ++. La fonction accepte 2 paramètres:

int func_name (FILE* fp, BYTE& by);

fp est entré et par est le paramètre Out.

Je pensais au marshaling en utilisant IntPtr pour FILE * et en utilisant octet pour BYTE . Est-ce correct? Si j'écris ce qui suit en C #

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

ça va marcher? Je pense que cela donnera une erreur pour le '& amp;' signer dans la déclaration de marshaling. Comment passer le paramètre out par référence?

Votre aide serait grandement appréciée.

Merci Viren

Était-ce utile?

La solution

Si la fonction native attend une référence, vous pouvez la diriger en l’utilisant ref / out. Donc, dans votre situation, vous pourriez utiliser: octet par . Je l'ai vérifié et cela fonctionne pour moi.

Modifier à nouveau: Cela m'est venu à l'esprit que les conseils que je vous avais donnés ne fonctionneraient pas, car FILE est une structure, vous ne serez pas en mesure de commander à partir de c # aussi facilement. Donc, si vous les utilisez, vous pouvez utiliser cette approche si vous menacez SafeFileHandle en tant qu'objet HANDLE dans votre bibliothèque non gérée. Si vous ne pouvez pas modifier cette dll, une solution consiste à créer votre propre wrapper pour la création de fichiers à l’aide de stdio. Elle pourrait ressembler à ceci:

  1. Créez une bibliothèque qui expose les fonctionnalités de fopen, fclose, etc. Fe. (en c ++):
    FILE* CreateFile(char* name);
  2. Marhall cette fonction, dans cet exemple, vous utiliseriez (c #):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. Transférez tous les paramètres FILE * dans IntPtr, puis transmettez le résultat de la fonction CreateMyFile en tant que FILE *.

Autres conseils

Non, cela ne fonctionnera pas comme prévu.

  1. Où allez-vous obtenir un FILE * dans un programme C #? À moins qu'une autre fonction de votre dll non gérée ne vous donne ce pointeur, vous avez des problèmes. En passant, je vous recommande vivement de placer ce FILE * dans un SafeHandle ; alors votre signature p / invoke utilisera un SafeFilePointer au lieu d'un IntPtr .
  2. Combien d'octets êtes-vous en train de marshaler? Si seulement un, insérez octet par dans la signature gérée (aucun attribut requis).
  3. Vous n'avez pas besoin de spécifier de jeu de caractères, car vous ne marshalez pas de char ni de chaîne s.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top