2013-04-10 4 views
0

Мне нужно использовать некоторые функции в C-программе. Для тестирования я определил следующее:Как загрузить C dll в код C#?

Это мой .h файл:

namespace amt 
{ 
    class AMT_EXPORT FaceRecognition 
    { 
     public: 
      std::string amt_test_string(std::string in); 
    }; 
}; 

Это мой .cpp файл:

#include <memory.h> 
#include <string> 
#include <iostream> 
#include <fstream> 
#include "api_shared.h" 
#include <sys/stat.h> 

using namespace std; 

std::string amt::FaceRecognition::amt_test_string (std::string in) 
{ 
    std::string s="in: "+in; 
    std::cout<<s<<std::endl; 

    return s; 
} 

Я пытаюсь вызвать метод как это:

const string str = "C:\\minimal.dll"; 
[DllImport(str)] 
public static extern string amt_test_string(string input); 
static void Main(string[] args) 
{ 
    string myinput = "12"; 
    string myoutput = ""; 
    myoutput = amt_test_string(myinput); 
    Console.WriteLine(myoutput); 
    Console.Read(); 

} 

Но я получаю сообщение о том, что он не может найти точку входа с именем amt_test_string..why so? Я новичок в C btw

ответ

3

Это не C DLL, это C++ DLL. C и C++ - нет на том же языке. В частности, C++ имеет имя mangling, поэтому имя функции, которое экспортируется в DLL, равно , украшенному.

Я настоятельно рекомендую вам избежать экспорта C++ в вашу DLL по этой причине. Если вы используете только экспорт C, имя символа будет предсказуемым (т. Е. Не будет зависеть от конкретных деталей того, как ваш компилятор C++ украшает имена), и вам не придется беспокоиться о различиях во время выполнения, например о том, как реализуется ваша стандартная библиотека C++ std::string.

Я бы рекомендовал ваш взгляд экспорта DLL, как это:

extern "C" // This says that any functions within the block have C linkage 
{ 

// Input is 'in', output gets stored in the 'out' buffer, which must be 'outSize' 
// bytes long 
void DLLEXPORT amt_FaceRecogniztion_amt_test_string(const char *in, char *out, size_t outSize) 
{ 
    ... 
} 

} 

Этот интерфейс не зависит от std::string реализации какой-либо конкретной библиотеки, и C# знает, как боевые char* параметры как строки C. Однако управление памятью более сложное, так как вам нужно выяснить верхнюю границу того, насколько велика будет выходная информация, и передать ее в подходящий размер.

Смежные вопросы