将列表中struct的引用传递给dll中的托管代码到非托管代码

时间:2011-06-06 14:12:39

标签: c# pointers struct marshalling unmanaged

我是C#的新手,目前在编译器中将结构编组到一个dll中的C函数时遇到了一些麻烦。有问题的结构包含一些int,float和C中的一个char *,如下所示:

struct Bin
{
    char* m_name;
    float m_start;
    float m_end;

    int m_OwnerID;
    int m_SelfID;
}

相应的C#struct定义,我认为应该是:

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对象中,该对象是主应用程序类的类成员。同时,我想通过Dll函数调用将对列表中每个struct对象的引用传递给非托管C ++类,因此可以在其他函数调用期间引用它,而无需在非托管端复制数据。

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
}

但是在编写PassPtrsToLibrary()C#sharo函数时我遇到了一些问题。将Bin结构添加到列表中后,我永远无法获得列表中bin的实际指针或引用。我尝试过Marshall.StructureToPtr,但它总是让我的应用程序崩溃。我还读到很难将struct中的托管字符串作为指针/引用传递给C代码。如何解决这个问题,请给我一些帮助或建议。感谢您阅读这篇冗长的帖子。

0 个答案:

没有答案