All 5 phases of the open-source Decal rebuild: Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil) Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters - Decal.Core, DecalControls, DecalRender, D3DService Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL Phase 4: DenAgent WinForms tray application Phase 5: WiX installer and build script 25 C# projects building with 0 errors. Native C++ projects require VS 2022 + Windows SDK (x86). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
149 lines
3.2 KiB
C#
149 lines
3.2 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Xml;
|
|
using Decal.Interop.Core;
|
|
using Decal.Interop.Inject;
|
|
using Decal.Interop.Render;
|
|
|
|
namespace Decal.Adapter.Wrappers;
|
|
|
|
[CLSCompliant(true)]
|
|
public sealed class PluginHost : HostBase
|
|
{
|
|
private IPluginSite2 mySite;
|
|
|
|
private IPluginSite myOldSite;
|
|
|
|
[CLSCompliant(false)]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public IPluginSite2 Underlying => mySite;
|
|
|
|
public DecalWrapper Decal
|
|
{
|
|
get
|
|
{
|
|
if (base.MyDecal == null)
|
|
{
|
|
base.MyDecal = new DecalWrapper(mySite.Decal);
|
|
}
|
|
return base.MyDecal;
|
|
}
|
|
}
|
|
|
|
public HooksWrapper Actions => CoreManager.Current.Actions;
|
|
|
|
public RenderServiceWrapper Render
|
|
{
|
|
get
|
|
{
|
|
if (base.MyRender == null)
|
|
{
|
|
base.MyRender = new RenderServiceWrapper((RenderService)GetObject("services\\DecalRender.RenderService"));
|
|
}
|
|
return base.MyRender;
|
|
}
|
|
}
|
|
|
|
internal PluginHost(PluginSite2 pSite)
|
|
{
|
|
mySite = pSite;
|
|
base.MyDecal = new DecalWrapper(mySite.Decal);
|
|
myOldSite = (IPluginSite)mySite.PluginSite;
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
try
|
|
{
|
|
_ = base.IsDisposed;
|
|
if (myOldSite != null)
|
|
{
|
|
Marshal.ReleaseComObject(myOldSite);
|
|
myOldSite = null;
|
|
}
|
|
if (mySite != null)
|
|
{
|
|
Marshal.ReleaseComObject(mySite);
|
|
mySite = null;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
base.Dispose(disposing);
|
|
}
|
|
}
|
|
|
|
public object GetObject(string path)
|
|
{
|
|
return ((dynamic)mySite).get_Object(path);
|
|
}
|
|
|
|
public int GetKeyboardMapping(string name)
|
|
{
|
|
return myOldSite.QueryKeyboardMap(name);
|
|
}
|
|
|
|
internal static void LoadViewHandler(IViewHandler handler)
|
|
{
|
|
if (ViewWrapper.ScanViews(handler))
|
|
{
|
|
ViewWrapper.ScanControls(handler);
|
|
ViewWrapper.ScanReferences(handler);
|
|
}
|
|
}
|
|
|
|
public ViewHandler LoadViewHandler(Type handlerType)
|
|
{
|
|
ViewHandler obj = (ViewHandler)Activator.CreateInstance(handlerType, this);
|
|
LoadViewHandler(obj);
|
|
obj.LoadComplete();
|
|
return obj;
|
|
}
|
|
|
|
public ViewWrapper LoadViewResource(string resourcePath)
|
|
{
|
|
Assembly callingAssembly = Assembly.GetCallingAssembly();
|
|
return LoadViewResource(resourcePath, callingAssembly);
|
|
}
|
|
|
|
public ViewWrapper LoadViewResource(string resourcePath, Assembly resourceAssembly)
|
|
{
|
|
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0022: Expected O, but got Unknown
|
|
if (null == resourceAssembly)
|
|
{
|
|
throw new ArgumentNullException("resourceAssembly");
|
|
}
|
|
Stream manifestResourceStream = resourceAssembly.GetManifestResourceStream(resourcePath);
|
|
XmlDocument val = new XmlDocument();
|
|
val.Load(manifestResourceStream);
|
|
return LoadView(((XmlNode)val).OuterXml);
|
|
}
|
|
|
|
public ViewWrapper LoadView(XmlElement viewSchema)
|
|
{
|
|
if (viewSchema == null)
|
|
{
|
|
throw new ArgumentNullException("viewSchema");
|
|
}
|
|
return LoadView(((XmlNode)viewSchema).OuterXml);
|
|
}
|
|
|
|
public ViewWrapper LoadView(string viewSchema)
|
|
{
|
|
View view = myOldSite.LoadView(viewSchema);
|
|
if (view != null)
|
|
{
|
|
return new ViewWrapper(view);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public object ComFilter(string progId)
|
|
{
|
|
return ((dynamic)mySite).get_Object("services\\DecalNet.NetService\\" + progId);
|
|
}
|
|
}
|