1

私は手続き型アセット生成システムに取り組んでおり、実際に異なるアセットを再生成するだけでよいように、特定のアセットのソース ファイルが変更されたかどうかを検出できるようにしたいと考えています。

単純なリフレクションを使用してタイプのソース ファイルを取得する方法がないことをグーグルで調べたので、回避策を見つけようとしています。これが私がやっていることです:

  1. Directory.GetFiles を使用して、プロジェクト ディレクトリ内のすべての .cs ファイルのリストを取得します。
  2. CSharpCodeProvider.CompileAssemblyFromFile を使用して、各ファイルを独自のアセンブリにコンパイルします。
  3. modifiedAssembly.GetType(targetType.FullName) が存在する場合、それは targetType のソース ファイルです。

問題は、ステップ 2 で何の説明もなくコンパイル エラーが発生することです。

  • (0,0): エラー:
  • (0,0) : エラー : at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)
  • (0,0) : エラー : at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)

これは、現在のアセンブリまたはアプリ ドメイン、またはコンパイルしようとしている正確な型が既に含まれているものが原因である可能性があると思いますが、それは単なる推測です。これらのエラーの原因や回避方法を知っている人はいますか?

編集: ステップ 2 のメイン コードは次のとおりです。

private static readonly CSharpCodeProvider CodeProvider = new CSharpCodeProvider();
private static readonly CompilerParameters CompilerOptions = new CompilerParameters();

static SourceInterpreter()
{
    // We want a DLL in memory.
    CompilerOptions.GenerateExecutable = false;
    CompilerOptions.GenerateInMemory = true;

    // Add references for UnityEngine and UnityEditor DLLs.
    CompilerOptions.ReferencedAssemblies.Add(typeof(Application).Assembly.Location);
    CompilerOptions.ReferencedAssemblies.Add(typeof(EditorApplication).Assembly.Location);
}

private static Assembly CompileCS(string filePath, out CompilerErrorCollection errors)
{
    // Compile the assembly from the source script text.
    CompilerResults result = CodeProvider.CompileAssemblyFromFile(CompilerOptions, filePath);

    // Store any errors and warnings.
    errors = result.Errors;

    foreach (CompilerError e in errors)
    {
        if (!e.IsWarning) Debug.Log(e);
    }

    return result.CompiledAssembly;
}
4

1 に答える 1