Мне нужно вызвать метод, объявленный в библиотеке C # из кода C ++ на Mac. Я использую .Net Core Framework 2.0.x (2.0.3, 2.0.4).
Чтобы это работало, я звоню coreclr_initialize
который успешно работает и возвращает 0
, Я тогда звоню coreclr_create_delegate
передавая необходимые аргументы, как указано ниже:
auto no_del = []( auto x ) { (void)(x); };
auto csharp_runIt = std::unique_ptr<csharp_runIt_t, decltype(no_del)>(nullptr, no_del);
int status = coreclr_create_delegate (
hostHandle,
domainId,
assemblyName.c_str(),
entryPointType.c_str(),
entryPointName.c_str(),
reinterpret_cast<void**>(&csharp_runIt)
);
Вот, hostHandle
а также domainId
получены от coreclr_initialize
, Остальные значения: assemblyName
(имя dll), entryPointType
(название класса) и entryPointName
(имя функции).
Запуск его возвращает отрицательное значение с шестнадцатеричным кодом: 0x80070002
,
Я также передаю имя библиотеки, имя класса и имя метода в качестве аргументов.
Поскольку не многие попробовали это, не так много помощи доступно онлайн.
Хорошо, поэтому я понял, что было не так. Библиотека .NetCore находилась в пространстве имен и, таким образом, coreclr_create_delegate
не был создан.
Поэтому не используйте пространство имен или не используйте его при вызове делегата C ++.
Код .Netcore должен выглядеть примерно так:
//namespace samplelibrary //This was causing error
//{
public class SampleClass
{
public static string MyFunc()
{
return "arrived";
}
}
//}
Вам необходимо указать полное имя для этого класса, если оно не находится в глобальном пространстве имен. Например, вам нужно установить entryPointType
в samplelibrary.SampleClass
Вот.