pCYSl5EDgo / UniEnumExtension

Unity Editor Extension which lets enum-types be much faster & efficient.
Other
58 stars 1 forks source link

エディタの初期化時にAssemblyResolutionExceptionが発生する。 #2

Open harumas opened 3 years ago

harumas commented 3 years ago

Unity内に外部アセンブリが存在する際に、エディタの初期化時に毎回AssemblyResolutionExceptionが発生します。

エラー文

AssemblyResolutionException: Failed to resolve assembly: 'DOTween, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name, Mono.Cecil.ReaderParameters parameters) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.DefaultAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataResolver.Resolve (Mono.Cecil.TypeReference type) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleDefinition.Resolve (Mono.Cecil.TypeReference type) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.TypeReference.Resolve () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.Mixin.CheckedResolve (Mono.Cecil.TypeReference self) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.GetConstantType (Mono.Cecil.TypeReference constant_type, System.Object constant) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddConstant (Mono.Cecil.IConstantProvider owner, Mono.Cecil.TypeReference type) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddParameter (System.UInt16 sequence, Mono.Cecil.ParameterDefinition parameter, Mono.Cecil.ParamTable table) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddParameters (Mono.Cecil.MethodDefinition method) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddMethod (Mono.Cecil.MethodDefinition method) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddMethods (Mono.Cecil.TypeDefinition type) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddType (Mono.Cecil.TypeDefinition type) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.AddTypes () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.BuildTypes () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.BuildModule () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.MetadataBuilder.BuildMetadata () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleWriter+<>c.<BuildMetadata>b__2_0 (Mono.Cecil.MetadataBuilder builder, Mono.Cecil.MetadataReader _) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleDefinition.Read[TItem,TRet] (TItem item, System.Func`3[T1,T2,TResult] read) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleWriter.BuildMetadata (Mono.Cecil.ModuleDefinition module, Mono.Cecil.MetadataBuilder metadata) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleWriter.Write (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleWriter.WriteModule (Mono.Cecil.ModuleDefinition module, Mono.Disposable`1[T] stream, Mono.Cecil.WriterParameters parameters) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleDefinition.Write (System.IO.Stream stream, Mono.Cecil.WriterParameters parameters) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleDefinition.Write (Mono.Cecil.WriterParameters parameters) (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
Mono.Cecil.ModuleDefinition.Write () (at <58b86858c52b4b5fbb6efedd16c9c16a>:0)
UniEnumExtension.EnumExtender.Dispose () (at Library/PackageCache/unienumextension@6a6629b95a/Core/EnumExtensionFacade.cs:136)
UniEnumExtension.Program.PostCompiled () (at Library/PackageCache/unienumextension@6a6629b95a/UI/Program.cs:41)

今回の場合、DOTweenというアセットのアセンブリが解決できていませんが、Photonなど外部のアセンブリであれば同様のエラーが発生します。 また、メニューのManagedPluginSettingsからチェックボックスを外してもエラーは治りませんでした。

なにか解決策に繋がりそうな情報がありましたら教えていただきたいです!

pCYSl5EDgo commented 3 years ago

疑問ありがとうございます。

Unity Editor起動時なのかどうかを判別するAPIをUnity Technologiesが提供していない(少なくとも私は知りません)ために生じるエラーですね。 Editor起動時であるかどうかさえわかればこのエラーは回避できますが、ご存知でしょうか?

harumas commented 3 years ago

調べてみたところ、確かにUnity Editor起動時を直接判別する方法はありませんでした。 [InitializeOnLoad]属性はありますが、それだとコードのコンパイル時にも実行されてしまいます。 なので、ScriptableSingletonを使って回数(またはbool)を記録しておくことで、初回起動を判別できるようです。

//サンプルコード
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public static class Startup {
    class StartUpData : ScriptableSingleton<StartUpData> {
        int callCount;
        public bool IsStartUp() => callCount++ == 0;
    }

    static Startup() {
        if (!StartUpData.instance.IsStartUp()) return;

        Debug.Log("Editor Initialized");
    }
}

お役に立てたら幸いです!