c++.net-runtime

Unresolved external symbol CLRCreateInstance


I wrote some native C++ code with the help of the Internet that loads the .NET Runtime and invokes a method that has the signature: public static int MethodNameHere(String pwzArgument) from a class in a managed assembly.

However, I can't seem to compile the code using Visual Studio into a native DLL (64-bit), because there seems to be a linking issue with CLRCreateInstance(), even though I am including "MetaHost.h" in the .cpp source file.

Here is the entire code:

#include "MetaHost.h"

extern "C" {
    __declspec(dllexport) DWORD __stdcall CallManagedMethod(LPCWSTR managedDLLPath, LPCWSTR classPathInAssembly, LPCWSTR methodName, LPCWSTR parameter) {
        // Bind to the CLR runtime..
        ICLRMetaHost* pMetaHost = nullptr;
        CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*) &pMetaHost);

        ICLRRuntimeInfo* pRuntimeInfo = nullptr;
        pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*) &pRuntimeInfo);

        ICLRRuntimeHost* pClrRuntimeHost = nullptr;
        pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*) &pClrRuntimeHost);

        pClrRuntimeHost->Start();

        // Okay, the CLR is up and running in this (previously native) process.
        // Now call a method on our managed C# class library.
        DWORD dwRet = 0;
        pClrRuntimeHost->ExecuteInDefaultAppDomain(managedDLLPath, classPathInAssembly, methodName, parameter, &dwRet);

        // Don't forget to clean up.
        pClrRuntimeHost->Release();

        pRuntimeInfo->Release();
        pMetaHost->Release();
        return dwRet;
    }
}

Any help?


Solution

  • A .h file does not solve a linking problem, it merely adds them. The MSDN article you linked to fumbles the usual way that include and link hints are documented, "Included as a resource" is quite unhelpful. In C++ you have to link mscoree.lib to get the symbol resolved. It is the import library for mscoree.dll and included in the SDK.

    Simplest way is to add #pragma comment(lib, "mscoree.lib") after your #include.