2015-04-01 2 views
0

J'ai fait cela en utilisant dll non géré, mais ayant de la difficulté à utiliser DLL géré.Comment faire pour obtenir la chaîne à partir cll dll géré (en utilisant la classe wrapper) dans C#

Je veux passer une corde à mon géré C++ classe wrapper qui traite et retour chaîne modifiée

le but de C++ dll est de retourner le code hexadécimal d'un fichier (et modifie plus tard à faire des tâches compliquées dans dll) que je passe en tant que chaîne, pour cet approcach j'ai utilisé C++ dll géré au lieu d'un non géré.

ma classe C++ est la suivante:

using namespace std; 

//main function - entry point of program __declspec(dllexport) 
const char* hexclass:: getfilename(char* filename) 
{ 
//to open file 
ifstream::pos_type size; 
string virusScanStatus; 
char* fileAccessError; 
string errorDes ="Exception has Occured With Current File Operation"; 
//hexcode logic goes here 
fileAccessError = new char[errorDes.size()]; 
errorDes.copy(fileAccessError,errorDes.size()); 
return fileAccessError; 
} 

mon C++ classe wrapper est la suivante: fichier d'en-tête, y compris C++ fichier ici (non représenté pour le code readabitily)

using namespace System; 

namespace CWrapperHexValue { 

public ref class cWrapperHexValue 
{ 
    public: 
     cWrapperHexValue(); 
     const char* hexValue; 
     const char* getHexValue(char* fileName); 
    private: 
     hexclass* pHexClass; 

}; 
} 

et mon emballage classe est la suivante:

// This is the main DLL file. 
#pragma once 

    #include "stdafx.h" 

    #include "CWrapperHexValue.h" 

    #include "D:\Projects\program10\program10\hexclass.cpp" 
    #include "D:\Projects\program10\program10\hexclass.h" 

    CWrapperHexValue::cWrapperHexValue::cWrapperHexValue() 
    { 
    pHexClass = new hexclass(); 
    } 

    const char* CWrapperHexValue::cWrapperHexValue::getHexValue(char* fileName) 
    { 
    hexValue= pHexClass -> getfilename(fileName); 
return hexValue; 
    } 

et enfin mon code C# à envoyer f ilename est la suivante:

//my c++ dll name is CWrapperHexValue 
     CWrapperHexValue.cWrapperHexValue objHexClass = new CWrapperHexValue.cWrapperHexValue(); 
     byte[] fileNameBytes = Encoding.ASCII.GetBytes(fileNameForHexScan); 

     unsafe 
     { 
      fixed (byte* p= fileNameBytes) 
      { 
       sbyte* sp = (sbyte*)p; 
       sbyte* returnSp = objHexClass.getHexValue(sp); 
      } 
     } 

maintenant comment puis-je récupérer la valeur returnSp comme une chaîne ou tout autre meilleure façon de passer et chaîne obtenir, s'il vous plaît fournir le code utile parce que j'ai pas beaucoup d'expérience avec C++/C# cli conversion

s'il vous plaît conseille comment puis-je améliorer mon code pour une meilleure gestion de la mémoire becuase je dois passer beaucoup de fichiers système un par un et obtenir leur code hexadécimal

Répondre

0

Selon ce que

// hexcode logic 

est, il pourrait être mieux/plus facile de l'implémenter en C# et oublier le marshaling.

Si vous avez vraiment besoin de rassembler des chaînes de C++ C#, ce sujet va probablement vous aider tout à fait un peu: How to marshall c++ char* to C# string using P/INVOKE (code est ici)

Fondamentalement simplement construire une DLL native de votre code natif et vous pouvez il suffit de l'épingler à partir de C# plutôt que d'avoir la classe C++ gérée intermédiaire si tout ce dont vous avez besoin est une chaîne. En termes de gestion de la mémoire, si vous pouvez déplacer la logique du code hexadécimal en C#, cela éliminerait le besoin de rassembler les chaînes et vous épargnerait probablement un traitement, mais surtout, serait moins pénible à déboguer. A savoir, pourquoi tu ne peux pas faire ça?

C#

public void SomeFunction() 
{ 
    string filepath = "foo.bar" 
    string hexVal = HexCodeLogicInManaged(filepath); 
    ... other code ... 
} 

private string HexCodeLogicInManaged(string filepath) 
{ 
    // hexcode logic converted from native to managed 
} 
+0

J'utilise C++ code natif en raison de problème de performance, C++ est plus rapide que C#, et les fichiers sont faciles à manipuler en C++. Je l'ai déjà fait en C# que déplacé en C++ en raison du coût de performance de mon code. merci pour la réponse –

+0

Le marshaling peut supprimer toute sorte d'avantage de performance que vous pourriez avoir reçu en allant au code natif. Si cela doit vraiment être performant, pourquoi ne pas tout déplacer en C++ et supprimer le code managé? – Jun

+0

J'utilise C# pour gui et C++ pour toutes les tâches hardcore, la chaîne que je récupère sera utilisée (après quelques modifications) pour mettre à jour la progression de gui. –