Передать ссылку на структуру в списке от управляемого до неуправляемого кода через DLL - PullRequest
1 голос
/ 06 июня 2011

Я очень новичок в 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-код. Пожалуйста, дайте мне некоторую помощь или совет, как решить эту проблему. Спасибо за чтение этого длинного поста.

...