如何在C#项目中调用WIN32 DLL - EntryPointNotFoundException

时间:2013-11-07 16:11:56

标签: c# winapi dll interop dllimport

我创建了一个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。

在这方面,请任何人帮助我吗?

1 个答案:

答案 0 :(得分:1)

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

  1. 使用EntryPoint参数中的受损名称。使用dumpbin或依赖关系查看器查找损坏的名称。
  2. 使用.def文件而不是__declspec(dllexport)来控制导出哪些功能。
  3. 在C ++源代码中禁止使用extern "C"进行修改。
  4. 最终选项如下:

    extern "C" 
    {
        __declspec(dllexport) float RGBCompare()
        {
            return 100;
        }
    }