【发布时间】:2011-09-14 12:33:45
【问题描述】:
我一直在谷歌上寻找一些问题的答案,但不太明白我发现了什么。在使用 System.IO 读取一些文本文件后,我有一些对象被创建并存储在 C# List 中。之后,我想将这些对象中的每一个的引用(使用 const 指针)发送到 C++ dll 中的内部类,以便它可以使用它们来计算某些算法。
这是我正在做的一些简单示例(不是实际代码):
C# 类:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class SimpleClass
{
[MarshalAs(UnmanagedType.LPStr)]
public string Name;
public float Length;
}
对应的C结构体:
struct SimpleClass
{
const char* Name;
float Length;
};
存储在
List<SimpleClass> ItemList;
解析一些文本文件后。
然后调用下面的dll函数:
C#:
[DllImport("SimpleDLL")]
public static extern void AddSimpleReference(SimpleClass inSimple);
C:
void AddSimpleReference(const SimpleClass* inSimple)
{
g_Vector.push_back(inSimple); // g_Vector is a std::vector<const SimpleClass* > type
}
我试过的是:
for(int i=0; i<ItemList.Count;++i)
{
SimpleClass theSimpleItem = ItemList[i];
AddSimpleReference(theSimpleItem);
}
最初,我认为只需使用赋值运算符就可以很容易地获得实际的引用/地址,因为 C# 中的类是通过引用传递的,但事实证明 C++ 类总是推送相同的地址值(临时引用的地址值)到容器中,而不是实际地址。如何获取实际的对象地址并将其发送到 C++ DLL,以便它可以只读访问 C# 对象?
更新:对于那些使用不安全代码发布答案的人,我们深表歉意。我忘了说 C# 代码实际上是 Unity 游戏引擎中的脚本,它不允许使用不安全的代码。
【问题讨论】:
标签: c# c++ pointers dll pass-by-reference