【发布时间】:2011-04-22 19:50:37
【问题描述】:
C 声明:
struct t_name
{
char first_name[128];
char nickname[128];
int32_t words[7];
uint16_t parts_of_speech[7];
uint32_t language;
bool has_name;
};
char* Translation_TranslateNameEnglish(DFHackObject* trans, const t_name* name);
我在 C# 中是如何做到的:
[StructLayout(LayoutKind.Sequential), Serializable]
public struct DFName
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string FirstName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string NickName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public int[] Words;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public ushort[] PartsOfSpeech;
public uint Language;
public bool HasName;
}
[DllImport(DllName)]
public static extern string Translation_TranslateNameEnglish(IntPtr ptr, ref DFName name);
呼唤:
DFHack.Translation_TranslateNameEnglish(translation, ref name)
使用 IntPtr 作为第一个参数是没有问题的,我在类似的调用中也有这样的工作。 DFName 结构在另一个调用中填充,它包含有效数据。 然而,不起作用的是对 TranslateNameEnglish 的调用。当该行执行时,我收到一条错误消息“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。” 我做错了什么?
我忘了提及哪些可能很重要:DFName 结构是作为另一个结构的一部分检索的。
[StructLayout(LayoutKind.Sequential), Serializable]
public struct DFCreature
{
// Snip
public DFName Name;
// Snip
}
用方法检索到的
public static extern int Creatures_ReadCreature(IntPtr ptr, uint index, out DFCreature creature);
【问题讨论】:
-
请使用相同的电子邮件/OpenID 登录,这样您将作为同一个人进行线程化,并且您将能够编辑您的答案等。