#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