gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:40 24 4
gpt4 key购买 nike

我需要在 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 btw 的新手

最佳答案

那不是 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)
{
...
}

}

此接口(interface)不依赖于任何特定库的 std::string 实现,并且 C# 知道如何将 char* 参数作为 C 字符串。但是,内存管理更为复杂,因为您需要确定输出大小的上限并传入适当大小的缓冲区。

关于c# - 如何将 C dll 加载到 C# 代码中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15935741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com