C# 如何将C dll加载到C代码中?

C# 如何将C dll加载到C代码中?,c#,c,C#,C,我需要在C语言编写的程序中使用一些函数。为了测试,我定义了以下内容: 这是我的.h文件: namespace amt { class AMT_EXPORT FaceRecognition { public: std::string amt_test_string(std::string in); }; }; 这是我的.cpp文件: #include <memory.h> #include <string

我需要在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;
}

但是我得到一个错误,说它找不到名为amt\u test\u string的入口点。为什么?我是一个新手,在C BTW

< P>这不是一个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字符串。但是,内存管理更复杂,因为你需要找出输出将要有多大的上限,并传递到一个适当大小的BuffER。

< P>这不是一个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字符串。然而,内存管理更为复杂,因为您需要计算出输出大小的上限,并传入适当大小的bufer