Загрузите сборку C # в C / C mscoree.ошибки tlh

#c

#c

Вопрос:

Я хотел загрузить сборку C # в проект на C / C , потому что собственные загрузчики кажутся мне классными, но есть проблема с mscorlib.tlh . Прежде всего, я следую примеру codeproject (первый фрагмент). Я создал пустой проект C , и в первый момент, казалось, он не был найден mscorlib.tlb , но затем, после изменения версий SDK / наборов инструментов платформы, он, однако, нашел его, но есть некоторые ошибки.

Текущие настройки:

Версия SDK для Windows: 10.0.17763.0

Набор инструментов платформы: Visual Studio 2017 (v141)

Ошибки:

 1>main.cpp
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12974): error C2143: syntax error: missing ')' before '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12974): error C2143: syntax error: missing ';' before '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12974): error C2059: syntax error: '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12974): error C2059: syntax error: ')'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12974): error C2238: unexpected token(s) preceding ';'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12977): error C2143: syntax error: missing ')' before '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12977): error C2143: syntax error: missing ';' before '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12977): error C2059: syntax error: '||'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12977): error C2059: syntax error: ')'
1>c:usersadmindesktopnetloadernetloaderdebugmscorlib.tlh(12977): error C2238: unexpected token(s) preceding ';'
1>Done building project "NETLoader.vcxproj" -- FAILED.
  

Скриншот:

ошибки

Я не знаю, что не так с mscorlib в последней версии SDK. Есть и другие неотвеченные связанные потоки.

Ответ №1:

Я исправил проблему. Это было из-за того, что mscorlib.tlh использовалось or для имени переменной. Все, что я сделал, это добавил auto_rename при импорте mscorlib.tlb.

 #import "mscorlib.tlb" auto_rename
  

Ответ №2:

Возможно, это может вам помочь:https://github.com/voxsoftware/jxshell.dotnet4/blob/master/ClrHost/ClrHost.cpp

Проект предназначен для использования в VFP через DLL, но может дать вам представление о том, как загрузить CLR с c

Посмотрите на важные части: ClrLoad:

 void WINAPI ClrLoad()
{
    if (ClrVersion.Length() >= 2 amp;amp; ClrVersion[0] == 'v' amp;amp; ClrVersion[1] == '2') {
        ClrLoadLegacyVersion2();
        return;
    }

    // Tutorial on how this works: https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0
    VerifyHresult(CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(amp;pMetaHost)));
    VerifyHresult(pMetaHost->GetRuntime(ClrVersion, IID_PPV_ARGS(amp;pRuntimeInfo)));
    BOOL fLoadable;
    VerifyHresult(pRuntimeInfo->IsLoadable(amp;fLoadable));
    if (!fLoadable) throw HresultException("CLR is not loadable.");
    VerifyHresult(pRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(amp;spRuntimeHost)));
    VerifyHresult(spRuntimeHost->Start());
    CComPtr<IUnknown> spAppDomainThunk;
    VerifyHresult(spRuntimeHost->GetDefaultDomain(amp;spAppDomainThunk));
    VerifyHresult(spAppDomainThunk->QueryInterface(IID_PPV_ARGS(amp;spDefAppDomain)));

  

И после ClrLoad загрузите сборку с диска:

 /// *** Creates an instance of a class from an assembly referenced through its disk path
IDispatch* WINAPI ClrCreateInstanceFrom(char *AssemblyFileName, char *className, char *ErrorMessage, DWORD *dwErrorSize)
{
    try {
        if (!spDefAppDomain)
            ClrLoad();
        CComPtr<_ObjectHandle> spObjectHandle;
        VerifyHresult(spDefAppDomain->CreateInstanceFrom(_bstr_t(AssemblyFileName), _bstr_t(className), amp;spObjectHandle));
        CComVariant VntUnwrapped;
        VerifyHresult(spObjectHandle->Unwrap(amp;VntUnwrapped));
        return VntUnwrapped.pdispVal;
    } catch (HresultException ex) {
        *dwErrorSize = ex.GetMessage(ErrorMessage);
        return NULL;
    }
}
  

Комментарии:

1. Проблема не в коде, а в том, что mscorlib.tlh выдает эти ошибки. Я также проверил код из MSDN.

2. Я понимаю вас, но я знаю, что код, который я опубликовал, работает (я использовал в своем проекте). Вы можете использовать в качестве ссылки для написания своего кода, загружая сборку с c