Thứ Hai, 24 tháng 3, 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 ReferencesAdd 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

Tạo Hatch boundary bằng API | Generate Hatch boundaries by API | 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: 👉👉👉