Objective-C側からUnityC#スクリプトを呼び出そうとしています。voidパラメータを持つ関数は機能します。反対側のスクリプトがJavascriptの場合、文字列パラメーターを持つ関数は機能します。
反対側のスクリプトがC#の場合、文字列パラメーターを持つ関数はクラッシュします。クラッシュはBAD_EXECです。
パラメータを正しくマーシャリングしていないと確信しています。Web上にはこれに関するドキュメントはあまりありません。
Embedding Monoを読み、Githubで本当に古い例を見てきました。
http://www.mono-project.com/Embedding_Mono https://github.com/mono/mono/tree/master/samples/embed
タイプと関数は次のように宣言されます。
typedef void* MonoDomain;
typedef void* MonoAssembly;
typedef void* MonoImage;
typedef void* MonoClass;
typedef void* MonoObject;
typedef void* MonoMethodDesc;
typedef void* MonoMethod;
typedef void* MonoString;
typedef int gboolean;
MonoDomain* mono_domain_get();
MonoAssembly* mono_domain_assembly_open(MonoDomain* domain, const char *assemblyName);
MonoImage* mono_assembly_get_image(MonoAssembly* assembly);
MonoMethodDesc* mono_method_desc_new(const char* methodString, gboolean useNamespace);
MonoMethodDesc* mono_method_desc_free(MonoMethodDesc* desc);
MonoMethod* mono_method_desc_search_in_image(MonoMethodDesc* methodDesc, MonoImage* image);
MonoObject* mono_runtime_invoke(MonoMethod* method, void* obj, void** params, MonoObject** exc);
MonoClass* mono_class_from_name (MonoImage *image, const char* name_space, const char *name);
MonoString* mono_string_new(MonoDomain* domain, const char* str);
次に、変数が宣言されます。
@interface UnityObject : NSObject
{
MonoDomain* domain;
NSString* assemblyPath;
MonoAssembly* monoAssembly;
MonoImage* monoImage;
MonoMethodDesc* runChallengeDesc;
MonoMethod* runChallengeMethod;
}
@end
そして、initで:
- (id)init
{
if ((self = [super init]))
{
assemblyPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Data/Managed/Assembly-CSharp-firstpass.dll"];
domain = mono_domain_get();
monoAssembly = mono_domain_assembly_open(domain, assemblyPath.UTF8String);
monoImage = mono_assembly_get_image(monoAssembly);
runChallengeDesc = mono_method_desc_new("Marshal:RunChallenge(string)", FALSE);
runChallengeMethod = mono_method_desc_search_in_image(runChallengeDesc, monoImage);
mono_method_desc_free(runChallengeDesc);
}
return self;
}
上記はすべて期待どおりに機能します。
次に、メソッドが呼び出されます。
NSString *msg = @"Some message string";
MonoString *str = mono_string_new(domain, msg.UTF8String);
void *args[1];
args[0] = &str;
if (runChallengeMethod)
mono_runtime_invoke(runChallengeMethod, NULL, args, NULL);
パラメータを正しくマーシャリングしていないと確信しています。クラッシュはBAD_EXECです。