Для этого рекомендуется использовать промежуточный проект C ++ / CLI (также называемый неявным P / Invoke tecnique). Выполнение явного P / Invoke (DllImport) для всего, что связано с использованием контейнеров stl или сложных классов, может быть разочаровывающим или невозможным. Более того, это небезопасный тип: вам нужно угадать правильную сигнатуру, чтобы выполнить сортировку, и часто есть несколько возможностей, которые могут работать, и это может сбивать с толку. Внутренние представления строки в C ++ (stl) и в CLR просто не совпадают, поэтому вам приходится конвертировать между ними, и это делает явный маршалинг P / Invoke болезненным.
Рекомендуется следующий способ. Обратите внимание, что я не скомпилировал код, поэтому могут быть небольшие ошибки, но я могу убедиться, что это можно сделать следующим образом: я делал это много раз.
Допустим, у вас есть это в собственном проекте DLL (заголовок Utils.h):
DLLFUNCTIONEXPOSETEST_API std::vector<std::string> GetStrings();
Обратите внимание, что важно знать, как эти строки внутренне кодируются в c ++ stl :: string (например, UTF-8, если вы крутой):
Теперь вы создаете CRL C ++ проект (пара UtilsW.h / UtilsW.cpp):
#include <Utils.h>
using namespace std;
using namespace System;
using namespace System::Text;
using namespace System::Collections::Generics;
namespace Interop
{
public ref class Utils
{
public:
static List<String ^> ^ GetStrings()
{
List<String ^> ^ret = gcnew List<String ^>();
vector<string> strings = ::GetStrings();
vector<string>::iterator begin = strings.begin();
vector<string>::iterator end = strings.end();
for (; it != end; it++)
ret.Add(gcnew String((*it).c_str(), 0, (*it).lenght(), Encoding::UTF-8);
return ret;
}
};
}
Теперь вы создаете проект .NET, например, в C #:
using Interop;
namespace NET
{
public class Program
{
void foo()
{
List<string> strings = Utils.GetStrings();
// Do something with strings
}
}
}