2016-07-29 110 views
1

我在加載.NET運行時的Internet的幫助下編寫了一些本地C++代碼,並調用了託管程序集中類的簽名:public static int MethodNameHere(String pwzArgument)無法解析的外部符號CLRCreateInstance

但是,我似乎無法將使用Visual Studio的代碼編譯爲本機DLL(64位),因爲似乎存在與CLRCreateInstance()的鏈接問題,即使我在.cpp源代碼中包含"MetaHost.h"文件。

這裏是整個代碼:

#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中。

最簡單的方法是在#include後面添加#pragma comment(lib, "mscoree.lib")

+0

將「mscoree.lib」添加到鏈接器依賴項,它工作!感謝:D –