Search code examples
c#dllimportentrypointnotfoundexcept

EntryPointNotFoundException when binding C++ dll in C#


I try to bind a simple c++ dll shown in http://msdn.microsoft.com/en-us/library/ms235636.aspx in my c# console app, but I get a EntryPointNotFoundException for Add within dll at runtime. My test class is

namespace BindingCppDllExample
{
    public class BindingDllClass
    {
        [DllImport("MathFuncsDll.dll")]
        public static extern double Add(double a, double b);
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            double a = 2.3;
            double b = 3.8;
            double c = BindingDllClass.Add(a, b);

            Console.WriteLine(string.Format("{0} + {1} = {2}", a, b, c));
        }
    }
}

What is not correct?


Solution

  • You could try declaring the functions outside of a class and also exporting them with extern "C":

    Header:

    // MathFuncsDll.h
    namespace MathFuncs
    {
        // Returns a + b
        extern "C" __declspec(dllexport) double Add(double a, double b);
    
        // Returns a - b
        extern "C" __declspec(dllexport) double Subtract(double a, double b);
    
        // Returns a * b
        extern "C" __declspec(dllexport) double Multiply(double a, double b);
    
        // Returns a / b
        // Throws DivideByZeroException if b is 0
        extern "C" __declspec(dllexport) double Divide(double a, double b);
    }
    

    Implementation:

    // MyMathFuncs.cpp
    #include "MathFuncsDll.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace MathFuncs
    {
        double Add(double a, double b)
        {
            return a + b;
        }
    
        double Subtract(double a, double b)
        {
            return a - b;
        }
    
        double Multiply(double a, double b)
        {
            return a * b;
        }
    
        double Divide(double a, double b)
        {
            if (b == 0)
            {
                throw new invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    

    Calling code:

    namespace BindingCppDllExample
    {
        public class BindingDllClass
        {
            [DllImport("MathFuncsDll.dll")]
            public static extern double Add(double a, double b);
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                double a = 2.3;
                double b = 3.8;
                double c = BindingDllClass.Add(a, b);
    
                Console.WriteLine(string.Format("{0} + {1} = {2}", a, b, c));
            }
        }
    }