2009-11-18 13 views
1

J'ai écrit une application C# qui utilise une DLL C++ non managée via une DLL C++ gérée. Dans la DLL non gérée, il y a un rappel que l'un de ses paramètres est std::string&.Délégué C# avec une référence de chaîne au rappel C++

Je n'arrive pas à trouver la bonne façon d'envelopper avec la DLL gérée. Lorsque j'utilise String^, le rappel fonctionne, mais l'application C# n'obtient rien dans la chaîne. Lorsque j'ai utilisé String^%, les choses ont commencé à se bloquer dans d'autres endroits qui ne semblent pas être liés (peut-être une corruption de mémoire).

Donc, ma question est, quelle est la bonne façon de faire cela?

Merci

Répondre

0

affichage du code me aider à mieux comprendre et donner une meilleure réponse; mais il n'y a pas de conversion ou de rassemblement automatique de String^en std :: string. Vous auriez besoin de vous déplacer pour ramener la chaîne au code C#. Une recherche rapide peut fournir des détails sur la façon de procéder.

http://msdn.microsoft.com/en-us/library/42zy2z41.aspx

1

Je ne peux pas copier-coller le code ici, mais je vais essayer d'expliquer à nouveau. Je ne peux pas utiliser marshaling dans la section C++ gérée car je n'appelle pas de fonction, mais en passant un délégué C# pour un rappel.

Dans la DLL non managée, j'ai un rappel qui nécessite une fonction comme celle-ci: void Func(unsigned int, int, std:string &).

Mon objectif est de passer délégué aC# de mon programme à ce rappel, donc dans le code non managé, je fait un délégué comme ceci: delegate void DEL(unsigned int a, int b, String^c) et une fonction comme: void mFunc(DEL^del), et que du maréchal de la fonction du délégué dans un cb que la fonction d'abonnement de rappel non géré accepte. Les int int sans signe et int fonctionne bien, mais la chaîne est toujours "" lorsque la fonction C# est déclenchée.

0

Je ne crois pas que le marshalling puisse gérer std :: string. Je pense que vous devez faire votre propre callback qui passe char * et ensuite écrire le code de la colle entre les deux.

En outre, une fois que le délégué est placé dans un rappel, ce rappel ne compte pas comme une référence à l'objet à partir duquel le délégué a pu être créé. Donc, si le délégué n'est pas une méthode statique, vous devez l'insérer quelque part pour la durée de vie du rappel non géré.