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

时间:2013-04-10 20:26:31

标签: 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>
#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的入口点吗?我是C btw的新手

1 个答案:

答案 0 :(得分: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字符串。但是,内存管理更复杂,因为你需要弄清楚输出有多大的上限并传入适当大小的缓冲区。