質問
.NET 8移行 の外部アプリケーションから、以下のように Microsoft.VisualBasic.Interaction.GetObject を使用して起動中の AutoCAD の COM オブジェクトを取得しようとすると、Nothing が返されます。
Dim progId As String = "AutoCAD.Application.25.0"
Dim acadApp As AcadApplication
acadApp = CType(Interaction.GetObject(, progId), AcadApplication)
一方、Interaction.CreateObject を使用して AutoCAD を新規に起動することはできます。
.NET 以降の外部アプリケーションから、起動中の AutoCAD の COM オブジェクトを取得する方法はありますか?
回答
.NET では、Microsoft.VisualBasic.Interaction.GetObject を使用して、従来の .NET Framework と同様に起動中の COM オブジェクトを取得できない場合があります。
この場合、Windows API の GetActiveObject を P/Invoke で呼び出し、Running Object Table(ROT)に登録されている AutoCAD の COM オブジェクトを取得する方法を使用できます。
以下は VB.NET の例です。
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Interop
<DllImport("ole32.dll",
CharSet:=CharSet.Unicode,
PreserveSig:=True)>
Private Shared Function CLSIDFromProgIDEx(
<MarshalAs(UnmanagedType.LPWStr)> progId As String,
ByRef clsid As Guid) As Integer
End Function
<DllImport("oleaut32.dll",
EntryPoint:="GetActiveObject",
PreserveSig:=True)>
Private Shared Function NativeGetActiveObject(
ByRef clsid As Guid,
reserved As IntPtr,
<MarshalAs(UnmanagedType.IUnknown)> ByRef obj As Object) As Integer
End Function
Private Shared Function GetActiveObject(progId As String) As Object
Dim clsid As Guid
Dim hr As Integer = CLSIDFromProgIDEx(progId, clsid)
If hr < 0 Then
Marshal.ThrowExceptionForHR(hr)
End If
Dim obj As Object = Nothing
hr = NativeGetActiveObject(clsid, IntPtr.Zero, obj)
If hr < 0 Then
Marshal.ThrowExceptionForHR(hr)
End If
Return obj
End Function
起動中の AutoCAD を取得する場合は、次のように呼び出します。
Dim acadApp As AcadApplication
acadApp = CType(
GetActiveObject("AutoCAD.Application.25.0"),
AcadApplication)
上記の AutoCAD.Application.25.0 は AutoCAD 2025 の ProgID です。使用する AutoCAD のバージョンに応じて ProgID を変更してください。
なお、AutoCAD 2025 から .NET 8 が採用されているため、AutoCAD 2025 以降の外部 .NET アプリケーションで、この違いが表面化するケースがあります。
Autodesk Developer Blog でも、.NET 8 から起動中の AutoCAD COM オブジェクトを取得する方法として、Windows API の GetActiveObject を使用する方法が紹介されています。
参考
Autodesk Developer Blog: AutoCAD 2025 : Marshal.GetActiveObject .NET Core
Microsoft: Interaction.GetObject Method
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | AutoCAD .NET API :最後に追加されたエンティティの取得 | 0 | 13.03 | 23-08-2026 |
| 2 | Visual Studioで「InventorViewCtrl.ocxの自己登録に失敗しました」エラーが発生して、Inventor ViewコントロールをWindowsフォームへ追加することが出来ない | 0 | 10.94 | 17-08-2026 |
| 3 | Managed .Net API でレイアウト空間のビューポート表示範囲のオブジェクトを取得する方法 | 0 | 15.24 | 17-08-2026 |
| 4 | InventorのPack And Go を、VBAから実行する場合の参照設定 | 0 | 13.12 | 17-08-2026 |
| 5 | Revit API Tips: 壁プロファイルの取得方法 | 0 | 5.8 | 17-08-2026 |
| 6 | InventorのFileAccessEvents.OnFileResolutionイベントでFullFileNameに指定したファイルが読み込まれない | 0 | 14.49 | 17-08-2026 |
| 7 | InventorのAPIで、IDWファイルをバージョンを指定してDXFに変換する方法 | 0 | 11.63 | 17-08-2026 |
| 8 | Revit API Tips: ソリッドやメッシュのジオメトリをプロジェクト上に作図する方法 | 0 | 7.59 | 17-08-2026 |
| 9 | Revit API Tips: アドインでバッチ処理を実装する方法 | 0 | 4.51 | 17-08-2026 |
| 10 | Revit API Tips: 複数のファミリを組み合わせて(ネストして)新しいファミリを作成する方法 | 0 | 6.17 | 17-08-2026 |