2010-06-25 7 views
1

Je travaille sur un projet dans lequel je dois importer un fichier DLL dans un projet VB créé il y a quelques années. La DLL a été créé en C++, et ressemble à:Utilisation de DLL import/Declare dans VB.NET avec des types de paramètres non utilisés par .NET

void CoordinateConversionService::convert(SourceOrTarget::Enum sourceDirection, SourceOrTarget::Enum targetDirection, CoordinateTuple* sourceCoordinates, Accuracy* sourceAccuracy, CoordinateTuple& targetCoordinates, Accuracy& targetAccuracy) 

Je suis un stagiaire à mon travail, et je n'ai pas dû utiliser ce encore, si ma compréhension est extrêmement limitée, ainsi que mon utilisation de VB (Je suis un gars C++/C#). Voici quelques questions:

1) En regardant Dllimport, il semble que la dernière partie en dehors des paramètres est un type de retour. Exemple de code d'un autre site:

<DllImport("advapi32.dll")> _ 
    Public Function GetUserName(_ 
    ByVal lpBuffer As StringBuilder, _ 
    ByRef nSize As Integer) As Boolean 

Le type de retour est-il "As Boolean"? Si oui, j'ai essayé d'utiliser "Sub" et il dit "Mot-clé ne nomme pas un type." D'où la raison pour laquelle j'ai cherché à déclarer, car il semble que je puisse retourner void/sub comme type de retour.

2) Essayer d'utiliser les types "CoordinateTuple" et "Accuracy" me pose des problèmes, en disant qu'ils ne sont pas définis. Comment puis-je contourner cela parce que je ne pense pas que je peux vraiment les définir, et qu'en est-il du fait qu'ils sont des pointeurs? Aussi - Je ne peux pas modifier le code C++ de quelque façon que ce soit, donc ce que j'ai c'est ce que j'ai.

+0

PS - J'ai essayé d'ajouter comme une référence et j'ai l'erreur qui dit que ce n'est pas un fichier COM valide. – ibarczewski

+0

Nous avons besoin de plus d'informations sur les types personnalisés 'SourceOrTarget :: Enum',' CoordinateTuple' et 'Accuracy'. VB et C# peuvent seulement gérer des fonctions C simples, pas de fonctions C++ (le marshaller a été conçu pour fournir un accès simple à l'API Windows), donc si ces types sont des types non-POD, vous devez écrire un C++. Interface NET. À tout le moins, vous devez vous débarrasser des paramètres de référence C++ et déclarer la fonction 'extern 'C" '. – Philipp

+0

Parlez-vous du code C++? Parce que je ne peux pas le modifier d'aucune façon, forme ou forme. – ibarczewski

Répondre

3

En VB vous dites soit Public Function Whatever (params) As ReturnType (qui est la même que celle public ReturnType Whatever(params) en C#) ou Public Sub Whatever (params) qui est des choses qui ne renvoient pas quoi que ce soit (retour void en C++/C#).

Si votre fonction/sub prend des types personnalisés, vous devrez également déclarer les équivalents .NET. Cela peut faire travailler durement PInvoke. Des outils comme the interop assistant peuvent aider.

+0

Donc je vais essentiellement besoin de convertir les types de C++ en VB.net? – ibarczewski

+0

Oui. Si vous utilisez l'assistant d'interopérabilité, vous pouvez coller dans les defauts C++ et il vous donnera VB à mettre avant votre instruction DllImport. –

+0

D'accord, cool. Je vais tester votre méthode un peu et vous donner la réponse si ça marche :) – ibarczewski

0

Pour les types personnalisés, vous devrez peut-être créer un encapsuleur dans C++ managé, qui a la capacité à la fois de consommer des API C++ natives et d'exposer des API managées. Bien qu'elle date, une visite virtuelle se trouve ici:

+0

Seulement si les types sont compliqués. Les types de POD sont très bien gérés par le marshaller .NET. – Philipp

Questions connexes