private static IRemoteTechAPIv1 InitializeAPI()
{
SafeHouse.Logger.Log(string.Format("Looking for RemoteTech"));
var loadedAssembly = AssemblyLoader.loadedAssemblies.FirstOrDefault(a => a.assembly.GetName().Name.Equals(REMOTE_TECH_ASSEMBLY));
if (loadedAssembly == null) return null;
SafeHouse.Logger.Log(string.Format("Found RemoteTech! Version: {0}.{1}", loadedAssembly.versionMajor, loadedAssembly.versionMinor));
var type = loadedAssembly.assembly.GetTypes().FirstOrDefault(t => t.FullName.Equals(REMOTE_TECH_API)) ??
loadedAssembly.assembly.GetTypes().FirstOrDefault(t => t.FullName.Equals(ALT_REMOTE_TECH_API));
if (type == null) return null;
SafeHouse.Logger.Log(string.Format("Found API! {0} ", type.Name));
var methods = type.GetMethods();
var api = new RemoteTechAPI();
try
{
foreach (var property in api.GetType().GetProperties())
{
var method = methods.FirstOrDefault(m =>
{
if (m.Name.Equals(property.Name))
{
SafeHouse.Logger.Log(string.Format("Found Endpoint: {0}", m.Name));
return true;
}
return false;
});
if (method == null)
{
throw new ArgumentNullException(property.Name);
}
var del = Delegate.CreateDelegate(property.PropertyType, type, method.Name);
property.SetValue(api, del, null);
}
}
catch (Exception e)
{
SafeHouse.Logger.Log("Error creating RemoteTech interface: " + e);
return null;
}
SafeHouse.Logger.Log("RemoteTech interface successfully created.");
return api;
}