【发布时间】:2011-08-23 22:34:06
【问题描述】:
我从某人那里得到了这个程序集,我想在我的 c# 应用程序中使用它。
标题如下所示:
int __declspec(dllimport) s2o(WCHAR* filename, char** out, int* len);
我设法让它部分工作,使用:
[DllImport("s2o.dll", EntryPoint = "?skn2obj@@YAHPA_WPAPADPAH@Z", CallingConvention = CallingConvention.Cdecl)]
public static extern int s2o(
[MarshalAs(UnmanagedType.LPWStr)]
string filename,
ref char[] @out,
ref int len
);
然后这样称呼它:
char[] result = null;
int length = 0;
s2o("filepath", ref result, ref length);
它似乎部分起作用,因为“长度”实际上得到了一个值。 不幸的是,“结果”保持为空。
我应该怎么做才能让它工作?
编辑:
好的,我设法将 char[] 替换为 IntPtr,然后像 Nick 建议的那样调用“Marshal.PtrToStringAnsi”:
string result = Marshal.PtrToStringAnsi(ptr);
但是,由于同一答案中的 cmets,我有点担心内存使用情况。程序集中没有提供其他方法,所以我该如何清理?
【问题讨论】:
-
您可以尝试将 char[] 替换为 IntPtr 并为指针调用 PtrToStringAuto:Marshal .PtrToStringAuto(@out)
-
请在您的 DLL 中使用 extern "C" 声明您的函数以禁用名称修改。现在回答你的问题。在您告诉我们
out参数的工作原理之前,我们无法告诉您如何调用此函数。谁分配什么?你有s2o的任何文档吗? -
@David:我认为他是在说这是第 3 方 DLL,所以他可能无法添加 extern "C"。
-
确实是第三方dll。
-
您可以尝试使用 Marshal.FreeCoTaskMem 或 FreeHGlobal。但是如果不知道 DLL 中的内存是如何分配的,就很难知道会发生什么!
标签: c# .net pinvoke char marshalling