Je sais que je peux obtenir ceci pour fonctionner techniquement mais je voudrais mettre en application la solution la plus propre possible. Voici la situation:Gestion des délégués gérés dans le code non managé
J'ai une bibliothèque gérée qui enveloppe une bibliothèque de style C non managée. La fonctionnalité de la bibliothèque de style C que j'emballe actuellement effectue un traitement impliquant une liste de chaînes. Le code client de la bibliothèque peut fournir un délégué, de sorte qu'au cours du traitement de la liste, si un scénario "invalide" est rencontré, la bibliothèque peut rappeler le client via ce délégué et lui permettre de choisir la stratégie à utiliser (lancer une exception, remplacer Ce que j'aimerais idéalement avoir, c'est que tout le C++ managé soit isolé dans une fonction, et ensuite être capable d'appeler une fonction séparée qui ne prend que des paramètres non gérés, de sorte que tous les éléments natifs soient isolés. Le code C++ et non managé est isolé à ce point. Fournir le mécanisme de rappel à ce code non géré s'avère être le point de friction pour moi.
#pragma managed
public delegate string InvalidStringFilter(int lineNumber, string text);
...
public IList<Result> DoListProcessing(IList<string> listToProcess, InvalidStringFilter filter)
{
// Managed code goes here, translate parameters etc.
}
#pragma unmanaged
// This should be the only function that actually touches the C-library directly
std::vector<NativeResult> ProcessList(std::vector<char*> list, ?? callback);
Dans cet extrait, je veux garder tous les accès C-bibliothèque au sein processlist, mais au cours du traitement, il devra faire callbacks, et ce rappel est fourni sous la forme du délégué InvalidStringFilter qui est transmis depuis un client de ma bibliothèque gérée.
Merci pour le deuxième commentaire. Cela explique finalement pourquoi je continue à obtenir SEH à des moments aléatoires – galets
J'ai eu de la chance d'avoir quelqu'un qui me l'a dit lors de ma première journée avec C#, donc je l'ai toujours su. Il savait que j'étais sur le point d'écrire un pont C#/C++. –