C#:将字符串数组传递给c ++ dll / dylib

时间:2017-07-19 13:32:35

标签: c# c++ macos

我无法将c#代码中的字符串数组传递给我的c ++ dylib中的函数。

C#代码:

[DllImport("array2d.dylib", EntryPoint = "process_array", CallingConvention = CallingConvention.Cdecl)]
    public static extern int process_array(String[] a, int b);
    static void Main(string[] args)
    {

        String[] list = new String[] { "Abc" , "def", "ghi", "jkl"};
        int josh = process_array(list, 2);                          
     }

我的C ++代码:

 #include <string>
#include <iostream>



int process_array(char** array, int rows)
{

    std::string s1 ("Array : [");

        for (int i = 0; i < 6; ++i){
                s1.append(array[i]);
                s1.append(", ");

        }
        s1.append("] \n");


        return 1;

}

int main()
{

}

我得到的错误是:

未处理的异常:System.EntryPointNotFoundException:无法找到名为&#39; process_array&#39;的入口点。在DLL&#39; array2d.dylib&#39;中。    在JoshServer.Program.process_array(String [] a,Int32 b)

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

未导出C ++程序中的函数:

int process_array(char** array, int rows)

您必须使用dllexport标记它,如下所示:

extern "C" int process_array(char** array, int rows)

更新:这个project包含我前一段时间关于PInvoke的演讲中使用的示例,我希望它有所帮助。

一些更正。

 for (int i = 0; i < 6; ++i){

应该是:

 for (int i = 0; i < rows; ++i){

int josh = process_array(list, 2);  

应该是

int josh = process_array(list, list.Length);  

已更新:已移除__declspec(dllexport)(osx)并添加了一些更正。