I would like to use external C++ libraries in a .Net standard project. I have read something about p/invoke and unmanaged code so I started from something really simple. I created a simple C++ project, the following are the header file and related implementation:
Sum.h
#ifndef SUM_H_INCLUDED
#define SUM_H_INCLUDED
#ifdef _WIN32
# define EXPORTIT __declspec( dllexport )
#else
# define EXPORTIT
#endif
namespace Something
{
  namespace Really
  {
    namespace Simple
    {
      class SimpleClass
      {
      public:
        SimpleClass();
        double SumValues( double x, double y);
      };
  #pragma region Object handlers
      // create instance
      extern "C"
      {
        EXPORTIT SimpleClass* CreateInstance();
      }
      //Invoke Sum Method
      extern "C"
      {
        EXPORTIT double InvokeSumValues( SimpleClass*instance, double x, double y);
      }
      // Delete instance
      extern "C"
      {
        EXPORTIT void InstanceDelete(SimpleClass*instance);
      }
  #pragma endregion
    }
  }
}
#endif
Sum.cpp
#include "Sum.h"
using namespace Something::Really::Simple;
SimpleClass::SimpleClass()
{
  // empty constructor
}
double SimpleClass::SumValues(double x, double y) {
  return x + y;
}
#pragma region Class handlers
SimpleClass* CreateInstance()
{
  return new SimpleClass;
}
double InvokeSumValues(SimpleClass*inst, double x, double y )
{
  return inst->SumValues( x, y);
}
void InstanceDelete(SimpleClass*inst)
{
  delete inst;
}
#pragma endregion
If I try to build the project I get some
LNK2019 unresolved external symbol
The only way I found to solve that, is to move the methods implementation from the .cpp to the .h file, but I would like to keep the method definitions and the related implementation separated.
Basically my question is, how I get it to work?
Just for the sake of completeness, this is how I would invoke the C++ from the C# implementation:
[DllImport( @"Simple.dll", EntryPoint = "CreateInstance", CallingConvention = CallingConvention.Cdecl )]
private static extern IntPtr CreateInstance();
[DllImport( @"Simple.dll", EntryPoint = "InvokeSumValues", CallingConvention = CallingConvention.Cdecl )]
private static extern IntPtr InvokeSumValues(IntPtr inst, double x, double y);
private static void SumValues(double x, double y )
    {
        IntPtr inst = CreateInstance();
        InvokeSumValues( inst, x, y );
    }
