C#: Comment faire pour passer la valeur null à une fonction attend un ref?
J'ai la fonction suivante:
public static extern uint FILES_GetMemoryMapping(
[MarshalAs(UnmanagedType.LPStr)] string pPathFile,
out ushort Size,
[MarshalAs(UnmanagedType.LPStr)] string MapName,
out ushort PacketSize,
ref Mapping oMapping,
out byte PagesPerSector);
Qui je voudrais l'appeler comme ceci:
FILES_GetMemoryMapping(MapFile, out size, MapName,
out PacketSize, null, out PagePerSector);
Malheureusement, je ne peux pas passer null
dans un champ de type ref Mapping
et pas de casting que j'ai essayé corrige ce.
Des suggestions?
- Double Possible de Comment dois-je traiter en option C++ dll struct arguments en C#
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que la Cartographie est une structure? Si oui, vous pouvez avoir deux versions de la
FILES_GetMemoryMapping()
prototype avec des signatures différentes. Pour la deuxième surcharge où vous souhaitez passernull
, rendre le paramètre d'uneIntPtr
et l'utilisationIntPtr.Zero
Appel exemple:
Si la Cartographie est en fait une classe au lieu d'une structure, il suffit de mettre la valeur à null avant de passer vers le bas.
ref <struct_name>
avecIntPtr
? Oui, c'est moins sûr, mais il semble que si vous faites affaire avec P/Invoke le code de sécurité est déjà pas le point.La raison pour laquelle vous ne peut pas passer
null
est parce qu'unref
paramètre est donné un traitement spécial par le compilateur C#. Toutref
paramètre doit être un ouvrage de référence qui peut être passé à la fonction que vous appelez. Puisque vous voulez passernull
le compilateur refuse de permettre cela, car vous n'êtes pas fournir une référence que la fonction attend à avoir.Votre seule option serait de créer une variable locale, il
null
, et le passer en. Le compilateur ne vous permettra pas de le faire beaucoup plus que cela.Une façon est de créer une variable muette, lui affecter la valeur null, et le passer en.
Tandis que @JaredPar de réponse est sans doute le corriger réponse, il n'y a un autre réponse:
unsafe
code et des pointeurs:Que semble comme il se doit échouer au moment de l'exécution, mais il ne le fait pas, parce que le
ref
et la*
annuler les uns les autres, et de la valeur deref *nullMapping
est le pointeur null, ce qui est leFILES_GetMemoryMapping()
recevrez pour ce paramètre.Ce n'est probablement pas une bonne idée, mais c'est possible.
Null peut maintenant être autorisée à l'aide du langage C# 7.2 ou plus. Il suffit de remplacer le
ref
dans votre paramètre de la fonction comme si...à...
Cela vous permettra de passer en
null
que la valeur d'un paramètre lors de l'appel de la fonction dans votre application. Il fonctionne de la même pour les objets et les types natifs et est syntaxiquement équivalent àref readonly
.null
, il n'est plus sémantiquement correct, que la mise en œuvre deMyFunc
pouvez modifierobj
si une valeur non null est passé, mais votre code dit le contraire. N' .NET marshaller ignorer la valeur retournée (l'applicationreadonly
restriction) ou interprètein
commeref
(sans tenir compte de la restriction)?Est peut-être pas exactement la réponse idéale, mais si vous avez besoin de passer la valeur null comme paramètre lors de l'appel d'une fonction, d'envisager de faire une surcharge de la fonction qui omet le paramètre formel de la variable que vous êtes en essayant de mettre à null.
Par exemple, disons que vous avez une fonction qui ressemble à ceci:
Vous voulez être en mesure de passer la valeur null pour le paramètre z. Essayez plutôt de créer une nouvelle
MyFunction
surcharge qui ressemble à quelque chose comme ceci:Cette approche ne convient pas à tous les besoins, mais c'est une autre solution possible.