csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.0 KiB
89 lines
3.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Avalonia.DesignerSupport.Tests
|
|
{
|
|
public class Checker : MarshalByRefObject
|
|
{
|
|
private string _appDir;
|
|
private IntPtr _window;
|
|
|
|
public void DoCheck(string baseAsset, string xamlText)
|
|
{
|
|
_appDir = new FileInfo(baseAsset).Directory.FullName;
|
|
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
|
|
foreach (var asm in Directory.GetFiles(_appDir).Where(f => f.ToLower().EndsWith(".dll") || f.ToLower().EndsWith(".exe")))
|
|
try
|
|
{
|
|
Assembly.LoadFrom(asm);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
}
|
|
var dic = new Dictionary<string, object>();
|
|
var api = new DesignerApi(dic) { OnResize = OnResize, OnWindowCreated = OnWindowCreated };
|
|
LookupStaticMethod("Avalonia.DesignerSupport.DesignerAssist", "Init").Invoke(null, new object[] { dic });
|
|
|
|
api.UpdateXaml2(new DesignerApiXamlFileInfo
|
|
{
|
|
Xaml = xamlText,
|
|
AssemblyPath = baseAsset
|
|
}.Dictionary);
|
|
if (_window == IntPtr.Zero)
|
|
throw new Exception("Something went wrong");
|
|
|
|
SendMessage(_window, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
|
|
}
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
|
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
|
|
|
|
public const uint WM_CLOSE = 0x0010;
|
|
|
|
private void OnWindowCreated(IntPtr lastIntPtr)
|
|
{
|
|
_window = lastIntPtr;
|
|
}
|
|
|
|
private void OnResize()
|
|
{
|
|
}
|
|
|
|
|
|
static Type LookupType(params string[] names)
|
|
{
|
|
var asms = AppDomain.CurrentDomain.GetAssemblies();
|
|
foreach (var asm in asms)
|
|
{
|
|
foreach (var name in names)
|
|
{
|
|
var found = asm.GetType(name, false, true);
|
|
if (found != null)
|
|
return found;
|
|
}
|
|
}
|
|
throw new TypeLoadException("Unable to find any of types: " + string.Join(",", names));
|
|
}
|
|
|
|
static MethodInfo LookupStaticMethod(string typeName, string method)
|
|
{
|
|
var type = LookupType(typeName);
|
|
var methods = type.GetMethods();
|
|
return methods.First(m => m.Name == method);
|
|
}
|
|
|
|
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
|
{
|
|
string assemblyPath = Path.Combine(_appDir, new AssemblyName(args.Name).Name + ".dll");
|
|
if (File.Exists(assemblyPath) == false) return null;
|
|
Assembly assembly = Assembly.LoadFrom(assemblyPath);
|
|
return assembly;
|
|
}
|
|
}
|
|
}
|
|
|