1

Bar.Work以下の C# サンプル コードを考えると、Cから静的メソッドを呼び出すのは非常に簡単です。 を取得し、クラスから を取得して呼び出すだけですMonoClass*MonoMethod*

を取得するMonoClass*には、Bar の名前空間を提供する必要があります。この場合は'sampleApp'、関数にパラメーターとして指定します。

MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");

問題は、のクラス名前空間MonoClass*がわからない場合、C でを取得するにはどうすればよいかということです。BarC からアセンブリ内の型のリストを取得する手段はありますか? mono の埋め込みサンプルに例が見つかりませんでした。

C# サンプル

namespace sampleApp 
{

  class Bar {
    public static void Work() {
       Console.WriteLine("Bar.Work called");
    }
  }

  class Program {
    public static void Main(string[] args) {
        Console.WriteLine("Program.Main called");
    } 
  }

}

Bar.WorkC からの呼び出し

#include <mono/jit/jit.h>
#include <mono/metadata/mono-config.h>
#include <mono/metadata/metadata.h>
#include <mono/metadata/appdomain.h>
#include <mono/metadata/class.h> 
#include <mono/metadata/assembly.h>
#include <mono/metadata/image.h>
#include <mono/metadata/object.h>
#include <mono/metadata/debug-helpers.h>

int main(int argc, char **argv) {

        mono_config_parse(NULL);
 
        MonoDomain *domain = mono_jit_init_version("app", "v4.0.30319");
        MonoAssembly *assembly = mono_domain_assembly_open(domain, "sampleApp.exe");  
        MonoImage *image = mono_assembly_get_image(assembly);  

        mono_jit_exec(domain, assembly, argc, argv);

        //how can I find Bar class if I don't know that it is under the sampleApp namespace?
        MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");

        MonoMethod *method = mono_class_get_method_from_name(klass, "Work", 0);
        
        void *params[1] = { NULL };
        mono_runtime_invoke(method, NULL, params, NULL); 

        mono_jit_cleanup(domain, assembly);

        return 0;
} 
4

1 に答える 1

2

Afaik、Unity はこれを解決するために固定関数を使用しています (Update()、Start())。これらは unity が呼び出す関数であり、呼び出されるスクリプトの他のすべての関数は、この事前定義された関数に含まれている必要があります。

これが、スクリプト名がクラス名と一致しなければならない理由の 1 つです。フォルダーを検索し、スクリプト名をクラス名として使用するだけです。

あなたが望んでいた答えではありませんが、これがこれに対する最良の解決策だと思います。

于 2014-03-08T11:45:16.980 に答える