Я очень новичок в C # и в настоящее время испытываю некоторые проблемы с распределением структур для функций C в DLL. Рассматриваемая структура содержит несколько int, float и один символ * в C следующим образом:
struct Bin
{
char* m_name;
float m_start;
float m_end;
int m_OwnerID;
int m_SelfID;
}
Соответствующее определение структуры C #, я думаю, должно быть:
public struct Bin
{
public string m_name;
public float m_start;
public float m_end;
public int m_OwnerID;
public int m_SelfID;
}
Я также реализовал функцию синтаксического анализа / чтения в C #, которая считывает текстовый файл, создает объекты Bin и сохраняет их в объекте List, который является членом класса основного класса приложения. В то же время я хочу передать ссылки на каждый объект структуры в списке неуправляемому классу C ++ через вызов функции Dll, чтобы на него можно было ссылаться во время других вызовов функций без необходимости дублирования данных на неуправляемой стороне.
class ProgramMain
{
public List<Bin> m_BinList;
static void Main()
{
//Some functions calls
//Fills up List<Bin>
LoadBinData(string inFile);
//Iterate each bin in list and pass reference to each bin to C++ class via
//Dll Imported function
PassPtrsToLibrary(); //???
}
public void LoadBinData(string inFile)
{
.....
}
public void PassPtrsToLibrary()
{
????
}
/* PassByReferenceIn */
[DllImport ("mylib")]
public static extern
void PassBinPtrIn(ref Bin theBin);
//Some other function that reads the stored Bin pointers' data and perform calculations
[DllImport ("mylib")]
public static extern
int ProcessBin();
}
На стороне C dll внутренне глобальный объект класса C ++ хранит указатель на каждую структуру в контейнере std :: vector:
BinManager theBinManager;
void PassBinPtrIn(Bin* theBin)
{
theBinManager.AddBin(theBin);
}
void BinManager::AddBin(Bin* theBin)
{
m_BinPtrList.push_back(theBin);//a std::vector<Bin*> type
}
Однако я сталкиваюсь с некоторыми проблемами при написании функции sharo PassPtrsToLibrary () на C #. После добавления структуры Bin в список, я никогда не смогу получить фактический указатель или ссылку на bin внутри списка. Я пробовал Marshall.StructureToPtr, но он всегда вылетал из моего приложения. Я также читал, что трудно передать управляемую строку в структуре как указатель / ссылку в C-код. Пожалуйста, дайте мне некоторую помощь или совет, как решить эту проблему. Спасибо за чтение этого длинного поста.