0

我有调用 C dll 的 C# 代码。dll 具有以下全局 const 字符串数组:

const char *PtxEditorColumnHeaders[] = {
    "Ptx#",
    "Primitive",
    "PtxType",
    "_END_COLUMNS"
};

我想要做的就是获取这个文本并将其填充到 ListView 控件的列文本中。我发现有几种方法可以做到这一点,使用 Pinvoke、strcpy 等。但是,由于我仍在学习 c# 并且到目前为止我的方式没有受到破坏,那么最佳实践方法是什么?

4

1 回答 1

-1

编写一个 C 函数,返回指向数组第一个元素的指针和元素个数:

const char **GetPtxEditorColumnHeaders(int *count)
{
    *count = 4;//or however you want to get hold of this information
    return PtxEditorColumnHeaders;
}

然后声明 p/invoke:

[DllImport(@"mydll.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr GetPtxEditorColumnHeaders(out int count);

像这样调用函数:

int count;
IntPtr PtxEditorColumnHeaders = GetPtxEditorColumnHeaders(out count);
List<string> headers = new List<string>();
for (int i=0; i<count; i++)
{
    IntPtr strPtr = Marshal.ReadIntPtr(PtxEditorColumnHeaders);
    headers.Add(Marshal.PtrToStringAnsi(strPtr));
    PtxEditorColumnHeaders += Marshal.SizeOf(typeof(IntPtr));
}

这些东西很快就会变得乏味,此时 C++/CLI 包装器开始看起来像是一个更有吸引力的选择。

于 2012-07-11T19:53:32.347 回答