There are a variety of ways to interop with .NET from C++, some of which don't require /clr. However, none of them will help avoid
we need to deploy the assemblies on machines that don't have the full DotNet Framework Runtimes
If you have an assembly containing MSIL, you'll need .NET Framework installed (at least the Client Profile). That's because these assemblies do not contain executable code, only a portable description that serves as input to the .NET runtime's Just-in-Time (JIT) compiler.
There are a couple toolchains that can compile from C# to native code, with varying levels of required runtime support, but none that would be considered "production quality" when working with arbitrary .NET Framework libraries. (.NET Native would work for libraries targeted to WinRT). And there are significant limits to the code that these tools can process (for example, reflection is severely limited, only introspection, no runtime code generation or even composition of types). These limits would apply to not just your code but all your dependencies.
If you are deploying the version of .NET required by your assembly (Note: question was edited to say .NET Core, instead of just "don't have .NET"), then you can use the Hosting API which says "this tutorial will cover constructing a C++ application to host .NET Core"
In the process, you'll dynamically link (GetProcAddress) functions such as coreclr_initialize, coreclr_execute_assembly, and coreclr_create_delegate. The latter of these is described as "Creates a function pointer to a managed method."
It appears that this API does not support calling constructors, because the designers considered it trivial to write a factory function as a static method, which coreclr_create_delegate does support.