Unable to find an entry point when calling C++ dll in C#

30,977

You need to use extern "C" when you export your function so that you suppress C++ name mangling. And you also should not try to p/invoke to members of a class. Use free functions instead:

extern "C" {
    __declspec(dllexport) int GiveMeNumber(int i)
    {
        return i;
    }
}

On the managed side your DllImport attribute is all wrong. Don't use SetLastError which is for Win32 APIs only. Don't bother setting CharSet if there are not text parameters. No need for ExactSpelling. And the calling convention is presumably Cdecl.

[DllImport("KingFuncDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int GiveMeNumber(int i);
Share:
30,977
King Chan
Author by

King Chan

Current Software Architecture mainly with .NET technology and Azure. I also have 10+ years experience as a full-stack developer/team leader, designed and developed numerous in-house desktop application/mobile application/web service. Currently locate in Tokyo, Japan and open for remote-work for any country.

Updated on July 09, 2022

Comments

  • King Chan
    King Chan almost 2 years

    I am trying to learn P/Invoke, so I created a simple dll in C++

    KingFucs.h:

    namespace KingFuncs
    {
        class KingFuncs
        {
        public:
            static __declspec(dllexport) int GiveMeNumber(int i);
        };
    }
    

    KingFuns.cpp:

    #include "KingFuncs.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace KingFuncs
    {
        int KingFuncs::GiveMeNumber(int i)
        {
            return i;
        }
    }
    

    So it does compile, then I copied this dll into my WPF's debug folder, with code:

    [DllImport("KingFuncDll.dll", EntryPoint = "GiveMeNumber", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern int GiveMeNumber(
                  int i
                  );
    

    And calling it in button click:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        int num = GiveMeNumber(123);
    }
    

    But it gives me exception:

    Unable to find an entry point named 'GiveMeNumber' in DLL 'KingFuncDll.dll'.

    Really.... what have I done wrong... It obviously able to find the DLL, otherwise would be another exception. But my method name is exactly the same.... I can't think of other reason.

  • King Chan
    King Chan about 12 years
    Thanks, it worked. But it is not possible to call a function of a class? (This is my first time using extern "C", I thought I always need to define function within class in C++)
  • David Heffernan
    David Heffernan about 12 years
    You do not need to define a function within a class in C++. Old fashioned C functions are just fine.