Page 1 of 1

Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 05:11
by chorome
  • OS:Windows11
  • Unityバージョン:2022.3.5f1
  • Arborバージョン:3.9.8
Arborと特定のdll(Unity環境では参照が足りないdll)と併用するとReflectionを用いたライブラリが一部動作しなくなるようです。

手元の環境では以下の組み合わせで上記の現象が発生しました。
Unity環境では参照が足りないdll:UnitGenerator
Reflectionを用いたライブラリ:Rider Flow、netcode for GameObject(のNetworkManagerEditor)

■再現方法
1. Unityプロジェクトを新規作成
2. UnitGeneratorのdllをインポート、dllのインスペクターでAny Platform・Include Platformをすべて無効にし、「RoslynAnalyzer」ラベルをつける
3. RiderFlowをインポート
4. RiderFlowの各機能が動作することを確認する
5. Arborをインポート
6. RiderFlowが動作しなくなる

■調査結果
Arborの入ったプロジェクトだと AppDomain.CurrentDomain.GetAssemblies() で返ってくる Assembly[] に UnitGenerator の Assembly が含まれるようになります(Arborが入ってないプロジェクトだと含まれない)。UnitGenerator の Assembly の GetTypes() を呼ぶと以下の例外が発生します。

Code: Select all

ReflectionTypeLoadException: Exception of type 'System.Reflection.ReflectionTypeLoadException' was thrown.
Could not load file or assembly 'Microsoft.CodeAnalysis, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
UnitGenerator は Unity 以外の環境でも利用することが想定されたライブラリなので、他の環境で必要な参照が何かしらが足りてないのかもしれません。ただ、この問題は UnitGenerator が AppDomain.CurrentDomain.GetAssemblies() に含まれなければ気にする必要はないはずの問題です。

Arborの入ったプロジェクトだと AppDomain.CurrentDomain.GetAssemblies() に UnitGenerator が含まれるようになるのは、ArborEditor.ClassList でプロジェクト内の dll を読み込んでいるのが原因のようでした。

■個人的推察
ArborEditor.ClassList.IsValidPlugin(PluginImporter pluginImporter) の中の if (!pluginImporter.GetCompatibleWithEditor()) って実は if (pluginImporter.GetCompatibleWithEditor()) の間違いだったりしませんか?
(コードの意図とか全然理解できてないのでまったく違ったこと言ってたらすみません…)

Re: Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 05:23
by chorome
純粋にArborの問題という訳でもない件で申し訳ないのですが、こういう現象がありましたという報告です🙇

Re: Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 06:06
by caitsithware
ご報告ありがとうございます。

RoslynAnalyzer(SourceGenerator)専用DLLをインポートしていると起きる問題のようですね。
以下の方法を試していただけますか。

暫定対処方法
  1. Assets/Plugins/Arbor/Internal/Editor/Reflection/ClassList.csを開く
  2. ファイル先頭あたりに以下のコードを追加

    Code: Select all

    using System.Linq;
    
  3. 151行目あたりに以下のコードを追加

    Code: Select all

    var labels = AssetDatabase.GetLabels(pluginImporter);
    if (labels != null && labels.Contains("RoslynAnalyzer"))
    {
    	return false;
    }
    

Re: Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 07:13
by chorome
早急なご確認ありがとうございます。

ご提案いただいた対応方法ですとPackageManager経由でインポートされたdllについては対処できないのかもしれません…。

UnityTransportの Unity.Transport.Analyzer.dll が読み込まれてしまうようです。

Re: Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 07:36
by caitsithware
その場合はラベルがついていないようですね。
どのプラットフォームにも含まれないDLLを除外する必要もありそうです。

暫定対処方法
  1. 再びAssets/Plugins/Arbor/Internal/Editor/Reflection/ClassList.csを開く
  2. 157行目から166行目にある以下のコードを削除

    Code: Select all

    if (pluginImporter.GetCompatibleWithAnyPlatform())
    {
    	return true;
    }
    
    if (!pluginImporter.GetCompatibleWithEditor())
    {
    	return true;
    }
    

Re: Arborと特定のdllを併用するとReflectionを用いたライブラリが一部動作しなくなる

Posted: 2023/07/28 09:25
by chorome
ReflectionTypeLoadExceptionでなくなりました!ありがとうございます!!