2023-06-21 13:28:15 -04:00
using System ;
using System.IO ;
using System.Linq ;
using System.Reflection ;
using Rider.Editor.Util ;
using UnityEngine ;
using Debug = UnityEngine . Debug ;
namespace Packages.Rider.Editor
{
internal class RiderInitializer
{
public void Initialize ( string editorPath )
{
var assembly = EditorPluginInterop . EditorPluginAssembly ;
if ( EditorPluginInterop . EditorPluginIsLoadedFromAssets ( assembly ) )
{
Debug . LogError ( $"Please delete {assembly.Location}. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider's settings, search and uncheck 'Automatically install and update Rider's Unity editor plugin'." ) ;
return ;
}
if ( assembly ! = null ) // already loaded RIDER-92419
{
return ;
}
// for debugging rider editor plugin
if ( RiderPathUtil . IsRiderDevEditor ( editorPath ) )
{
LoadEditorPluginForDevEditor ( editorPath ) ;
}
else
{
var relPath = "../../plugins/rider-unity/EditorPlugin" ;
if ( SystemInfo . operatingSystemFamily = = OperatingSystemFamily . MacOSX )
relPath = "Contents/plugins/rider-unity/EditorPlugin" ;
var baseDir = Path . Combine ( editorPath , relPath ) ;
var dllFile = new FileInfo ( Path . Combine ( baseDir , $"{EditorPluginInterop.EditorPluginAssemblyName}.dll" ) ) ;
if ( ! dllFile . Exists )
dllFile = new FileInfo ( Path . Combine ( baseDir ,
$"{EditorPluginInterop.EditorPluginAssemblyNameFallback}.dll" ) ) ;
if ( dllFile . Exists )
{
var bytes = File . ReadAllBytes ( dllFile . FullName ) ;
assembly = AppDomain . CurrentDomain . Load ( bytes ) ; // doesn't lock assembly on disk
if ( PluginSettings . SelectedLoggingLevel > = LoggingLevel . TRACE )
Debug . Log ( $"Rider EditorPlugin loaded from {dllFile.FullName}" ) ;
EditorPluginInterop . InitEntryPoint ( assembly ) ;
}
else
{
Debug . Log ( $"Unable to find Rider EditorPlugin {dllFile.FullName} for Unity " ) ;
}
}
}
private static void LoadEditorPluginForDevEditor ( string editorPath )
{
var file = new FileInfo ( editorPath ) ;
if ( SystemInfo . operatingSystemFamily = = OperatingSystemFamily . MacOSX )
file = new FileInfo ( Path . Combine ( editorPath , "rider-dev.bat" ) ) ;
if ( ! file . Exists )
{
Debug . Log ( $"Unable to determine path to EditorPlugin from {file}" ) ;
return ;
}
var dllPath = File . ReadLines ( file . FullName ) . FirstOrDefault ( ) ;
if ( dllPath = = null )
{
Debug . Log ( $"Unable to determine path to EditorPlugin from {file}" ) ;
return ;
}
var dllFile = new FileInfo ( dllPath ) ;
if ( ! dllFile . Exists )
{
Debug . Log ( $"Unable to find Rider EditorPlugin {dllPath} for Unity " ) ;
return ;
}
var assembly = AppDomain . CurrentDomain . Load ( AssemblyName . GetAssemblyName ( dllFile . FullName ) ) ;
if ( PluginSettings . SelectedLoggingLevel > = LoggingLevel . TRACE )
Debug . Log ( $"Rider EditorPlugin loaded from {dllFile.FullName}" ) ;
EditorPluginInterop . InitEntryPoint ( assembly ) ;
}
}
}