2018-01-02 15:30:26 -05:00
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
2015-07-17 16:38:17 -04:00
using System ;
2015-07-22 14:00:30 -04:00
using System.Diagnostics ;
2015-07-17 16:38:17 -04:00
using System.IO ;
2015-08-06 15:55:44 -04:00
using System.Linq ;
2015-07-17 16:38:17 -04:00
using System.Reflection ;
namespace Tools.DotNETCommon
{
public static class AssemblyUtils
{
/// <summary>
/// Gets the original location (path and filename) of an assembly.
/// This method is using Assembly.CodeBase property to properly resolve original
/// assembly path in case shadow copying is enabled.
/// </summary>
/// <returns>Absolute path and filename to the assembly.</returns>
public static string GetOriginalLocation ( this Assembly ThisAssembly )
{
return new Uri ( ThisAssembly . CodeBase ) . LocalPath ;
}
2015-07-22 14:00:30 -04:00
/// <summary>
/// Version info of the executable which runs this code.
/// </summary>
public static FileVersionInfo ExecutableVersion
{
get
{
return FileVersionInfo . GetVersionInfo ( Assembly . GetEntryAssembly ( ) . GetOriginalLocation ( ) ) ;
}
}
2015-08-06 15:55:44 -04:00
/// <summary>
/// Installs an assembly resolver. Mostly used to get shared assemblies that we don't want copied around to various output locations as happens when "Copy Local" is set to true
/// for an assembly reference (which is the default).
/// </summary>
public static void InstallAssemblyResolver ( string PathToBinariesDotNET )
{
AppDomain . CurrentDomain . AssemblyResolve + = ( sender , args ) = >
{
// Name is fully qualified assembly definition - e.g. "p4dn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff968dc1933aba6f"
string AssemblyName = args . Name . Split ( ',' ) [ 0 ] ;
// Look for known assembly names we check into Binaries/DotNET/. Return null if we can't find it.
return (
from KnownAssemblyName in new [ ] { "RPCUtility.exe" , "Ionic.Zip.Reduced.dll" }
where AssemblyName . Equals ( Path . GetFileNameWithoutExtension ( KnownAssemblyName ) , StringComparison . InvariantCultureIgnoreCase )
let ResolvedAssemblyFilename = Path . Combine ( PathToBinariesDotNET , KnownAssemblyName )
// check if the file exists first. If we just try to load it, we correctly throw an exception, but it's a generic
// FileNotFoundException, which is not informative. Better to return null.
select File . Exists ( ResolvedAssemblyFilename ) ? Assembly . LoadFile ( ResolvedAssemblyFilename ) : null
) . FirstOrDefault ( ) ;
} ;
}
2015-07-22 14:00:30 -04:00
}
2015-07-17 16:38:17 -04:00
}