【问题标题】:How to call WIN32 DLL in C# project - EntryPointNotFoundException如何在 C# 项目中调用 WIN32 DLL - EntryPointNotFoundException
【发布时间】:2013-11-07 16:11:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# winapi dll interop dllimport


    【解决方案1】:

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

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

    最终的选项如下所示:

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

    【讨论】:

    • 另一种解决方案:使用 .def 文件
    • 感谢大卫,选项 #2 有效。还要感谢@manuell 的建议。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多