2015-04-01 6 views
0

Я сделал это с помощью неуправляемой 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# кли преобразование

пожалуйста совет, как я могу улучшить мой код для лучшего управления памятью потому что я должен пройти целый много системных файлов один на один и получить их шестнадцатеричный код

ответ

0

в зависимости от того, что

// hexcode logic 

, возможно, было бы лучше/проще реализовать его на C# и забыть о маршалинге.

Если вам действительно нужно мобилизовывать строки из C++ в C#, эта тема, скорее всего, поможет вам совсем немного: How to marshall c++ char* to C# string using P/INVOKE (код здесь)

В основном только построить родной DLL из вашего собственного кода, и вы можете просто выщипывать его из C#, а не иметь промежуточный управляемый C++-класс, если все, что вам нужно, это строка.

С точки зрения управления памятью, если вы можете переместить логику шестнадцатеричного кода на C#, это устранит необходимость маршалирования строк и, вероятно, сэкономит вам некоторую обработку, но, что более важно, будет менее болезненным для отладки. А именно, почему вы не можете это сделать?

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

Я использую C++ нативного кода из-за проблем с производительностью, C++ быстрее, чем C#, и файлы легко манипулировать в C++. я уже делал это в C#, чем перемещен на C++ из-за стоимости работы моего кода. спасибо за ответ –

+0

Маршалинг может удалить любые преимущества производительности, которые вы могли получить от перехода на собственный код. Если это действительно необходимо для исполнения, почему бы не переместить все на C++ и не покончить с управляемым кодом? – Jun

+0

Я использую C# для gui и C++ для всей задачи hardcore, строка, которую я получаю, будет использоваться (после некоторой небольшой модификации) для обновления прогресса в gui. –