2

我有一个DLLC. 我尝试在托管代码中使用它,但有些我的功能无法正常工作。这是C代码。

int preProcessImagesC (char *p_trainingFilePath,
                       char **p_vecImageFilesOrDirs);  

此功能运行良好。

托管代码:

unsafe private static extern int preProcessImagesC(
    //Works perfact 
    String p_trainingFilePath,
    //char** thise parameter is taking junk values , String Array is not working
    [MarshalAs(UnmanagedType.SafeArray)] ref String[] p_vecImageFilesOrDirs);

只有第一个参数工作正常。我应该 char **p_vecImageFilesOrDirs 在托管代码中使用什么参数。请帮我在C#.

4

2 回答 2

4

你试过了吗:

private static extern int preProcessImagesC(
    string p_trainingFilePath,
    string[] p_vecImageFilesOrDirs
);

编组器自动使用:

[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr)]

这就是你所需要的。

您应该小心这一点,因为您的非托管代码无法确定传递数组的实际大小。您必须将数组的实际大小作为另一个参数传递给非托管函数,或者在两个地方都使用固定大小。

于 2013-04-10T08:23:59.753 回答
-2

A string is already an array of characters.
Thus you should be fine with

ref String p_vecImageFilesOrDirs

You are currently copying a reference to array of array of characters.

于 2013-04-10T08:14:09.797 回答