0

我创建了一个 WIN32 DLL 项目,它的 dllmain.cpp 如下;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

_declspec(dllexport) float RGBCompare()
{
    return 100;
}

我的目标是从 C# 项目中调用方法 RGBCompare,并且按照我之前提到的 dllexport 标记的规则。

在 C# 项目的另一边,我定义了一个入口点,如下所示;

namespace LogoFinderWrapper
{
    public class LogoFinder
    {
        [DllImport("LogoIdentifier.dll", EntryPoint = "RGBCompare")]
        private static extern float Api_RGBCompare();


        public static float RGBCompare()
        {
            return Api_RGBCompare();
        }
    }
}

当我调用 DLL 时,它会引发异常 System.EntryPointNotFoundException。

请问有人可以在这方面帮助我吗?

4

1 回答 1

1

您的本机代码是 C++,并且名称在导出之前已损坏。可能的解决方案:

  1. EntryPoint在参数中使用损坏的名称。dumpbin使用或 Dependency Viewer找出损坏的名称。
  2. 使用 .def 文件而不是__declspec(dllexport)控制导出哪些函数。
  3. 抑制extern "C"C++ 源代码中的修改。

最终选项如下所示:

extern "C" 
{
    __declspec(dllexport) float RGBCompare()
    {
        return 100;
    }
}
于 2013-11-07T16:16:47.603 回答