2017-07-19 23 views
0

私のC++コードの文字列をC++コードの関数に渡すのに問題があります。C#:文字列配列をC++ dll/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:エントリを見つけることができません。 'array2d.dylib'内の 'process_array'という名前のポイントを作成します。 at JoshServer.Program.process_array(String [] a、Int32 b)

ご協力いただきありがとうございます。

+0

cppファイルは機能をエクスポートしていますか? dllexportのようなキーワードが必要です。 cppでdllを作成する方法を読んでください。 –

答えて

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)を削除して、コメントを追加いくつかの訂正。

+0

私はそれを追加すると、Mac上でコンパイラが狂ってしまう。私が読んだところからそれを取り出すと言うのですか? https://stackoverflow.com/questions/6838222/correct-way-to-export-a-dll-function-on-mac-osx?rq=1 –

+0

こんにちは、申し訳ありませんが、私はあなたがマックにあったことを認識していません。あなたは 'extern" C "'式を関数に追加しようと思いますか? –

+0

それは動作します!ありがとう –