1

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です。

4

1 に答える 1

0

投稿したコードについてもう少し詳しく説明することをお勧めします。投稿したコードでは、「...」が正しく実装されていると仮定すると、未定義のパラメーターが 1 つある静的メソッドを実行しています。

少なくとも代わりにこれを行う必要があります:

void* args[1];

args[0] = mono_string_new(domain, msg.UTF8String);

mono_runtime_invoke (method, NULL, args, NULL);

あなたが投稿したコードはほとんど有効ではないため、実際のコードからこの質問への転記は不十分だったと推測できます。

http://www.mono-project.com/Embedding_Mono#Creating_objectsのコードは、Mono Strings が out または ref ではない場合に渡す方法を示しています。

于 2012-05-22T00:16:18.440 に答える