C聲明:C到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登錄,這樣您將以同一人身份進行線程連接,並且您將能夠編輯您的答案等。 – abatishchev 2011-04-22 11:29:15