0

我需要在 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 的入口点。为什么会这样?我是 C 的新手

4

1 回答 1

3

那不是 C DLL,那是 C++ DLL。C 和 C++不是同一种语言。特别是,C++ 具有名称修饰功能,因此导出到 DLL 的函数名称是修饰的。

出于这个原因,我强烈建议您避免在 DLL 中使用 C++ 导出。如果您只使用 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 字符串。但是,内存管理更复杂,因为您需要确定输出大小的上限并传入适当大小的缓冲区。

于 2013-04-10T20:36:50.097 回答