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

本文关键字:代码 加载 dll | 更新日期: 2023-09-27 18:08:26

我需要在一个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_testrongtring的入口点。为什么如此?我是C的新手,顺便说一下

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

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