Здесь или здесь для полной версии, вы можете найти пример GRPC-проекта Hello World для Unity.Только первая версия, созданная для Unity и обернутая в DLL, прекрасно работает отлично в Unity IDE и Автономная сборка .Файлы Raw Grpc.Core правильно ссылаются на все в IDE, но у них есть проблема с Marshaling.
К сожалению, он не может получить сборку для UWP с бэкэндом IL2CPP.Unity создает проект и создает проект .sln.Но Visual Studio всегда выдает LNK2001 для свойств GRPC при окончательной компиляции.
Вот первые коды ошибок:
LNK2001 unresolved external _grpccsharp_init@0
LNK2001 unresolved external _grpccsharp_shutdonw@0
LNK2001 unresolved external _grpccsharp_version_string@0
...
Хорошо, благодаря @Sunius, я углубился в это немного больше,Есть несколько моментов, которые я собираюсь добавить к вопросу:
Существует два метода ссылки на extern методы в пакете GRPC C #.Они называются static и shared libs.
internal class DllImportsFromStaticLib
{
private const string ImportName = "__Internal";
[DllImport(ImportName)]
public static extern void grpcsharp_init();
[DllImport(ImportName)]
public static extern void grpcsharp_shutdown();
...
}
и
internal class DllImportsFromSharedLib
{
private const string ImportName = "grpc_csharp_ext";
[DllImport(ImportName)]
public static extern void grpcsharp_init();
[DllImport(ImportName)]
public static extern void grpcsharp_shutdown();
...
}
Я пытался проверить его с общим, яполучил другой файл ошибок компоновки, который немного отличается.
LNK2001 unresolved external _dlopen@8
LNK2001 unresolved external _dlsym@8
...
В двух отдельных методах методы extern подключаются к внутреннему интерфейсу:
public NativeMethods(DllImportsFromStaticLib unusedInstance)
{
this.grpccsharp_init = DllImportsFromStaticLib.grpccsharp_init;
this.grpccsharp_shutdown = DllImportsFromStaticLib.grpccsharp_shutdonw;
...
}
и
public NativeMethods(DllImportsFromSharedLib unusedInstance)
{
this.grpccsharp_init = DllImportsFromSharedLib.grpccsharp_init;
this.grpccsharp_shutdown = DllImportsFromSharedLib.grpccsharp_shutdonw;
...
}
И какой метод будет вызван, определяется здесь:
private static NativMethods LoadNativeMethodsUnity()
{
switch(PlatformApis.GetUnityRuntimePlatform())
{
case "IPhonePlayer":
return new NativeMethods(new NativeMethods.DllImportsFromStaticLib());
default:
return new NativeMethods(new NativeMethods.DllImportsFromSharedLib());
}
}
Некоторые обновления:
Благодаря @jsmouret, в Stub.c есть файл его GrpcGithub с поддельными методами, поэтому Linker больше не жалуется на методы Grpc_init.
Следующая ошибка: dlopen, dlsym, dlerror:
Сначала я попытался использовать ту же технику, Stub, но это не помогло в этом случае, или, возможно, я сделал это неправильно.
Благодаря @Sunius, я закомментировал все "__Internal" коды импорта dll.Поэтому я не получаю никаких ошибок dlopen, dlsym и dlerror.
Следующая ошибка: это происходит изнутри приложения, а не отладчика Visual Studio.Он говорит мне: « исключение: чтобы упорядочить управляемый метод, добавьте атрибут с именем« MonoPInvokeCallback »в определение метода. »
exception: error loading the embedded resource "Grpc.Core.roots.pem"
и
exception: To marshal a managed method, please add an attribute named 'MonoPInvokeCallback' to the method definition.
После того, как я погуглил, я знаю свои варианты, но вопрос в том, для какого метода я должен это делать?!