Действительно ли возможно разместить CLR в программе C?

Процесс, упомянутый Anton & Alvar Корректен, если это все еще не работающий затем может быть две вещи

1>, загруженный файл может быть поврежден.

2> у Вас нет разрешения файла в том каталоге.

Еще одна вещь проверка JDK установлен в Вашей системе или нет?

6
задан David Brown 29 August 2009 в 02:06
поделиться

1 ответ

Как подсказывают приведенные выше комментарии, существует набор COM API для размещения CLR , и вы должны иметь возможность вызывать эти COM API из C и C ++.

В качестве примера ниже приведен небольшой фрагмент (непроверенного) кода C, который показывает, как запустить среду CLR и выполнить статический метод класса в управляемой сборке (которая принимает строку в качестве аргумента и возвращает целое число). Ключевым отличием этого кода от его аналога на C ++ является определение COBJMACROS и использование макросов _ (например, ICLRRuntimeHost_Start ) для вызова COM-интерфейса CLR-хостинга. (Обратите внимание, что COBJMACROS должен быть определен до #include 'ing mscoree. h , чтобы убедиться, что эти служебные макросы определены.)

#include <windows.h>

#define COBJMACROS
#include <mscoree.h>

int main(int argc, char **argv)
{
    HRESULT status;
    ICLRRuntimeHost *Host;
    BOOL Started;
    DWORD Result;

    Host = NULL;
    Started = FALSE;

    status = CorBindToRuntimeEx(
                 NULL,
                 NULL,
                 0,
                 &CLSID_CLRRuntimeHost,
                 &IID_ICLRRuntimeHost,
                 (PVOID *)&Host
                 );
    if (FAILED(status)) {
        goto cleanup;
    }

    status = ICLRRuntimeHost_Start(Host);
    if (FAILED(status)) {
        goto cleanup;
    }

    Started = TRUE;

    status = ICLRRuntimeHost_ExecuteInDefaultAppDomain(
                 Host,
                 L"c:\\path\\to\\assembly.dll",
                 L"MyNamespace.MyClass",
                 L"MyMethod",
                 L"some string argument to MyMethod",
                 &Result
                 );
    if (FAILED(status)) {
        goto cleanup;
    }

    // inspect Result
    // ...

cleanup:
    if (Started) {
        ICLRRuntimeHost_Stop(Host);
    }

    if (Host != NULL) {
        ICLRRuntimeHost_Release(Host);
    }

    return SUCCEEDED(status) ? 0 : 1;
}

Этот образец должен работать с .NET 2.0+, хотя похоже, что .NET 4.0 (еще не выпущенный) отказался от некоторых из этих API в пользу новый набор API-интерфейсов для размещения среды CLR . (И если вам это нужно для работы с .NET 1.x, вам нужно использовать ICorRuntimeHost вместо ICLRRuntimeHost.)

10
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: