C# Pinvoke 字符串

我正在尝试使用 PInvoke 绑定此 C 函数。

bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode);

这是 PInvoke 签名。

[DllImport(nativeLibName,CallingConvention = CallingConvention.Cdecl)]public static extern bool GuiTextBox(Rectangle bounds, 
                                     string text, 
                                     int textSize, 
                                     bool freeEdit);

当我尝试使用它时,字符串不会被修改。我尝试将它作为 ref 传递,但是当我尝试使用它时它会因尝试读取或写入受保护的内存而崩溃。


牧羊人nacy
浏览 74回答 1
1回答

临摹微笑

我希望它应该是这样的:// private : do not expose inner details; // we have to manipulate with StringBuilder[DllImport(nativeLibName,           CallingConvention = CallingConvention.Cdecl,           EntryPoint = "GuiTextBox",           CharSet = CharSet.Unicode)] //TODO: Provide the right encoding hereprivate static extern bool CoreGuiTextBox(Rectangle bounds,                                           StringBuilder text, // We allow editing it                                          int textSize,                                           bool freeEdit);// Here (in the public method) we hide some low level details// memory allocation, string manipulations etc.public static bool CoreGuiTextBox(Rectangle bounds,                                   ref string text,                                   int textSize,                                   bool freeEdit) {  if (null == text)    return false; // or throw exception; or assign "" to text  StringBuilder sb = new StringBuilder(text);    // If we allow editing we should allocate enough size (Length) within StringBuilder  if (textSize > sb.Length)    sb.Length = textSize;  bool result = CoreGuiTextBox(bounds, sb, sb.Length, freeEdit);     // Back to string (StringBuilder can have been edited)  // You may want to add some logic here; e.g. trim trailing '\0'    text = sb.ToString();  return result;}
打开App,查看更多内容
随时随地看视频慕课网APP