我必须从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#程序。 任何人都可以帮我解决问题吗?
答案 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集合中。