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
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 –
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
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. –