C ++ dll将数组传递给C#

时间:2013-09-20 20:37:11

标签: c# c++

我必须从C ++ dll数组传递给C#程序。 这是C ++代码:

 __declspec(dllexport) std::vector<std::string> __stdcall 
    getFilesByDirs
    (
        string directory, 
        std::string fileFilter, 
        bool recursively = true
    )
{
    int __ID = 0;
    std::vector<std::string> filesArray;

    if (recursively)
        getFilesByDirs(directory, fileFilter, false);

    directory += "\\";

    WIN32_FIND_DATAA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    std::string filter = directory + (recursively ? "*" : fileFilter);

    hFind = FindFirstFileA(filter.c_str(), &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        return filesArray;
    }
    else
    {
        if (!recursively)
        {
            if(isGoodForUs(directory + std::string(FindFileData.cFileName))) 
            {
                filesArray[__ID] = directory + std::string(FindFileData.cFileName);
                __ID ++;
            }
        }

        while (FindNextFileA(hFind, &FindFileData) != 0)
        {
            if (!recursively)
            {
                if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
                filesArray[__ID] = directory + std::string(FindFileData.cFileName);
            }
            else
            {
                if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)>0 && FindFileData.cFileName[0]!='.')
                {
                    if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
                    getFilesByDirs(directory + std::string(FindFileData.cFileName), fileFilter);
                }
            }
            __ID ++;
        }

        DWORD dwError = GetLastError();
        FindClose(hFind);
    }

    return filesArray;
}

如您所见,有一种按类型扫描文件的功能。 它保存在字符串数组中并返回。

现在,这是C#代码:

[DllImport(@"files.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr getFilesByDirs(string path, string exns, bool rec=true);

然后我打电话给这个方法:

IntPtr a = getFilesByDirs("C:\\", "*.docx");

问题是没有任何东西从Dll传递给我的C#程序。 任何人都可以帮我解决问题吗?

1 个答案:

答案 0 :(得分:1)

您需要不将它们作为向量而是作为基本类型(例如char **)返回。这里的问题是,为了消费它,你需要知道集合中有多少。作为埃德。 S在评论中说,你可能会发现使用CLI更容易(如果你可以用/ clr编译你的C ++)。但是如果你能做到这一点,那么你可以在C ++中使用C ++中的.Net类型(如List)和marshall your char*'s to Strings

否则,您可以在.Net端返回原始char *的句柄。要在C#中使用char *(并且可能已经完成了C ++,你会对这个功能感到满意)你可以使用unsafe关键字,这样你就可以将这些char *转换为不安全的System :: String's并将它们添加到.Net集合中。