Я сделал это с помощью неуправляемой dll, но с некоторыми трудностями использовал управляемую dll.Как получить строку из управляемого C++ dll (с использованием класса оболочки) в C#
Я хочу передать строку в моем управляемом C++ класс-оболочку, которая обработать его и вернуть модифицированную строку
о цели C++ DLL, чтобы вернуть шестнадцатеричный код файла (а затем изменяет его, чтобы сделать некоторые сложные задачи внутри dll), который я передаю ему как строку, для этого совпадения я использовал управляемую C++ dll вместо неуправляемой.
классмой C++ выглядит следующим образом:
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;
}
мой C++ класс-оболочка выглядит следующим образом: заголовочный файл, включая C++ файл здесь (не показан для кода readabitily)
using namespace System;
namespace CWrapperHexValue {
public ref class cWrapperHexValue
{
public:
cWrapperHexValue();
const char* hexValue;
const char* getHexValue(char* fileName);
private:
hexclass* pHexClass;
};
}
и моей обертке класс выглядит следующим образом:
// 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;
}
и, наконец, мой код C# для отправки f ilename выглядит следующим образом:
//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);
}
}
теперь, как я могу получить обратно значение returnSp в виде строки или любого другой лучшим способом передачи и получить строку, пожалуйста, предоставить полезный код, потому что я не много опыта работы с C++/C# кли преобразование
пожалуйста совет, как я могу улучшить мой код для лучшего управления памятью потому что я должен пройти целый много системных файлов один на один и получить их шестнадцатеричный код
Я использую C++ нативного кода из-за проблем с производительностью, C++ быстрее, чем C#, и файлы легко манипулировать в C++. я уже делал это в C#, чем перемещен на C++ из-за стоимости работы моего кода. спасибо за ответ –
Маршалинг может удалить любые преимущества производительности, которые вы могли получить от перехода на собственный код. Если это действительно необходимо для исполнения, почему бы не переместить все на C++ и не покончить с управляемым кодом? – Jun
Я использую C# для gui и C++ для всей задачи hardcore, строка, которую я получаю, будет использоваться (после некоторой небольшой модификации) для обновления прогресса в gui. –