AutoCAD 2025 : Marshal.GetActiveObject .NET Core

<?xml encoding=”UTF-8″>By Madhukar Moogala

The GetActiveObject method is deprecated in .NET 8, specifically starting from .NET Core 3.0.
The Marshal.GetActiveObject() API is a simple wrapper over the Running Object Table (ROT) and relies on
folllwing Win32 APIs that can easily be called via P/Invoke.

  • CLSIDFromProgIDEx
  • GetActiveObject

An example of how to manually communicate with the ROT can be found at this GitHub repository.
It is unlikely that Microsoft will bring this API back.

Let’s write a our own method GetActiveObject

    
[DllImport("ole32")]
private static extern int CLSIDFromProgIDEx(
[MarshalAs(UnmanagedType.LPWStr)] string lpszProgID,
out Guid lpclsid);
[DllImport("oleaut32")]
private static extern int GetActiveObject(
[MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
IntPtr pvReserved,
[MarshalAs(UnmanagedType.IUnknown)] out object ppunk);
public static object? GetActiveObject(string progId,
bool throwOnError = false)
{
if (progId == null)
throw new ArgumentNullException(nameof(progId));
var hr = CLSIDFromProgIDEx(progId, out var clsid);
if (hr < 0)
{
if (throwOnError)
Marshal.ThrowExceptionForHR(hr);
return null;
}
hr = GetActiveObject(clsid, IntPtr.Zero, out var obj);
if (hr < 0)
{
if (throwOnError)
Marshal.ThrowExceptionForHR(hr);
return null;
}
return obj;
}


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading