Inventor 2025 mang đến cho chúng ta một sự thay đổi lớn. API đã được chuyển từ .NET Framework sang .NET Core 8, và khuyến nghị chuyển tất cả các add-in của chúng ta sang “.NET Core 8”. Tôi đã di chuyển một số add-in của mình bằng cách sử dụng một hướng dẫn, nhưng nó không đầy đủ như tôi mong muốn. Do đó, tôi đã ghi lại những gì hiệu quả đối với tôi trong bài viết này. (Bài viết chính thức của Autodesk có thể được tìm thấy tại đây.)
Cập nhật giải pháp của bạn bao gồm các bước sau. Tuy nhiên, bạn không được đảm bảo rằng sẽ hoàn tất sau các bước này. Tôi đã thấy các giải pháp mà sau khi di chuyển xong lại xuất hiện rất nhiều lỗi trong mã. Trong một số trường hợp, tôi chỉ cần thêm một câu lệnh import. Nhưng ở các trường hợp khác, có rất nhiều việc cần phải làm.
Chuẩn bị Visual Studio
Để tạo các add-in “.NET Core 8” bạn cần Visual Studio 2022 (17.8) trở lên. Tôi giả định rằng bạn đã cài đặt Visual Studio 2022. Để cập nhật lên phiên bản 17.8 (hoặc cao hơn), bạn có thể chọn “Help” rồi “Check for Updates”. Sau đó, bạn cần cài đặt “.NET Core 8”. Chọn “Tools” và sau đó “Get Tools and Features”.
Bây giờ chọn tab “Individual components” và đánh dấu vào “.NET 8.0 Runtime (Long Term Support)”, sau đó nhấn “Install”.
Microsoft đã tạo một add-in cho Visual Studio có thể giúp bạn trong quá trình di chuyển. Do đó, bước tiếp theo là cài đặt add-in này. Chọn “Extensions” và “Manage Extensions…”.
Bây giờ tìm kiếm phần mở rộng “.NET Upgrade Assistant” và cài đặt nó.
Upgrading một project.
Bạn chỉ cần cập nhật Visual Studio và cài đặt “.NET Upgrade Assistant” một lần duy nhất. Tuy nhiên, các bước sau đây cần được thực hiện/kiểm tra cho từng dự án trong mỗi giải pháp.
.NET Upgrade Assistant
Những thay đổi lớn nhất được thực hiện bởi “.NET Upgrade Assistant”. Bạn có thể bắt đầu bằng cách nhấp chuột phải vào dự án của mình và chọn “Upgrade”.
Bây giờ sử dụng các cài đặt mặc định và nhấn “Next”…
Hãy chắc chắn rằng tất cả các tùy chọn đều được chọn.
Mọi thứ đã được nâng cấp ngoại trừ các tham chiếu đến các thư viện DLL của Autodesk. (Chúng ta cần thêm những thư viện này vào dự án sau.)
Thêm các tham chiếu/NuGet package bị mất.
Hầu hết các tham chiếu sẽ bị mất trong quá trình nâng cấp. Tuy nhiên, chúng cũng cần được thay đổi. Việc thêm các tham chiếu thực hiện giống như trước đây, bằng cách nhấp chuột phải vào “Dependencies” trong dự án của bạn và chọn “Add project reference”.
Sau đó, bạn cần duyệt đến tất cả các DLL mà dự án của bạn cần tham chiếu.
C:\Program Files\Autodesk\Inventor [VERSION]\Bin\Autodesk.Inventor.Interop.dll
Đây là DLL luôn cần thiết cho các add-in và công cụ sử dụng Inventor.C:\Program Files\Autodesk\Inventor [VERSION]\Bin\stdole.dll
Cần thiết nếu bạn sử dụng biểu tượng cho các nút của mình.C:\Program Files\Autodesk\Inventor [VERSION]\Bin\Autodesk.iLogic.Interfaces.dll
C:\Program Files\Autodesk\Inventor [VERSION]\Bin\Autodesk.iLogic.Runtime.dll
Cần thiết nếu bạn sử dụng các chức năng iLogic trong add-in của mình. Nếu bạn đã sử dụng hướng dẫn của tôi làm cơ sở cho add-in của mình, bạn có thể sẽ cần những thư viện này.
Đối với tham chiếu Autodesk.Inventor.Interop.dll
, bạn cần thiết lập các thuộc tính sau: Embed Interop Types: Đặt thành “False”, Copy Local: Đặt thành “True”.
Vì .NET Core 8 là một framework đa nền tảng, nó không còn tham chiếu các DLL mặc định của Windows nữa. Đây là một trong những sự khác biệt lớn giữa “.NET Framework 4.8” và “.NET Core 8”. Việc thêm tất cả các DLL mặc định của Windows sẽ tốn rất nhiều công sức. May mắn thay, Visual Studio có một cách tuyệt vời để thêm các gói DLL. (Ở đây chúng ta chỉ sử dụng các gói Microsoft Windows mặc định, nhưng cũng có rất nhiều gói khác có thể hữu ích.) Một lợi thế khác khi sử dụng gói NuGet là chúng dễ dàng cập nhật hơn rất nhiều. Vì vậy, sẽ rất tuyệt nếu Autodesk có thể thêm các DLL của họ vào một gói. Điều này sẽ giúp chúng ta tiết kiệm công đoạn thêm tham chiếu mới mỗi khi Autodesk phát hành một phiên bản Inventor mới. Do đó, có một bài đăng trên diễn đàn Inventor-Ideas với tiêu đề “Inventor API on NuGet“. Tôi rất khuyến khích mọi người bỏ phiếu cho “Ý tưởng” này!
Dù sao, đối với hầu hết các add-in, bạn cần gói “System.Drawing.Common”. (Tình huống duy nhất tôi có thể nghĩ ra mà bạn không cần nó là khi bạn không sử dụng bất kỳ biểu tượng hay form nào trong add-in của mình…) Vì vậy, hãy chọn “Tools”, “NuGet package manager” và “Manage NuGet packages for solution…”.
Tìm kiếm gói “System.Drawing.Common” và cài đặt nó cho các dự án trong giải pháp của bạn mà cần sử dụng gói này.
Kiểm tra/cập nhật cài đặt dự án.
“.NET Upgrade Assistant” không hoàn hảo và tôi nhận thấy rằng bạn luôn cần phải kiểm tra một số cài đặt dự án. Do đó, hãy vào cài đặt dự án bằng cách nhấp chuột phải vào dự án của bạn và chọn “Properties”. (Hoặc chọn dự án và nhấn Alt+Enter). Kiểm tra:
- Output type: Đảm bảo là “Class library” cho dự án add-in của bạn.
- Target framework: Đảm bảo là “8.0”.
- Target OS: Đảm bảo là “Windows”. Tôi đã gặp một số trường hợp mà cài đặt này không đúng!
Trước đây, tôi đã thiết lập thư mục xuất ra (khi gỡ lỗi) tới vị trí mà Inventor mong đợi các tệp. Nếu bạn xây dựng một “.NET Core 8” bằng Visual Studio, thì nó sẽ luôn tạo một thư mục phụ “net8.0-windows” trong thư mục xuất ra của bạn. Điều này làm hỏng logic của Inventor trong việc tìm kiếm các tệp add-in của bạn. Do đó, không còn là tùy chọn để xuất tệp trực tiếp vào một thư mục mà Inventor mong đợi. Điều này có nghĩa là chúng ta cần sao chép các tệp cần thiết cho Inventor (một cách tự động) đến vị trí chính xác. Vị trí đó cũng đã thay đổi kể từ Inventor 2024. Dưới đây là các vị trí (mới):
- Tất cả người dùng, không phụ thuộc phiên bản
%ALLUSERSPROFILE%\Autodesk\Inventor Addins\
- Tất cả người dùng, phụ thuộc phiên bản
%PROGRAMFILES%\Autodesk\Inventor 20xx\Bin\Addins\
Trước Inventor 2024, thư mục này là%ALLUSERSPROFILE%\Autodesk\Inventor 20xx\Addins\
.
Tôi nhận thấy bạn cần quyền quản trị viên cục bộ trên máy tính của mình để ghi vào thư mục này. Nếu bạn không có “quyền” đó, Visual Studio sẽ dừng quá trình xây dựng khi bạn thử gỡ lỗi add-in! - Cá nhân, phụ thuộc phiên bản
%APPDATA%\Autodesk\Inventor 20xx\Addins\
- Cá nhân, không phụ thuộc phiên bản
%APPDATA%\Autodesk\ApplicationPlugins
Bạn cần sao chép ít nhất tệp *.addin và tệp DLL của add-in vào một trong những vị trí này. Bạn có thể làm điều này bằng cách thêm các dòng sau vào “Post-build events”.
XCopy "$(TargetPath)" "[TARGET LOCATION]\$(TargetName)\" /Y /R
XCopy "$(ProjectDir)[YOUR ADDIN NAME].addin" "[TARGET LOCATION]\$(TargetName)\" /Y /R
Hãy chắc chắn rằng bạn thay đổi thông tin giữa các dấu ngoặc vuông [ ].
XCopy "$(TargetPath)" "%PROGRAMFILES%\Autodesk\Inventor 2025\Bin\Addins\$(TargetName)\" /Y /R
XCopy "$(ProjectDir)MyILogicAddin.addin" "%PROGRAMFILES%\Autodesk\Inventor 2025\Bin\Addins\$(TargetName)\" /Y /R
Các hướng dẫn khác (chính thức) sẽ yêu cầu bạn sử dụng mã sau. Tôi thấy nó không hữu ích, nhưng vì đây là mã chính thức nên tôi sẽ thêm nó vào đây như một tài liệu tham khảo:
WHERE MT.EXE
IF ERRORLEVEL 1 call "$(DevEnvDir)..\..\VC\Auxiliary\Build\vcvarsall.bat" amd64
mt.exe -manifest "$(ProjectDir)InventorAddinSample.X.manifest"
outputresource:"$(TargetPath)";#2
XCopy "$(TargetPath)" "%AppData%\Autodesk\ApplicationPlugins\$(TargetName)\" /Y /R
XCopy "$(ProjectDir)Autodesk.InventorAddinSample.Inventor.addin" "%AppData%\Autodesk\ApplicationPlugins\$(TargetName)\" /Y /R
Đặt Inventor làm chương trình khởi động để gỡ lỗi.
Tôi phát hiện rằng “.NET Upgrade Assistant” không chuyển đổi đúng ứng dụng khởi động. (Hoặc chính xác hơn, nó không được chuyển đổi mà chỉ bị xóa…) Điều này gây ra vấn đề khi gỡ lỗi. Các cài đặt trước đây nằm trong thuộc tính dự án nhưng đã được chuyển sang “Debug properties”. Chọn “Debug” và sau đó “[YOUR PROJECT] debug properties”. (Hoặc làm theo một số thao tác nhấp chuột)
Trong tất cả các lần di chuyển mà tôi thực hiện, tôi nhận thấy rằng không thể thiết lập ứng dụng khởi động. Do đó, bạn có thể an toàn khi xóa hồ sơ hiện tại.
Sau đó, bạn sẽ cần thêm một “Executable debug profile” mới.
Trong hồ sơ mới này, bạn có thể thêm đường dẫn đến Inventor.
Kiểm tra tệp dự án.
Thông thường, tôi sẽ không chỉnh sửa trực tiếp tập tin này, nhưng có thể thiết lập một số cài đặt ở đây mà không thể thực hiện qua giao diện đồ họa (GUI). Bạn có thể chỉnh sửa tập tin dự án bằng cách nhấp đúp vào dự án của mình trong Solution Explorer.
Bạn sẽ thấy một tập tin XML. Trong tập tin đó, bạn cần kiểm tra hoặc thực hiện các thao tác sau.
- Nếu bạn đang sử dụng các biểu mẫu WPF trong dự án của mình, thì bạn nên tìm dòng sau trong “PropertyGroup” đầu tiên. Nếu không có, hãy thêm nó vào.
- <UseWPF>true</UseWPF>
- Nếu bạn đang sử dụng các biểu mẫu Windows Forms trong dự án của mình, thì bạn nên tìm dòng sau trong “PropertyGroup” đầu tiên. Nếu không có, hãy thêm nó vào.
- <UseWindowsForms>true</UseWindowsForms>
- Xóa các tham chiếu hệ thống.
- Nếu bạn tìm thấy một “ItemGroup” với các nút “Import” giống như sau, bạn có thể xóa nó đi. (Các include có thể khác nhau tùy theo dự án của bạn.)
<ItemGroup>
<Import Include="System.Windows" />
<Import Include="System.Windows.Controls" />
<Import Include="System.Windows.Data" />
<Import Include="System.Windows.Documents" />
<Import Include="System.Windows.Input" />
<Import Include="System.Windows.Shapes" />
<Import Include="System.Windows.Media" />
<Import Include="System.Windows.Media.Imaging" />
<Import Include="System.Windows.Navigation" />
</ItemGroup>
- Xóa bất kỳ “PropertyGroup” nào có “Condition” trông giống như sau:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DefineDebug>false</DefineDebug>
<IncrementalBuild>false</IncrementalBuild>
<DocumentationFile>MyILogicAddin.xml</DocumentationFile>
<NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314</NoWarn>
</PropertyGroup>
Tạo lớp “Marshal2”.
Trong bất kỳ ứng dụng (thử nghiệm) nào, bạn có thể đã sử dụng lớp tĩnh “Marshal” để lấy đối tượng Inventor. Nó sẽ trông giống như sau:
Dim inventorObject As Inventor.Application = Marshal.GetActiveObject("Inventor.Application")
Trong .Net core 8, bạn sẽ nhận được thông báo lỗi: “GetActiveObject
is not a member of ‘Marshal'”. (Phương thức này đã bị loại bỏ.) Cách giải quyết là tạo một triển khai riêng của phương thức GetActiveObject
. Tôi không viết mã sau, tôi chỉ dịch mã tôi tìm thấy (ở đây) từ C# sang VB.Net. Khi bạn thêm lớp này vào dự án của mình, bạn chỉ cần thêm “2” vào mỗi dòng mà bạn sử dụng lớp “Mashal”. Ví dụ như sau:
Dim inventorObject As Inventor.Application = Marshal2.GetActiveObject("Inventor.Application")
Đây là lớp thực tế.
Imports System.Runtime.InteropServices
Imports System.Runtime.Versioning
Imports System.Security
Module Marshal2
Friend Const OLEAUT32 As String = "oleaut32.dll"
Friend Const OLE32 As String = "ole32.dll"
<System.Security.SecurityCritical>
Public Function GetActiveObject(ByVal progID As String) As Object
Dim obj As Object = Nothing
Dim clsid As Guid
Try
CLSIDFromProgIDEx(progID, clsid)
Catch __unusedException1__ As Exception
CLSIDFromProgID(progID, clsid)
End Try
GetActiveObject(clsid, IntPtr.Zero, obj)
Return obj
End Function
<DllImport(OLE32, PreserveSig:=False)>
<ResourceExposure(ResourceScope.None)>
<SuppressUnmanagedCodeSecurity>
<System.Security.SecurityCritical>
Private Sub CLSIDFromProgIDEx(<MarshalAs(UnmanagedType.LPWStr)> ByVal progId As String, <Out> ByRef clsid As Guid)
End Sub
<DllImport(OLE32, PreserveSig:=False)>
<ResourceExposure(ResourceScope.None)>
<SuppressUnmanagedCodeSecurity>
<System.Security.SecurityCritical>
Private Sub CLSIDFromProgID(<MarshalAs(UnmanagedType.LPWStr)> ByVal progId As String, <Out> ByRef clsid As Guid)
End Sub
<DllImport(OLEAUT32, PreserveSig:=False)>
<ResourceExposure(ResourceScope.None)>
<SuppressUnmanagedCodeSecurity>
<System.Security.SecurityCritical>
Private Sub GetActiveObject(ByRef rclsid As Guid, ByVal reserved As IntPtr, <Out> <MarshalAs(UnmanagedType.[Interface])> ByRef ppunk As Object)
End Sub
End Module
Tóm lại:
Trong quá trình cập nhật cơ bản, giải pháp của bạn bao gồm các bước sau. Tôi đoán đây là tất cả những gì bạn cần sau lần nâng cấp đầu tiên.
- Chuẩn bị Visual Studio.
- Bước này chỉ cần thực hiện một lần.
- Sử dụng “.NET Upgrade Assistant”
- Sử dụng cài đặt mặc định.
- Thêm tham chiếu/Nuget packages
- Tham chiếu: C:\Program Files\Autodesk\Inventor 2025\Bin\Autodesk.Inventor.Interop.dll
- Đặt “Embed Interop Types” thành”False”, “Copy Local” thành “True”
- Tham chiếu: C:\Program Files\Autodesk\Inventor 2025\Bin\stdole.dll
- Nuget package: System.Drawing.Common
- Tham chiếu: C:\Program Files\Autodesk\Inventor 2025\Bin\Autodesk.Inventor.Interop.dll
- Check/update project settings.
- Output type: Class library.
- Target framework: .Net 8.0
- Target OS: Windows.
- Post-build events:
- XCopy “$(TargetPath)” “[TARGET LOCATION]\$(TargetName)\” /Y /R
XCopy “$(ProjectDir)[YOUR ADDIN NAME].addin” “[TARGET LOCATION]\$(TargetName)\” /Y /R
- XCopy “$(TargetPath)” “[TARGET LOCATION]\$(TargetName)\” /Y /R
- Các khả năng cho [TARGET LOCATION]
- Tất cả người dùng, không phụ thuộc phiên bản
- %ALLUSERSPROFILE%\Autodesk\Inventor Addins\
- Tất cả người dùng, phụ thuộc phiên bản
- %PROGRAMFILES%\Autodesk\Inventor 20xx\Bin\Addins\
- Theo người dùng, phụ thuộc phiên bản
- %APPDATA%\Autodesk\Inventor 20xx\Addins\
- Theo người dùng, không phụ thuộc phiên bản
- %APPDATA%\Autodesk\ApplicationPlugins
- Tất cả người dùng, không phụ thuộc phiên bản
- Đặt Inventor làm chương trình khởi động để gỡ lỗi
- C:\Program Files\Autodesk\Inventor 2025\Bin\Inventor.exe
- Các thay đổi nhỏ khác.
- WPF: Thêm<UseWPF>true</UseWPF> vào first PropertyGroup
- Winforms: Thêm<UseWindowsForms>true</UseWindowsForms> vào first PropertyGroup
- Xóa các tham chiếu hệ thống.
- Xóa các cấu hình cũ.
- Tạo lớp “Marshal2”.
Nguồn: hjalte.nl