Не удается импортировать библиотеку

119
14 января 2022, 15:10

Запускаю следующий код:

#pragma region Includes and Imports
#include <windows.h>
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")
// Import mscorlib.tlb (Microsoft Common Language Runtime Class Library).
#import "mscorlib.tlb" raw_interfaces_only              \
    high_property_prefixes("_get","_put","_putref")     \
    rename("ReportEvent", "InteropServices_ReportEvent")\
rename("or", "InteropServices_or")
using namespace mscorlib;
#pragma endregion

HRESULT CallToManagedRT(
    PCWSTR pszVersion,
    PCWSTR pszAssemblyPath,
    PCWSTR pszClassName,
    PCWSTR pszClassStaticMethodName,
    PCWSTR pszClassMethodArg)
{
    HRESULT hr;
    DWORD dwRet;
    ICLRMetaHost *pMetaHost = NULL;
    ICLRRuntimeInfo *pRuntimeInfo = NULL;

    ICLRRuntimeHost *pClrRuntimeHost = NULL;
    wprintf(L"DEBUG: Passed for Execution: %s %s %s %s %s\n",
        pszVersion, pszAssemblyPath, pszClassName, pszClassStaticMethodName, pszClassMethodArg);

    wprintf(L"DEBUG: Load and start the .NET runtime %s \n", pszVersion);
    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
    if (FAILED(hr))
    {
        wprintf(L"ERROR: CLRCreateInstance failed w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }


    IEnumUnknown *installedRuntimes;
    hr = pMetaHost->EnumerateInstalledRuntimes(&installedRuntimes);
    if (FAILED(hr))
    {
        wprintf(L"ERROR: ICLRMetaHost::EnumerateInstalledRuntimes failed w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }
    {
        ICLRRuntimeInfo *runtimeInfo = NULL;
        ULONG fetched = 0;
        while ((hr = installedRuntimes->Next(1, (IUnknown **)&runtimeInfo, &fetched)) == S_OK && fetched > 0) {
            wchar_t versionString[20];
            DWORD versionStringSize = 20;
            hr = runtimeInfo->GetVersionString(versionString, &versionStringSize);
            if (versionStringSize >= 2) {
                wprintf(L"DEBUG: Available CLR Version : %s\n", versionString);
            }
        }
    }
    hr = pMetaHost->GetRuntime(pszVersion, IID_PPV_ARGS(&pRuntimeInfo));
    if (FAILED(hr))
    {
        wprintf(L"ERROR: ICLRMetaHost::GetRuntime failed w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }

    BOOL fLoadable;
    hr = pRuntimeInfo->IsLoadable(&fLoadable);
    if (FAILED(hr))
    {
        wprintf(L"ERROR: ICLRRuntimeInfo::IsLoadable failed w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }
    if (!fLoadable)
    {
        wprintf(L"ERROR: .NET runtime %s cannot be loaded\n", pszVersion);
        goto Cleanup;
    }

    hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost,
        IID_PPV_ARGS(&pClrRuntimeHost));
    if (FAILED(hr))
    {
        wprintf(L"ERROR: ICLRRuntimeInfo::GetInterface failed w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }

    hr = pClrRuntimeHost->Start();
    if (FAILED(hr))
    {
        wprintf(L"ERROR: CLR failed to start w/hr 0x%08lx\n", hr);
        goto Cleanup;
    }

    wprintf(L"DEBUG: Load the assembly %s\n", pszAssemblyPath);

    hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
        pszClassName, pszClassStaticMethodName, pszClassMethodArg, &dwRet);
    if (FAILED(hr))
    {
        wprintf(L"ERROR: Failed to call %s(%s) w/hr 0x%08lx\n", pszClassStaticMethodName, pszClassMethodArg, hr);
        goto Cleanup;
    }

    wprintf(L"DEBUG: Call %s.%s(\"%s\") => %d\n", pszClassName, pszClassStaticMethodName,
        pszClassMethodArg, dwRet);
Cleanup:
    if (pMetaHost)
    {
        pMetaHost->Release();
        pMetaHost = NULL;
    }
    if (pRuntimeInfo)
    {
        pRuntimeInfo->Release();
        pRuntimeInfo = NULL;
    }
    if (pClrRuntimeHost)
    {

        pClrRuntimeHost->Release();
        pClrRuntimeHost = NULL;
    }
    return hr;
}

Ошибка: 1>MSVCRTD.lib(exe_main.obj) : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы _main т ЇєэъЎшш "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)

Думаю что не удалось подключить библиотеку mscorlib.tlb? Сам этот файл не находит. Должен ли он находить его вообще?

Answer 1

"Запускаю" на компиляцию а не на выполнение, я полагаю? Тут ошибка редактора связей, который при сборке по-умолчанию ищет точку входа "main" а её и нет. Нужны специальные указания компилятору, поищите файл проекта рядом с исходным кодом, и именно его открывайте студией, а не cpp-шник.

READ ALSO
Обход Bitmap по пиксельно

Обход Bitmap по пиксельно

Есть такой код сохранения скриншотаЕсть битмап и хотелось бы обойти его в цикле попиксельно

72
Как обратиться к методам второго потока из другого диалогового окна

Как обратиться к методам второго потока из другого диалогового окна

Создал диалоговое окно "X" из главного окнаСоздал второй поток в диалоговом окне "X"

73
Скрытие группы столбцов в GridView

Скрытие группы столбцов в GridView

Создал форму с группой чекбоксов(36 штук)Необходимо, чтобы при выборе любого чекбокса его название сохранялось в лист ToHide

89