我是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代码。如何解决这个问题,请给我一些帮助或建议。感谢您阅读这篇冗长的帖子。