2016-07-29 2 views
1

Я написал некоторый собственный C++-код с помощью Интернета, который загружает .NET Runtime и вызывает метод, который имеет подпись: public static int MethodNameHere(String pwzArgument) из класса в управляемой сборке.Неразрешенный внешний символ CLRCreateInstance

Однако, я не могу показаться, что для компиляции кода с помощью Visual Studio в родной DLL (64-разрядная версия), потому что, как представляется, проблема связывания с CLRCreateInstance(), хотя я в том числе "MetaHost.h" в источнике .cpp файл.

Вот весь код:

#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; 
    } 
} 

Любая помощь?

ответ

1

Файл .h не решает проблему связывания, он просто добавляет их. Документ MSDN, который вы связали с путаным обычным способом, включая ссылки и ссылки, задокументирован, «Включен в качестве ресурса» совершенно бесполезен. В C++ вам нужно связать mscoree.lib, чтобы получить разрешенный символ. Это библиотека импорта для mscoree.dll и включена в SDK.

Самый простой способ - добавить #pragma comment(lib, "mscoree.lib") после вашего #include.

+0

Добавлено «mscoree.lib» в зависимости от компоновщика, и это сработало! Спасибо –

Смежные вопросы