diff --git a/src/Avalonia.MicroCom/Avalonia.MicroCom.csproj b/src/Avalonia.MicroCom/Avalonia.MicroCom.csproj
index 599d95e67a..e784bda105 100644
--- a/src/Avalonia.MicroCom/Avalonia.MicroCom.csproj
+++ b/src/Avalonia.MicroCom/Avalonia.MicroCom.csproj
@@ -4,6 +4,7 @@
true
+
false
all
diff --git a/src/Avalonia.MicroCom/CallbackBase.cs b/src/Avalonia.MicroCom/CallbackBase.cs
index 6783ebe3dc..49d589a5fc 100644
--- a/src/Avalonia.MicroCom/CallbackBase.cs
+++ b/src/Avalonia.MicroCom/CallbackBase.cs
@@ -1,4 +1,6 @@
-namespace Avalonia.MicroCom
+using MicroCom.Runtime;
+
+namespace Avalonia.MicroCom
{
public abstract class CallbackBase : IUnknown, IMicroComShadowContainer
{
diff --git a/src/Avalonia.MicroCom/IMicroComExceptionCallback.cs b/src/Avalonia.MicroCom/IMicroComExceptionCallback.cs
deleted file mode 100644
index 08f20339ec..0000000000
--- a/src/Avalonia.MicroCom/IMicroComExceptionCallback.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using System;
-
-namespace Avalonia.MicroCom
-{
- public interface IMicroComExceptionCallback
- {
- void RaiseException(Exception e);
- }
-}
diff --git a/src/Avalonia.MicroCom/IMicroComShadowContainer.cs b/src/Avalonia.MicroCom/IMicroComShadowContainer.cs
deleted file mode 100644
index a33d3a9811..0000000000
--- a/src/Avalonia.MicroCom/IMicroComShadowContainer.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace Avalonia.MicroCom
-{
- public interface IMicroComShadowContainer
- {
- MicroComShadow Shadow { get; set; }
- void OnReferencedFromNative();
- void OnUnreferencedFromNative();
- }
-}
diff --git a/src/Avalonia.MicroCom/IUnknown.cs b/src/Avalonia.MicroCom/IUnknown.cs
deleted file mode 100644
index 0dc4106423..0000000000
--- a/src/Avalonia.MicroCom/IUnknown.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using System;
-
-namespace Avalonia.MicroCom
-{
- public interface IUnknown : IDisposable
- {
- }
-}
diff --git a/src/Avalonia.MicroCom/LocalInterop.cs b/src/Avalonia.MicroCom/LocalInterop.cs
deleted file mode 100644
index 785f4e03a5..0000000000
--- a/src/Avalonia.MicroCom/LocalInterop.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Avalonia.MicroCom
-{
- unsafe class LocalInterop
- {
- public static unsafe void CalliStdCallvoid(void* thisObject, void* methodPtr)
- {
- throw null;
- }
-
- public static unsafe int CalliStdCallint(void* thisObject, Guid* guid, IntPtr* ppv, void* methodPtr)
- {
- throw null;
- }
- }
-}
diff --git a/src/Avalonia.MicroCom/MicroComProxyBase.cs b/src/Avalonia.MicroCom/MicroComProxyBase.cs
deleted file mode 100644
index fe8a2bf9cf..0000000000
--- a/src/Avalonia.MicroCom/MicroComProxyBase.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-using System;
-using System.Runtime.ConstrainedExecution;
-using System.Runtime.InteropServices;
-using System.Threading;
-
-namespace Avalonia.MicroCom
-{
- public unsafe class MicroComProxyBase : CriticalFinalizerObject, IUnknown
- {
- private IntPtr _nativePointer;
- private bool _ownsHandle;
- private SynchronizationContext _synchronizationContext;
-
- public IntPtr NativePointer
- {
- get
- {
- if (_nativePointer == IntPtr.Zero)
- throw new ObjectDisposedException(this.GetType().FullName);
- return _nativePointer;
- }
- }
-
- public void*** PPV => (void***)NativePointer;
-
- public MicroComProxyBase(IntPtr nativePointer, bool ownsHandle)
- {
- _nativePointer = nativePointer;
- _ownsHandle = ownsHandle;
- _synchronizationContext = SynchronizationContext.Current;
- if(!_ownsHandle)
- GC.SuppressFinalize(this);
- }
-
- protected virtual int VTableSize => 3;
-
- public void AddRef()
- {
- LocalInterop.CalliStdCallvoid(PPV, (*PPV)[1]);
- }
-
- public void Release()
- {
- LocalInterop.CalliStdCallvoid(PPV, (*PPV)[2]);
- }
-
- public int QueryInterface(Guid guid, out IntPtr ppv)
- {
- IntPtr r = default;
- var rv = LocalInterop.CalliStdCallint(PPV, &guid, &r, (*PPV)[0]);
- ppv = r;
- return rv;
- }
-
- public T QueryInterface() where T : IUnknown
- {
- var guid = MicroComRuntime.GetGuidFor(typeof(T));
- var rv = QueryInterface(guid, out var ppv);
- if (rv == 0)
- return (T)MicroComRuntime.CreateProxyFor(typeof(T), ppv, true);
- throw new COMException("QueryInterface failed", rv);
- }
-
- public bool IsDisposed => _nativePointer == IntPtr.Zero;
-
- protected virtual void Dispose(bool disposing)
- {
- if(_nativePointer == IntPtr.Zero)
- return;
- if (_ownsHandle)
- {
- Release();
- _ownsHandle = false;
- }
- _nativePointer = IntPtr.Zero;
- GC.SuppressFinalize(this);
- }
-
- public void Dispose() => Dispose(true);
-
- public bool OwnsHandle => _ownsHandle;
-
- public void EnsureOwned()
- {
- if (!_ownsHandle)
- {
- GC.ReRegisterForFinalize(true);
- AddRef();
- _ownsHandle = true;
- }
- }
-
- private static readonly SendOrPostCallback _disposeDelegate = DisposeOnContext;
-
- private static void DisposeOnContext(object state)
- {
- (state as MicroComProxyBase)?.Dispose(false);
- }
-
- ~MicroComProxyBase()
- {
- if(!_ownsHandle)
- return;
- if (_synchronizationContext == null)
- Dispose();
- else
- _synchronizationContext.Post(_disposeDelegate, this);
- }
- }
-}
diff --git a/src/Avalonia.MicroCom/MicroComRuntime.cs b/src/Avalonia.MicroCom/MicroComRuntime.cs
deleted file mode 100644
index b9a56a69ba..0000000000
--- a/src/Avalonia.MicroCom/MicroComRuntime.cs
+++ /dev/null
@@ -1,143 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Runtime.InteropServices;
-
-namespace Avalonia.MicroCom
-{
- public static unsafe class MicroComRuntime
- {
- private static ConcurrentDictionary _vtables = new ConcurrentDictionary();
-
- private static ConcurrentDictionary> _factories =
- new ConcurrentDictionary>();
- private static ConcurrentDictionary _guids = new ConcurrentDictionary();
- private static ConcurrentDictionary _guidsToTypes = new ConcurrentDictionary();
-
- internal static readonly Guid ManagedObjectInterfaceGuid = Guid.Parse("cd7687c0-a9c2-4563-b08e-a399df50c633");
-
- static MicroComRuntime()
- {
- Register(typeof(IUnknown), new Guid("00000000-0000-0000-C000-000000000046"),
- (ppv, owns) => new MicroComProxyBase(ppv, owns));
- RegisterVTable(typeof(IUnknown), MicroComVtblBase.Vtable);
- }
-
- public static void RegisterVTable(Type t, IntPtr vtable)
- {
- _vtables[t] = vtable;
- }
-
- public static void Register(Type t, Guid guid, Func proxyFactory)
- {
- _factories[t] = proxyFactory;
- _guids[t] = guid;
- _guidsToTypes[guid] = t;
- }
-
- public static Guid GetGuidFor(Type type) => _guids[type];
-
- public static T CreateProxyFor(void* pObject, bool ownsHandle) => (T)CreateProxyFor(typeof(T), new IntPtr(pObject), ownsHandle);
- public static T CreateProxyFor(IntPtr pObject, bool ownsHandle) => (T)CreateProxyFor(typeof(T), pObject, ownsHandle);
-
- public static T CreateProxyOrNullFor(void* pObject, bool ownsHandle) where T : class =>
- pObject == null ? null : (T)CreateProxyFor(typeof(T), new IntPtr(pObject), ownsHandle);
-
- public static T CreateProxyOrNullFor(IntPtr pObject, bool ownsHandle) where T : class =>
- pObject == IntPtr.Zero ? null : (T)CreateProxyFor(typeof(T), pObject, ownsHandle);
-
- public static object CreateProxyFor(Type type, IntPtr pObject, bool ownsHandle) => _factories[type](pObject, ownsHandle);
-
- public static IntPtr GetNativeIntPtr(this T obj, bool owned = false) where T : IUnknown
- => new IntPtr(GetNativePointer(obj, owned));
- public static void* GetNativePointer(T obj, bool owned = false) where T : IUnknown
- {
- if (obj == null)
- return null;
- if (obj is MicroComProxyBase proxy)
- {
- if(owned)
- proxy.AddRef();
- return (void*)proxy.NativePointer;
- }
-
- if (obj is IMicroComShadowContainer container)
- {
- container.Shadow ??= new MicroComShadow(container);
- void* ptr = null;
- var res = container.Shadow.GetOrCreateNativePointer(typeof(T), &ptr);
- if (res != 0)
- throw new COMException(
- "Unable to create native callable wrapper for type " + typeof(T) + " for instance of type " +
- obj.GetType(),
- res);
- if (owned)
- container.Shadow.AddRef((Ccw*)ptr);
- return ptr;
- }
- throw new ArgumentException("Unable to get a native pointer for " + obj);
- }
-
- public static object GetObjectFromCcw(IntPtr ccw)
- {
- var ptr = (Ccw*)ccw;
- var shadow = (MicroComShadow)GCHandle.FromIntPtr(ptr->GcShadowHandle).Target;
- return shadow.Target;
- }
-
- public static bool IsComWrapper(IUnknown obj) => obj is MicroComProxyBase;
-
- public static object TryUnwrapManagedObject(IUnknown obj)
- {
- if (obj is not MicroComProxyBase proxy)
- return null;
- if (proxy.QueryInterface(ManagedObjectInterfaceGuid, out _) != 0)
- return null;
- // Successful QueryInterface always increments ref counter
- proxy.Release();
- return GetObjectFromCcw(proxy.NativePointer);
- }
-
- public static bool TryGetTypeForGuid(Guid guid, out Type t) => _guidsToTypes.TryGetValue(guid, out t);
-
- public static bool GetVtableFor(Type type, out IntPtr ptr) => _vtables.TryGetValue(type, out ptr);
-
- public static void UnhandledException(object target, Exception e)
- {
- if (target is IMicroComExceptionCallback cb)
- {
- try
- {
- cb.RaiseException(e);
- }
- catch
- {
- // We've tried
- }
- }
-
- }
-
- public static T CloneReference(this T iface) where T : IUnknown
- {
- var proxy = (MicroComProxyBase)(object)iface;
- var ownedPointer = GetNativePointer(iface, true);
- return CreateProxyFor(ownedPointer, true);
- }
-
- public static T QueryInterface(this IUnknown unknown) where T : IUnknown
- {
- var proxy = (MicroComProxyBase)unknown;
- return proxy.QueryInterface();
- }
-
- public static void UnsafeAddRef(this IUnknown unknown)
- {
- ((MicroComProxyBase)unknown).AddRef();
- }
-
- public static void UnsafeRelease(this IUnknown unknown)
- {
- ((MicroComProxyBase)unknown).Release();
- }
- }
-}
diff --git a/src/Avalonia.MicroCom/MicroComShadow.cs b/src/Avalonia.MicroCom/MicroComShadow.cs
deleted file mode 100644
index 765ff3b9ad..0000000000
--- a/src/Avalonia.MicroCom/MicroComShadow.cs
+++ /dev/null
@@ -1,177 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using System.Threading;
-
-namespace Avalonia.MicroCom
-{
- public unsafe class MicroComShadow : IDisposable
- {
- private readonly object _lock = new object();
- private readonly Dictionary _shadows = new Dictionary();
- private readonly Dictionary _backShadows = new Dictionary();
- private GCHandle? _handle;
- private volatile int _refCount;
- internal IMicroComShadowContainer Target { get; }
- internal MicroComShadow(IMicroComShadowContainer target)
- {
- Target = target;
- Target.Shadow = this;
- }
-
- internal int QueryInterface(Ccw* ccw, Guid* guid, void** ppv)
- {
- if (MicroComRuntime.TryGetTypeForGuid(*guid, out var type))
- return QueryInterface(type, ppv);
- else if (*guid == MicroComRuntime.ManagedObjectInterfaceGuid)
- {
- ccw->RefCount++;
- *ppv = ccw;
- return 0;
- }
- else
- return unchecked((int)0x80004002u);
- }
-
- internal int QueryInterface(Type type, void** ppv)
- {
- if (!type.IsInstanceOfType(Target))
- return unchecked((int)0x80004002u);
-
- var rv = GetOrCreateNativePointer(type, ppv);
- if (rv == 0)
- AddRef((Ccw*)*ppv);
- return rv;
- }
-
- internal int GetOrCreateNativePointer(Type type, void** ppv)
- {
- if (!MicroComRuntime.GetVtableFor(type, out var vtable))
- return unchecked((int)0x80004002u);
- lock (_lock)
- {
-
- if (_shadows.TryGetValue(type, out var shadow))
- {
- var targetCcw = (Ccw*)shadow;
- AddRef(targetCcw);
- *ppv = targetCcw;
- return 0;
- }
- else
- {
- var intPtr = Marshal.AllocHGlobal(Marshal.SizeOf());
- var targetCcw = (Ccw*)intPtr;
- *targetCcw = default;
- targetCcw->RefCount = 0;
- targetCcw->VTable = vtable;
- if (_handle == null)
- _handle = GCHandle.Alloc(this);
- targetCcw->GcShadowHandle = GCHandle.ToIntPtr(_handle.Value);
- _shadows[type] = intPtr;
- _backShadows[intPtr] = type;
- *ppv = targetCcw;
-
- return 0;
- }
- }
- }
-
- internal int AddRef(Ccw* ccw)
- {
- if (Interlocked.Increment(ref _refCount) == 1)
- {
- try
- {
- Target.OnReferencedFromNative();
- }
- catch (Exception e)
- {
- MicroComRuntime.UnhandledException(Target, e);
- }
- }
-
- return Interlocked.Increment(ref ccw->RefCount);
- }
-
- internal int Release(Ccw* ccw)
- {
- Interlocked.Decrement(ref _refCount);
- var cnt = Interlocked.Decrement(ref ccw->RefCount);
- if (cnt == 0)
- return FreeCcw(ccw);
-
- return cnt;
- }
-
- int FreeCcw(Ccw* ccw)
- {
- lock (_lock)
- {
- // Shadow got resurrected by a call to QueryInterface from another thread
- if (ccw->RefCount != 0)
- return ccw->RefCount;
-
- var intPtr = new IntPtr(ccw);
- var type = _backShadows[intPtr];
- _backShadows.Remove(intPtr);
- _shadows.Remove(type);
- Marshal.FreeHGlobal(intPtr);
- if (_shadows.Count == 0)
- {
- _handle?.Free();
- _handle = null;
- try
- {
- Target.OnUnreferencedFromNative();
- }
- catch(Exception e)
- {
- MicroComRuntime.UnhandledException(Target, e);
- }
- }
- }
-
- return 0;
- }
-
- /*
- Needs to be called to support the following scenario:
- 1) Object created
- 2) Object passed to native code, shadow is created, CCW is created
- 3) Native side has never called AddRef
-
- In that case the GC handle to the shadow object is still alive
- */
-
- public void Dispose()
- {
- lock (_lock)
- {
- List toRemove = null;
- foreach (var kv in _backShadows)
- {
- var ccw = (Ccw*)kv.Key;
- if (ccw->RefCount == 0)
- {
- toRemove ??= new List();
- toRemove.Add(kv.Key);
- }
- }
-
- if(toRemove != null)
- foreach (var intPtr in toRemove)
- FreeCcw((Ccw*)intPtr);
- }
- }
- }
-
- [StructLayout(LayoutKind.Sequential)]
- struct Ccw
- {
- public IntPtr VTable;
- public IntPtr GcShadowHandle;
- public volatile int RefCount;
- public MicroComShadow GetShadow() => (MicroComShadow)GCHandle.FromIntPtr(GcShadowHandle).Target;
- }
-}
diff --git a/src/Avalonia.MicroCom/MicroComVtblBase.cs b/src/Avalonia.MicroCom/MicroComVtblBase.cs
deleted file mode 100644
index 7092f8131a..0000000000
--- a/src/Avalonia.MicroCom/MicroComVtblBase.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-
-namespace Avalonia.MicroCom
-{
- public unsafe class MicroComVtblBase
- {
- private List _methods = new List();
- [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
- private delegate int AddRefDelegate(Ccw* ccw);
-
- [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
- private delegate int QueryInterfaceDelegate(Ccw* ccw, Guid* guid, void** ppv);
-
- public static IntPtr Vtable { get; } = new MicroComVtblBase().CreateVTable();
- public MicroComVtblBase()
- {
- AddMethod((QueryInterfaceDelegate)QueryInterface);
- AddMethod((AddRefDelegate)AddRef);
- AddMethod((AddRefDelegate)Release);
- }
-
- protected void AddMethod(void* f)
- {
- _methods.Add(new IntPtr(f));
- }
-
- protected void AddMethod(Delegate d)
- {
- GCHandle.Alloc(d);
- _methods.Add(Marshal.GetFunctionPointerForDelegate(d));
- }
-
- protected unsafe IntPtr CreateVTable()
- {
- var ptr = (IntPtr*)Marshal.AllocHGlobal((IntPtr.Size + 1) * _methods.Count);
- for (var c = 0; c < _methods.Count; c++)
- ptr[c] = _methods[c];
- return new IntPtr(ptr);
- }
-
- static int QueryInterface(Ccw* ccw, Guid* guid, void** ppv) => ccw->GetShadow().QueryInterface(ccw, guid, ppv);
- static int AddRef(Ccw* ccw) => ccw->GetShadow().AddRef(ccw);
- static int Release(Ccw* ccw) => ccw->GetShadow().Release(ccw);
- }
-}
diff --git a/src/Avalonia.Native/Avalonia.Native.csproj b/src/Avalonia.Native/Avalonia.Native.csproj
index 2001a2fcbc..4ceb1be340 100644
--- a/src/Avalonia.Native/Avalonia.Native.csproj
+++ b/src/Avalonia.Native/Avalonia.Native.csproj
@@ -6,7 +6,6 @@
true
net6.0;netstandard2.0
true
- Avalonia.MicroCom
diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs
index b45fe5559b..532893884a 100644
--- a/src/Avalonia.Native/AvaloniaNativePlatform.cs
+++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs
@@ -10,6 +10,7 @@ using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Rendering.Composition;
using JetBrains.Annotations;
+using MicroCom.Runtime;
namespace Avalonia.Native
{
diff --git a/src/Avalonia.Native/CallbackBase.cs b/src/Avalonia.Native/CallbackBase.cs
index 56f9505cb4..2d875dbc0e 100644
--- a/src/Avalonia.Native/CallbackBase.cs
+++ b/src/Avalonia.Native/CallbackBase.cs
@@ -2,6 +2,7 @@
using System.Runtime.ExceptionServices;
using Avalonia.MicroCom;
using Avalonia.Platform;
+using MicroCom.Runtime;
namespace Avalonia.Native
{
diff --git a/src/Avalonia.Native/NativeControlHostImpl.cs b/src/Avalonia.Native/NativeControlHostImpl.cs
index 2c9c1728d3..8a3488d95e 100644
--- a/src/Avalonia.Native/NativeControlHostImpl.cs
+++ b/src/Avalonia.Native/NativeControlHostImpl.cs
@@ -4,6 +4,7 @@ using Avalonia.MicroCom;
using Avalonia.Native.Interop;
using Avalonia.Platform;
using Avalonia.VisualTree;
+using MicroCom.Runtime;
namespace Avalonia.Native
{
diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj
index 1d265369fd..0d29bb91ea 100644
--- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj
+++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj
@@ -3,7 +3,6 @@
net6.0;netstandard2.0
true
Avalonia.Win32
- Avalonia.MicroCom
diff --git a/src/Windows/Avalonia.Win32/ClipboardImpl.cs b/src/Windows/Avalonia.Win32/ClipboardImpl.cs
index 7cf8b14bed..7e058cb052 100644
--- a/src/Windows/Avalonia.Win32/ClipboardImpl.cs
+++ b/src/Windows/Avalonia.Win32/ClipboardImpl.cs
@@ -7,6 +7,7 @@ using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Threading;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32
{
@@ -83,7 +84,7 @@ namespace Avalonia.Win32
while (true)
{
- var ptr = MicroCom.MicroComRuntime.GetNativeIntPtr(wrapper);
+ var ptr = wrapper.GetNativeIntPtr();
var hr = UnmanagedMethods.OleSetClipboard(ptr);
if (hr == 0)
@@ -107,7 +108,7 @@ namespace Avalonia.Win32
if (hr == 0)
{
- using var proxy = MicroCom.MicroComRuntime.CreateProxyFor(dataObject, true);
+ using var proxy = MicroComRuntime.CreateProxyFor(dataObject, true);
using var wrapper = new OleDataObject(proxy);
var formats = wrapper.GetDataFormats().ToArray();
return formats;
@@ -131,7 +132,7 @@ namespace Avalonia.Win32
if (hr == 0)
{
- using var proxy = MicroCom.MicroComRuntime.CreateProxyFor(dataObject, true);
+ using var proxy = MicroComRuntime.CreateProxyFor(dataObject, true);
using var wrapper = new OleDataObject(proxy);
var rv = wrapper.Get(format);
return rv;
diff --git a/src/Windows/Avalonia.Win32/DragSource.cs b/src/Windows/Avalonia.Win32/DragSource.cs
index 1159c5bfc9..53d4345c5e 100644
--- a/src/Windows/Avalonia.Win32/DragSource.cs
+++ b/src/Windows/Avalonia.Win32/DragSource.cs
@@ -3,6 +3,7 @@ using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Threading;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32
{
@@ -19,8 +20,8 @@ namespace Avalonia.Win32
using var src = new OleDragSource();
var allowed = OleDropTarget.ConvertDropEffect(allowedEffects);
- var objPtr = MicroCom.MicroComRuntime.GetNativeIntPtr(dataObject);
- var srcPtr = MicroCom.MicroComRuntime.GetNativeIntPtr(src);
+ var objPtr = MicroComRuntime.GetNativeIntPtr(dataObject);
+ var srcPtr = MicroComRuntime.GetNativeIntPtr(src);
UnmanagedMethods.DoDragDrop(objPtr, srcPtr, (int)allowed, out var finalEffect);
diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
index 9d1920498b..91e79c9670 100644
--- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
+++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
@@ -7,6 +7,7 @@ using System.Runtime.InteropServices.ComTypes;
using System.Text;
using Avalonia.MicroCom;
+using MicroCom.Runtime;
using Avalonia.Win32.Win32Com;
// ReSharper disable InconsistentNaming
diff --git a/src/Windows/Avalonia.Win32/OleContext.cs b/src/Windows/Avalonia.Win32/OleContext.cs
index c025d06fe7..e41423a334 100644
--- a/src/Windows/Avalonia.Win32/OleContext.cs
+++ b/src/Windows/Avalonia.Win32/OleContext.cs
@@ -5,6 +5,7 @@ using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.Win32.Interop;
using Avalonia.Win32.Win32Com;
+using MicroCom.Runtime;
namespace Avalonia.Win32
{
@@ -47,7 +48,7 @@ namespace Avalonia.Win32
return false;
}
- var trgPtr = MicroCom.MicroComRuntime.GetNativeIntPtr(target);
+ var trgPtr = target.GetNativeIntPtr();
return UnmanagedMethods.RegisterDragDrop(hwnd.Handle, trgPtr) == UnmanagedMethods.HRESULT.S_OK;
}
diff --git a/src/Windows/Avalonia.Win32/OleDataObject.cs b/src/Windows/Avalonia.Win32/OleDataObject.cs
index f7345b3ff7..90992d803f 100644
--- a/src/Windows/Avalonia.Win32/OleDataObject.cs
+++ b/src/Windows/Avalonia.Win32/OleDataObject.cs
@@ -10,7 +10,7 @@ using Avalonia.Input;
using Avalonia.MicroCom;
using Avalonia.Utilities;
using Avalonia.Win32.Interop;
-
+using MicroCom.Runtime;
using IDataObject = Avalonia.Input.IDataObject;
namespace Avalonia.Win32
diff --git a/src/Windows/Avalonia.Win32/OleDropTarget.cs b/src/Windows/Avalonia.Win32/OleDropTarget.cs
index 3d0d35228c..1c22fd025d 100644
--- a/src/Windows/Avalonia.Win32/OleDropTarget.cs
+++ b/src/Windows/Avalonia.Win32/OleDropTarget.cs
@@ -5,6 +5,7 @@ using Avalonia.Input.Raw;
using Avalonia.MicroCom;
using Avalonia.Platform;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
using DropEffect = Avalonia.Win32.Win32Com.DropEffect;
namespace Avalonia.Win32
diff --git a/src/Windows/Avalonia.Win32/Win32StorageProvider.cs b/src/Windows/Avalonia.Win32/Win32StorageProvider.cs
index bb1de56f2b..8cc0a380f9 100644
--- a/src/Windows/Avalonia.Win32/Win32StorageProvider.cs
+++ b/src/Windows/Avalonia.Win32/Win32StorageProvider.cs
@@ -12,6 +12,7 @@ using Avalonia.Platform.Storage;
using Avalonia.Platform.Storage.FileIO;
using Avalonia.Win32.Interop;
using Avalonia.Win32.Win32Com;
+using MicroCom.Runtime;
namespace Avalonia.Win32
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositedWindow.cs b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositedWindow.cs
index a09918a3a6..ef3de9fbe1 100644
--- a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositedWindow.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositedWindow.cs
@@ -6,6 +6,7 @@ using Avalonia.MicroCom;
using Avalonia.OpenGL;
using Avalonia.OpenGL.Egl;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT.Composition
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs
index 9a6bd9572a..8a41c00add 100644
--- a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs
@@ -12,6 +12,7 @@ using Avalonia.OpenGL.Angle;
using Avalonia.OpenGL.Egl;
using Avalonia.Rendering;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT.Composition
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUIEffectBase.cs b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUIEffectBase.cs
index ea75a2f311..32f44842f8 100644
--- a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUIEffectBase.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUIEffectBase.cs
@@ -2,6 +2,7 @@
using System.Linq;
using System.Runtime.InteropServices;
using Avalonia.MicroCom;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT.Composition
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs
index 4ed882552b..fc04dcda26 100644
--- a/src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs
@@ -6,6 +6,7 @@ using Avalonia.OpenGL.Egl;
using Avalonia.OpenGL.Surfaces;
using Avalonia.Utilities;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT.Composition
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/NativeWinRTMethods.cs b/src/Windows/Avalonia.Win32/WinRT/NativeWinRTMethods.cs
index 89cde01ff4..1794b022fe 100644
--- a/src/Windows/Avalonia.Win32/WinRT/NativeWinRTMethods.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/NativeWinRTMethods.cs
@@ -7,6 +7,7 @@ using System.Runtime.InteropServices;
using System.Threading;
using Avalonia.MicroCom;
using Avalonia.Win32.Interop;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT
{
diff --git a/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs b/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
index d2ec957b8e..1fde57fe38 100644
--- a/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
+++ b/src/Windows/Avalonia.Win32/WinRT/WinRTInspectable.cs
@@ -3,6 +3,7 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Avalonia.MicroCom;
+using MicroCom.Runtime;
namespace Avalonia.Win32.WinRT
{