Trang

▼

24/03/2025

Khắc phục lỗi Method not found GetActiveObject với AutoCAD 2025 | AutoCAD dotNet

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản
   

Thông tin thêm: 👉👉👉

Thông tin lỗi 

1. Nội dung lỗi

Lỗi hiển thị trong AutoCAD có nội dung:



Unhandled exception has occurred in a component in your application. If you click Continue, the application will ignore this error and attempt to continue. Method not found: 'System.Object System.Runtime.InteropServices.Marshal.GetActiveObject(System.String)'.

Tạm dịch:

  • Lỗi không được xử lý xuất hiện trong ứng dụng.

  • Không tìm thấy phương thức: System.Runtime.InteropServices.Marshal.GetActiveObject(System.String).


2. Nguyên nhân gây lỗi

  • Phương thức GetActiveObject không tồn tại hoặc không khả dụng:

    • Phương thức này thuộc thư viện System.Runtime.InteropServices.Marshal và được sử dụng để lấy phiên bản đang chạy của AutoCAD.

    • Một số framework .NET (đặc biệt là .NET Core/.NET 5+) đã loại bỏ hoặc hạn chế sử dụng phương thức này. Lỗi này sẽ gặp khi sử dụng AutoCAD 2025 do đã thay đổi .NET

  • Chưa tham chiếu đúng thư viện COM:

    • Nếu đang sử dụng AutoCAD .NET API, bạn cần đảm bảo thư viện Autodesk.AutoCAD.Interop được tham chiếu đúng.

  • Không cài đặt đúng môi trường AutoCAD COM:

    • Khi chạy ứng dụng ngoài AutoCAD (ví dụ: từ ứng dụng Windows Forms hoặc Console App), AutoCAD COM có thể chưa được đăng ký đúng cách.


3. Giải pháp khắc phục

✅ Cách 1: Kiểm tra framework .NET

Nếu bạn đang dùng .NET 5+ hoặc .NET Core, hãy thử chuyển sang .NET Framework 4.8 vì các phiên bản mới đã giới hạn một số API COM.

✅ Cách 2: Kiểm tra và thêm tham chiếu thư viện
  1. Mở Solution Explorer trong Visual Studio.

  2. Chuột phải vào References → Add Reference.

  3. Chọn tab COM và tìm Autodesk AutoCAD Object Library.

  4. Thêm cả thư viện System.Runtime.InteropServices nếu chưa có.

✅ Cách 3: Thay thế GetActiveObject bằng một phương thức thay thế


Khắc phục: Sử dụng phương thức thay thế

Áp dụng đối với lập trình AutoCAD dotNet, và phiên bản AutoCAD 2025 trở lên. 

1 Thêm class AJS_Marshal2.cs

Lưu mã sau dưới dạng tệp tin AJS_Marshal2.cs
Code:
using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;

namespace AJS_Marshal2
{
    public static class Marshal2
    {
        internal const String OLEAUT32 = "oleaut32.dll";
        internal const String OLE32 = "ole32.dll";

        [System.Security.SecurityCritical]  // auto-generated_required
        public static Object GetActiveObject(String progID)
        {
            Object obj = null;
            Guid clsid;

            // Call CLSIDFromProgIDEx first then fall back on CLSIDFromProgID if
            // CLSIDFromProgIDEx doesn't exist.
            try
            {
                CLSIDFromProgIDEx(progID, out clsid);
            }
            //            catch
            catch (Exception)
            {
                CLSIDFromProgID(progID, out clsid);
            }

            GetActiveObject(ref clsid, IntPtr.Zero, out obj);
            return obj;
        }

        //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
        [DllImport(OLE32, PreserveSig = false)]
        [ResourceExposure(ResourceScope.None)]
        [SuppressUnmanagedCodeSecurity]
        [System.Security.SecurityCritical]  // auto-generated
        private static extern void CLSIDFromProgIDEx([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

        //[DllImport(Microsoft.Win32.Win32Native.OLE32, PreserveSig = false)]
        [DllImport(OLE32, PreserveSig = false)]
        [ResourceExposure(ResourceScope.None)]
        [SuppressUnmanagedCodeSecurity]
        [System.Security.SecurityCritical]  // auto-generated
        private static extern void CLSIDFromProgID([MarshalAs(UnmanagedType.LPWStr)] String progId, out Guid clsid);

        //[DllImport(Microsoft.Win32.Win32Native.OLEAUT32, PreserveSig = false)]
        [DllImport(OLEAUT32, PreserveSig = false)]
        [ResourceExposure(ResourceScope.None)]
        [SuppressUnmanagedCodeSecurity]
        [System.Security.SecurityCritical]  // auto-generated
        private static extern void GetActiveObject(ref Guid rclsid, IntPtr reserved, [MarshalAs(UnmanagedType.Interface)] out Object ppunk);

        //Collected by lisp.vn
    }
}



2 Cách sử dụng

Code:
Microsoft.Office.Interop.Excel.Application xlApp =
 (Microsoft.Office.Interop.Excel.Application)Marshal2.GetActiveObject("Excel.Application");


3 Ứng dụng khi khởi tạo Excel

Code:
using System;
using System.Runtime.InteropServices;

namespace AJS_Marshal2
{
    public class Excels
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);

        public static Microsoft.Office.Interop.Excel.Application StartExcel()
        {
            Microsoft.Office.Interop.Excel.Application xlApp = null;
            try
            {
                //xlApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
                xlApp = (Microsoft.Office.Interop.Excel.Application)Marshal2.GetActiveObject(Defs.Excel);
                xlApp.Visible = true;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                xlApp = new Microsoft.Office.Interop.Excel.Application();
            }

            if (xlApp != null)
            {
                object misValue = System.Reflection.Missing.Value;

                if (xlApp.Workbooks.Count == 0)
                {
                    Microsoft.Office.Interop.Excel.Workbook wb = xlApp.Workbooks.Add(misValue);
                    wb.Activate();
                }

                xlApp.Visible = true;
                xlApp.ActiveWindow.Activate();

                string caption = xlApp.Caption;
                IntPtr handler = FindWindow(null, caption);
                SetForegroundWindow(handler);
            }
            else
                System.Windows.MessageBox.Show("Excel is not properly installed!!");
            
            //Collected by lisp.vn
            return xlApp;
        }
    }
}


Link Nhóm AutoCAD dotNet




---------------------------------------------------------------------------------------------
Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản - Tác giả ứng dụng in D2P

    

Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:

Đăng nhận xét