ProxyをUnityで実装2024/01/17に公開C#Unitytechはじめにこのライブラリの解説記事です。ccさんのこちらの記事をご覧ください。読んだ前提で話を進めます。この.NET8移行でしか動かないというこのライブラリをUnityに使えるようにしようということで作りました。UnsafeAccessorを自前で実装する.NET8の再現PrivateProxyは.NET8のUnsafeAccessorという機能を用いているわけですが、2024/1/17現在Unityでは使えません。y);しかし、.NET8以前でも使えるみちがあります。ILではprivateだろうがinternalだろうがアクセスできます(コンパイラがチェックしないので)。Codeで押さえます。Unityで扱うならILPostProcessorがあるので、Mono.Cecilで関数を書き換えてやれば、OKです。PlatformsはEditorのみである必要がある。独自プロセスで動いており、.NETのversionが古く、SpanやIndex型などの新しい型や機能は実行時エラーとなる。ILを扱うのはつらいですけど、ここまではそこまで大変ではなかったです。genericsもILではできそうだったので、できるとこまで実装しようと思いました。class対応ここは意外と簡単で、UnsafeAccessorにtypeof(TargetClass)を書き込むだけで、ILPostProcessで受け取るだけで簡単でした。Generic関数対応Generic関数をMono.Cecilで呼び出す方法がちょっと複雑だったので書いておきます。Mono.Cecilちょっとはわかる人向け元となるMethodReferenceは普通に作り、ParametersもGenericParametersもこのMethodReferenceに追加する。その後これをもとにGenericInstanceMethodを作成し、GenericArgumentsはここに追加する。Class対応ここがILPostProcessorで一番躓きました。Classの定義のGenericParametersを使うことでとりあえず動きました。Methodは未対応です。足して、コンストラクタや、AsPrivateProxy()を消すだけ、簡単。Generic対応これがやはり難関でした。Genericsの\<T\>とかを追加するのはややこしいだけで別に難しくないですけど、つまづきポイントがたくさんありました。UnboundedGenericな型からはMemberが取れない。UnboundedGenericな型とはList<>やDictionary<,>みたいなやつですね。属性に書くときはこの状態で書きますが、GetMembersしても何も取れません。ITypeSymbol.OriginalDefinitionから定義を持ってくることでMemberがとれます。GenericParameterはPublicではないGenericParameterのDeclaredAccessibilityはNotApplicableである。ConstraintsもとれるGenerics対応するならConstraintsも対応しなければなりません。INamedTypeSymbol.TypeParametersもしくはIMethodSymbol.TypeParametersをとり、そこからさらにConstraintTypesをとることができます。unmanagedするとちゃんとIsUnmanagedがtrueになるので、同様にclass、structもかけました。fieldが対応してない!!じゃあILでなんとかして見せましょう。前にこれを解決する方法は記事にしています。https://zenn.dev/aakei/articles/3bcc5c11bab60fしかし、これでは手間がかかります。ライブラリと導入してすぐ解決とはなりません。classを使うことはできません。Editorから実行時mscorlibを渡そうと思うわけですが、そもそも別プロセスなので、受け渡しはファイルと一度経由する必要があります。名前空間なども使えません。Pathはどう取得しましょうか。pathEnvironment.CurrentDirectroryで取得できますので、そこでやり取りします。上手くいかない状況やより良い方法があったら教えてくださいこれで実行時mscorlibを取得できたので、ByRefernce<T>を見つけ、自分で定義したByRefernce<T>のFieldDefeinitionに加えて、参照の授受もILで書いて、ついに完成!!最後にライブラリを書いている途中でPCが壊れるトラブルもありつつ、完成まで大変でした。mscorlibやGenericsなど不満はまだあるので、ご意見ください。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。