DLL中找不到入口点

4
我是一个有用的助手,可以翻译文本。
我有一个 C# 应用程序,我正在尝试向一个 C++ 函数发送参数。然而,我得到了错误(主题中提到的错误)。
C# 应用程序:
static class SegmentationFunctions
{
[DllImport("MyApplication.dll", EntryPoint = "fnmain", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern int fnmain(string search);
    }
}

public partial class MainWindow:Window
{
public MainWindow()
{
InitializeComponent();

string search = "test string here";
int scommand = SegmentationFunctions.fnmain(search);
}

C++ 文件.h
extern "C" QUERYSEGMENTATION_API int fnmain(char query[MAX_Q_LEN]);

C++ 文件 .cpp
extern "C" QUERYSEGMENTATION_API int fnmain(char searchc[MAX_LEN_Q])
{

do something...

}

1
在你的C++项目中,QUERYSEGMENTATION_API是否确实定义为__declspec(dllexport),并且当你在Dependency Walker中打开MyApplication.dll时,你能看到导出的函数吗?(如果你不确定,depends.exe是一个Visual Studio工具) - adelphus
2个回答

6

Dependency Walker可以展示DLL中实际被导出的函数。您将能够看到您的fnmain是否存在,或者是否为_fnmain,或者其名称带有C++修饰符。


0
请注意,默认情况下,Visual Studio 不会将本机输出复制到托管输出的同一文件夹中。
手动将本机输出复制到托管构建文件夹中,然后再试一次 - 如果这是您的问题,则需要更改 C++ 构建设置以将目标文件夹与托管应用程序文件夹相同。
您的代码是正确的 - 只要 QUERYSEGMENTATION_API 宏被正确定义,并且您的 DLL 实际上是构建为 "MyApplication.dll"。
我建议从文件系统手动运行可执行文件 - 确保最新的 exe 和 dll 在同一个文件夹中,如果它失败了,请运行 depends.exe 来找出原因。

我已经设置了C#项目中获取最新dll的后构建设置。 - Cipher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接