Lưu ý: Inventor đã được nâng cấp từ .Net Framework lên .Net 8 kể từ phiên bản Inventor 2025, và các mẫu Addin của Inventor cho Visual Studio 2022 cũng đã được nâng cấp để sử dụng .Net 8 kể từ Inventor 2025. Phiên bản Visual Studio 2022 17.8 hoặc mới hơn là yêu cầu để sử dụng các trình hướng dẫn addin đã được nâng cấp.
Hướng dẫn này là về cách viết một addin của riêng bạn. Có nhiều hướng dẫn khác ngoài kia. Hướng dẫn này không nhằm mục đích làm theo cách đơn giản nhất. Có các mẫu trong Visual Studio sẽ thiết lập hầu hết mọi thứ cho bạn (https://ekinssolutions.com/nifty_addin_template/). Trong hướng dẫn này, chúng ta sẽ thiết lập mọi thứ thủ công. Tôi muốn chỉ cho bạn tất cả các cài đặt. Điều đó có lợi thế là bạn không bị giới hạn trong các cài đặt, phiên bản Inventor/Visual Studio hay ngôn ngữ lập trình cụ thể.
Mục tiêu của tôi là bạn sẽ có một addin hoạt động và hữu ích vào cuối hướng dẫn này. Tôi cũng muốn bạn có thể thay đổi chức năng dễ dàng. Tuy nhiên, tôi không muốn dành quá nhiều thời gian để giải thích các chức năng và mã của addin. Vì vậy, tôi đã chọn chuyển quy tắc iLogic của mình “One Rule to Search Them All” (http://www.hjalte.nl/22-one-rule-to-search-them-all) thành một addin. Nếu bạn muốn biết thêm về chức năng này, bạn có thể đọc trong bài đăng trên blog. Ở đây, tôi chỉ tập trung vào việc tạo một addin. Thực ra, bạn có lẽ không bao giờ nên biến một quy tắc iLogic thành một addin chỉ để có một nút bấm. Autodesk đã cung cấp tùy chọn đó như một lựa chọn mặc định cho các quy tắc iLogic.
Vậy tại sao bạn nên tạo addins? Phần lớn, tôi tạo addins trong các trường hợp sau:
- Bộ mã cho chức năng tôi muốn quá lớn/phức tạp để là một quy tắc iLogic.
- Bạn cần hiển thị một cửa sổ đẹp mắt cho người dùng (ít nhất là trông đẹp hơn so với những cửa sổ có thể làm với iLogic).
- Bạn cần Inventor phản hồi với các sự kiện (không chỉ là việc người dùng nhấn một nút hoặc các sự kiện tích hợp từ iLogic).
Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách và nơi viết tất cả mã của mình. Nếu bạn muốn làm theo nhưng cảm thấy lạc lối (hoặc nếu bạn chỉ muốn xem mã hoàn chỉnh), bạn có thể tìm thấy toàn bộ dự án trên trang GitHub của tôi. (Tải xuống)
Đây không phải là một hướng dẫn lập trình, vì vậy tôi kỳ vọng bạn đã có một số kinh nghiệm lập trình, ví dụ như từ việc tạo các quy tắc iLogic.
Tạo Một Dự Án Visual Studio 2022
Tôi giả định rằng bạn đã cài đặt Visual Studio 2022. (Lưu ý rằng Visual Code là một IDE lập trình khác của Microsoft, nhưng bạn không thể tạo addin với nó.) Đây không phải là hướng dẫn cách cài đặt Visual Studio. Nhưng nếu bạn chưa cài đặt, bạn có thể tải xuống tại đây: https://visualstudio.microsoft.com/downloads/. Hãy chắc chắn rằng bạn cài đặt mọi thứ để có thể tạo ứng dụng desktop .Net. Cũng bao gồm các runtime .Net Core 8.
Mở Visual Studio (2022) và tạo một dự án mới.
Đảm bảo rằng bạn chọn một dự án với .Net core 8. Bên cạnh, bạn có một số tùy chọn.
Trước hết, bạn có thể chọn ngôn ngữ C# hoặc VB.net. C# là ngôn ngữ .Net được sử dụng phổ biến nhất. Do đó, hầu hết thông tin trên internet đều là về C#. Đó có thể là một lợi thế nếu bạn đang tìm kiếm giải pháp lập trình. Nhưng nếu bạn gặp vấn đề với API của Inventor thì hầu hết các câu trả lời/ví dụ đều được viết bằng VB.net (hoặc VBA rất giống nhau). Trong hướng dẫn này, tôi sẽ tập trung vào VB.net vì bạn có thể tìm thấy nhiều thông tin liên quan hơn.
Lựa chọn thứ hai của bạn là loại công nghệ mà bạn muốn sử dụng trong các biểu mẫu của mình. Bạn có các tùy chọn sau: Winforms, WPF hoặc không chọn. Winforms là công nghệ lâu đời nhất nên bạn sẽ tìm thấy rất nhiều thông tin về nó. (Nếu bạn tạo/sử dụng các điều khiển tùy chỉnh trong Winforms, bạn có thể gặp khó khăn khi cần ứng dụng của bạn ở định dạng 64bit. Đây là trường hợp nếu bạn cũng bắt đầu làm việc với API vault.) Với các biểu mẫu WPF, bạn có thể làm nhiều điều hơn (nó linh hoạt hơn) nhưng phức tạp hơn để tạo ra. Nếu bạn không muốn tạo bất kỳ biểu mẫu nào, thì bạn có thể tạo một “Class Library”. Đây là cách đơn giản nhất để thiết lập. Trong hướng dẫn này, tôi sẽ tạo một thư viện lớp với công nghệ WPF.
Thiết lập project
Xóa file “Class1.vb.” (Điều đó có nghĩa là xóa tất cả các tệp trong solution explorer của bạn.)
Đi đến màn hình “Add Project Reference…”
Duyệt và chọn các tập tin sau:
C:\Program Files\Autodesk\Inventor 2025\Bin\Autodesk.Inventor.Interop.dll
Các tập tin dll iLogic sau đây chỉ cần nếu bạn sẽ sử dụng chức năng iLogic.
C:\Program Files\Autodesk\Inventor 2025\Bin\Autodesk.iLogic.Interfaces.dll
C:\Program Files\Autodesk\Inventor 2025\Bin\Autodesk.iLogic.Runtime.dll
Đối với tham chiếu Autodesk.Inventor.Interop.dll, bạn cần đặt thuộc tính “Embed Interop Types” thành “No” và “Copy Local” thành “Yes”.
Đố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 mà tôi có thể nghĩ đến là bạn không cần nó, đó là khi bạn không sử dụng bất kỳ biểu tượng hoặc biểu mẫu nào trong add-in của mình…) Do đó, 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.
Đặt compile events
Khi add-in của bạn được biên dịch, nó cần được cài đặt để Inventor có thể sử dụng. Đi tới “Project Properties”.
Có khả năng các cài đặt sau đây đã được thiết lập đúng, nhưng tốt nhất là bạn nên kiểm tra lại các cài đặt sau.
Tiếp theo, chúng ta cần đảm bảo rằng các tập tin add-in được sao chép đến vị trí chính xác. Các tệp add-in có thể được đặt ở một vài vị trí khác nhau.
- Tất cả người dùng, phiên bản độc lập
- %ALLUSERSPROFILE%\Autodesk\Inventor Addins\
- Tất cả người dùng, phụ thuộc phiên bản
- %PROGRAMFILES%\Autodesk\Inventor 20xx\Bin\Addins\
- Tôi nhận thấy rằng bạn cần quyền quản trị viên cục bộ trên máy tính để ghi vào thư mục này. Nếu bạn không có những “quyền” đó, Visual Studio sẽ dừng quá trình xây dựng khi bạn cố gắng gỡ lỗi tiện ích bổ sung của mình!
- %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, phiên bản độc lập
- %APPDATA%\Autodesk\ApplicationPlugins
Bạn cần sao chép ít nhất tệp *.addin và tệp dll của add-in của bạn vào một trong những vị trí này. Bạn có thể làm điều đó 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].
Đặt compile events (thay thế)
Có một lựa chọn thay thế để đặt “Compile events”. Bạn cũng có thể thiết lập “Output path”. Điều này có ưu điểm là tất cả các tệp sẽ được sao chép tự động. (Thay vì thêm một dòng trong sự kiện biên dịch cho mỗi tệp bạn muốn sao chép.). Nhược điểm là Visual Studio sẽ luôn tạo một thư mục bổ sung có tên “net8.0-windows”. Trong GUI, không có cài đặt nào để vô hiệu hóa hành vi đó. Nhưng bạn có thể vô hiệu hóa hành vi đó bằng cách chỉnh sửa tệp dự án trực tiếp.
Bây giờ hãy thêm các dòng sau sau nhóm thuộc tính đầu tiên (PropertyGroup).
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>[TARGET LOCATION]\[YOUR ADDIN NAME]\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath>[TARGET LOCATION]\[YOUR ADDIN NAME]\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
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].
Đặt Inventor làm chương trình khởi động để gỡ lỗi (debugging).
Chọn “Debug” và sau đó “[DỰ ÁN CỦA BẠN] Thuộc tính gỡ lỗi”. (Hoặc thực hiện một số thao tác nhấp chuột.)
Xóa hồ sơ hiện có.
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.
GUID
Đối với các tập tin tiếp theo, bạn sẽ cần một GUID. Đây là một chuỗi định danh được sử dụng bởi Inventor. Nhiều trang web và công cụ có thể tạo nó cho bạn. Tôi thường sử dụng trang web này: https://www.guidgenerator.com/
Lưu chuỗi này để sử dụng sau.
Tập tin Addin
Đối với một add-in, bạn tối thiểu cần 2 tập tin. Tập tin đầu tiên là file .addin. Với file đó, bạn thông báo cho Inventor rằng bạn muốn nó tải một add-in. Thông tin trong tập tin đó sẽ được hiển thị trong màn hình add-in bên trong Inventor.
Thêm một tập tin mới vào dự án. Tên không quan trọng miễn là phần mở rộng là “.addin”. Thông thường, bạn đặt tên giống với tên addin của bạn. Tôi sẽ sử dụng “AddInInventor2025.addin”.
Thay đổi thuộc tính tập tin của file addin. Tập tin cần được sao chép vào đường dẫn đầu ra khi dự án được biên dịch.
Thêm đoạn mã (XML) sau vào file:
<Addin Type="Standard">
<ClassId>{[GUID here]}</ClassId>
<ClientId>{[GUID here]}</ClientId>
<DisplayName>[Name]</DisplayName>
<Description>[Description]</Description>
<Assembly>[File name of the dll]</Assembly>
<SupportedSoftwareVersionGreaterThan>23..</SupportedSoftwareVersionGreaterThan>
</Addin>
File .addin là một tập tin XML. Các tập tin XML là file văn bản đơn giản, thường được sử dụng để lưu cài đặt. Tất cả các cài đặt được lưu trong các thẻ lồng nhau. Một thẻ luôn có dạng
<[TagName] [Properties]>[TagValue]</ [TagName]>
Trong XML, thay thế văn bản nằm giữa các dấu ngoặc vuông (và cũng loại bỏ dấu ngoặc vuông). Hầu hết các thẻ đều dễ hiểu, nhưng các thẻ sau đây cần chú ý thêm.
Trong các thẻ “ClassId” và “ClientId”, bạn cần đặt GUID mà chúng ta đã tạo trước đó. Đảm bảo loại bỏ dấu ngoặc vuông nhưng giữ lại dấu ngoặc nhọn.
Trong thẻ “Assembly”, đặt tên tập tin của tập tin addin dll của bạn. (Bạn có thể tìm thấy tên trong cài đặt dự án Visual Studio của mình. Đừng quên thêm phần mở rộng “.dll”)
Tôi đã bỏ qua nhiều thẻ không cần thiết ở đây. Để xem danh sách đầy đủ, hãy xem tại đây: https://help.autodesk.com/view/INVNTOR/2025/ENU/?guid=GUID-52422162-1784-4E8F-B495-CDB7BE9987AB
Tạo lớp StandardAddInServer
Tập tin thứ hai mà mỗi addin cần là DLL (thư viện liên kết động). Đây là tập tin chứa mã đã biên dịch. Trong tập tin này, ít nhất cần có 1 lớp, lớp “StandardAddInServer”. Lớp này là điểm khởi đầu cho Inventor. Điều đó có nghĩa là khi Inventor khởi động, nó sẽ đọc file .addin của bạn. Sau đó, nó sẽ tải dll của bạn và bắt đầu tìm kiếm lớp này. Khi nó được tìm thấy, nó sẽ bắt đầu gọi các hàm trong lớp này.
Thêm một lớp vào dự án của bạn và gọi nó là “StandardAddInServer”.
Thêm mã sau vào tập tin và thay đổi GUID:
Imports System.Runtime.InteropServices
Imports Inventor
' Change the GUID here and use the same as in the addin file!
<GuidAttribute("[GUID here]"), ComVisible(True)>
Public Class StandardAddInServer
Implements Inventor.ApplicationAddInServer
Private _myButton As MyButton
''' <summary>
''' Invoked by Autodesk Inventor after creating the AddIn.
''' AddIn should initialize within this call.
''' </summary>
''' <param name="AddInSiteObject">
''' Input argument that specifies the object, which provides
''' access to the Autodesk Inventor Application object.
''' </param>
''' <param name="FirstTime">
''' The FirstTime flag, if True, indicates to the Addin that this is the
''' first time it is being loaded and to take some specific action.
''' </param>
Public Sub Activate(AddInSiteObject As ApplicationAddInSite, FirstTime As Boolean) Implements ApplicationAddInServer.Activate
Try
' initialize the rule class
_myButton = New MyButton(AddInSiteObject.Application)
Catch ex As Exception
' Show a message if any thing goes wrong.
MessageBox.Show(ex.Message)
End Try
End Sub
''' <summary>
''' Invoked by Autodesk Inventor to shut down the AddIn.
''' AddIn should complete shutdown within this call.
''' </summary>
Public Sub Deactivate() Implements ApplicationAddInServer.Deactivate
End Sub
''' <summary>
''' Invoked by Autodesk Inventor in response to user requesting the execution
''' of an AddIn-supplied command. AddIn must perform the command within this call.
''' </summary>
Public Sub ExecuteCommand(CommandID As Integer) Implements ApplicationAddInServer.ExecuteCommand
End Sub
''' <summary>
''' Gets the IUnknown of the object implemented inside the AddIn that supports AddIn-specific API.
''' </summary>
Public ReadOnly Property Automation As Object Implements ApplicationAddInServer.Automation
Get
Throw New NotImplementedException()
End Get
End Property
End Class
Bạn thấy 4 hàm/phương thức ở đây (Activate(…), Deactivate(), ExecuteCommand(…), Automation()). Chúng ta chỉ sử dụng hàm “Activate”. Các hàm khác cần có mặt nhưng không cần thực hiện bất kỳ điều gì.
Trong hàm “Activate”, chúng ta khởi tạo lớp nút. Ngoài ra, hãy chú ý đến khối try/catch. Mặc định, Inventor sẽ không cảnh báo bạn nếu có điều gì đó sai khi tải addin của bạn. Do đó, khối try/catch là cần thiết để bắt bất kỳ ngoại lệ nào mà mã của bạn có thể ném ra và xử lý ngoại lệ đó. Ở đây, tôi chỉ hiển thị cho người dùng một hộp thông báo với thông tin cơ bản nhất từ ngoại lệ. (Trong mã sản xuất, bạn có thể xem xét việc ghi lại tất cả thông tin ngoại lệ vào một nhật ký.) Điều này sẽ giúp bạn khi có điều gì đó sai và bạn cần tìm ra vấn đề. (Và vâng, luôn luôn có điều gì đó sai và bạn sẽ cần tất cả thông tin mà bạn có thể có!)
Button class
Lớp nút tạo một nút trong Inventor. Tại đây, chúng ta cũng viết mã được thực hiện khi nút được nhấp. Tôi đã gọi lớp này là “MyButton”, nhưng bạn có thể đặt tên khác tùy ý. Chỉ cần đảm bảo rằng bạn sử dụng cùng một tên trong hàm “StandardAddInServer.Activate(…)”.
Tạo một lớp “MyButton” và thêm mã sau:
Imports Inventor
Public Class MyButton
Private _inventor As Inventor.Application
Private _settingsButton As ButtonDefinition
Public Sub New(inventor As Inventor.Application)
_inventor = inventor
SetupButtonDefinition()
AddButtonDefinitionToRibbon()
End Sub
Private Sub SetupButtonDefinition()
Dim conDefs As ControlDefinitions = _inventor.CommandManager.ControlDefinitions
_settingsButton = conDefs.AddButtonDefinition(
"MyButton DisplayName",
"MyButton InternalName",
CommandTypesEnum.kEditMaskCmdType,
Guid.NewGuid().ToString(),
"MyButton DescriptionText",
"MyButton ToolTipText")
AddHandler _settingsButton.OnExecute, AddressOf MyButton_OnExecute
End Sub
Private Sub AddButtonDefinitionToRibbon()
Dim ribbon As Ribbon = _inventor.UserInterfaceManager.Ribbons.Item("Assembly")
Dim ribbonTab As RibbonTab = ribbon.RibbonTabs.Item("id_TabManage")
Dim ribbonPanel As RibbonPanel = ribbonTab.RibbonPanels.Item("iLogic.RibbonPanel")
ribbonPanel.CommandControls.AddButton(_settingsButton)
End Sub
Private Sub MyButton_OnExecute(Context As NameValueMap)
Try
Dim rule As New ThisRule()
rule.ThisApplication = _inventor
rule.Main()
Catch ex As Exception
MsgBox("Something went wrong while runing rule. Message: " & ex.Message)
End Try
End Sub
End Class
Khi lớp nút được khởi tạo, hàm “new” sẽ được gọi tự động. Tại đây, chúng ta gọi 2 hàm khác. Bạn có thể đã nhận thấy rằng những hàm đó rất ngắn. Chúng ngắn đến mức tôi có thể đã thêm chúng vào hàm “new”. Một trong những vấn đề của việc tạo ra các chương trình lớn là đọc mã sau này. Tạo các hàm nhỏ với tên mô tả tốt giúp việc hiểu mã dễ dàng hơn sau này. Ngoài ra, điều này cũng làm tăng khả năng bạn có thể tái sử dụng cùng một mã cho các mục đích khác.
Trong hàm “SetupButtonDefinition”, bạn có thể thay đổi “DisplayName”, “InternalName”, “DescriptionText” và “ToolTipText” của nút mà chúng ta đang tạo. Ở đó, chúng ta cũng xác định hàm nào sẽ được gọi là “MyButton_OnExecute”.
Trong hàm “AddButtonDefinitionToRibbon”, chúng ta xác định vị trí mà nút cần đặt. Chúng ta bắt đầu bằng cách chọn “Ribbon”. Tôi đã chọn ribbon “Part”, nhưng bạn có thể chọn 1 trong các tùy chọn sau: ZeroDoc, Part, Assembly, Drawing, Presentation, iFeatures và UnknownDocument. Sau đó, chúng ta cần chỉ định tên nội bộ của “RibbonTab” và “RibbonPanel”. Có quá nhiều tùy chọn để in ra ở đây, nhưng quy tắc illogic sau đây sẽ in chúng ra trong nhật ký illogic.
For Each ribbon As Ribbon In ThisApplication.UserInterfaceManager.Ribbons
Logger.Info(vbTab & Ribbon.InternalName)
For Each ribbonTab As RibbonTab In Ribbon.RibbonTabs
Logger.Info(vbTab & vbTab & RibbonTab.DisplayName & " - " & RibbonTab.InternalName)
For Each ribbonPanel As RibbonPanel In RibbonTab.RibbonPanels
Logger.Info(vbTab & vbTab & vbTab & RibbonPanel.DisplayName & " - " & RibbonPanel.InternalName)
Next
Next
Next
Dim loggerWindow = ThisApplication.UserInterfaceManager.
DockableWindows.
Cast(Of DockableWindow).
Where(Function(d) d.InternalName.Equals("ilogic.logwindow")).
First()
loggerWindow.Visible = True
Trong trường hợp của tôi, nút của tôi chỉ hiển thị trong môi trường lắp ráp. Nút nằm trên tab “Manage” trong bảng “iLogic”.
Khi được quản lý, hàm “MyButton_OnExecute” sẽ được gọi khi nút được nhấp. Tại đây, chúng ta khởi tạo lớp “ThisRule” thực hiện công việc thực sự.
Lớp quy tắc trừu tượng (Abstract rule class)
Chúng ta sẽ mô phỏng iLogic. Điều này có nghĩa là chúng ta cần một số hàm illogic mặc định trong lớp quy tắc. Nếu bạn muốn tạo một nút thứ hai vào một thời điểm nào đó, thì bạn có thể không muốn triển khai cùng một logic hai lần. (Ít nhất tôi không thích điều đó, có thể tôi hơi lười biếng…) Ngoài ra, tôi muốn có thể sao chép mã iLogic như nó vốn có vào addin của mình. Do đó, tôi đã chọn tạo một lớp trừu tượng và kế thừa tất cả các hàm trong lớp cơ sở vào lớp quy tắc. Hiện tại, lớp cơ sở này rất nhỏ và chỉ có 2 thuộc tính. Trong hầu hết các trường hợp, chỉ cần có quyền truy cập vào thuộc tính iLogic “ThisApplication” và “ThisDoc” là đủ.
Tạo một lớp “AbstractRule” và thêm mã sau:
Imports Autodesk.iLogic.Interfaces
Imports Autodesk.iLogic.Runtime
Imports Inventor
Public MustInherit Class AbstractRule
Public Property ThisApplication As Inventor.Application
Public ReadOnly Property ThisDoc As ICadDoc
Get
Return New CadDoc(ThisApplication.ActiveDocument)
End Get
End Property
End Class
Rule class
Đây là lớp sẽ chứa quy tắc iLogic. Trong ví dụ này, tôi sẽ có thể sao chép/dán một quy tắc iLogic từ Inventor vào lớp. (Chỉ cần nhớ rằng chúng ta không triển khai tất cả các hàm/thuộc tính iLogic. Mã của bạn có thể không hoạt động nếu bạn sao chép một trong các quy tắc của mình. Trong trường hợp đó, bạn cần triển khai các hàm của mình để mô phỏng các hàm iLogic)
Tạo một lớp “ThisRule” và thêm mã sau:
Imports Inventor
Public Class ThisRule
Inherits AbstractRule
Public Sub Main()
' Your iLogic code goes here.
End Sub
End Class
Chú ý dòng 4, đây là nơi chúng ta thông báo cho trình biên dịch kế thừa lớp cơ sở. Trong các quy tắc phức tạp hơn, bạn sẽ có nhiều hàm hơn hoặc thậm chí một lớp hoàn chỉnh. Khi đó, bạn có thể cần thêm mã bên ngoài hàm chính.
Để kết thúc hướng dẫn này với một addin hoạt động/chức năng, chúng ta sẽ thay thế mã lớp bằng quy tắc “One Rule to Search Them All”. Lớp “ThisRule” sẽ trông như thế này.
Imports Inventor
Public Class ThisRule
Inherits AbstractRule
Private searchText As String
Private iLogicAddinGuid As String = "{3BDD8D79-2179-4B11-8A5A-257B1C0263AC}"
Private iLogicAddin As ApplicationAddIn = Nothing
Private iLogicAutomation = Nothing
Private outputFile As String = "c:\TEMP\seachedRules.txt"
Sub Main()
If (IO.File.Exists(outputFile)) Then
IO.File.Delete(outputFile)
End If
searchText = InputBox("Text to search for", "Search")
iLogicAddin = ThisApplication.ApplicationAddIns.ItemById(
"{3bdd8d79-2179-4b11-8a5a-257b1c0263ac}")
iLogicAutomation = iLogicAddin.Automation
Dim doc As AssemblyDocument = ThisDoc.Document
searchDoc(doc)
For Each refDoc As Document In doc.AllReferencedDocuments
searchDoc(refDoc)
Next
Process.Start("notepad.exe", outputFile)
End Sub
Private Sub searchDoc(doc As Document)
Dim rules = iLogicAutomation.Rules(doc)
If (rules Is Nothing) Then Return
For Each rule In rules
Dim strReader As IO.StringReader = New IO.StringReader(rule.Text)
Dim i As Integer = 1
Do While (True)
Dim line As String
line = strReader.ReadLine()
If line Is Nothing Then Exit Do
If (line.ToUpper().Contains(searchText.ToUpper())) Then
Dim nl = System.Environment.NewLine
IO.File.AppendAllText(outputFile,
"Doc name : " & doc.DisplayName & nl &
"Rule name: " & rule.Name & nl &
"line " & i & " : " & line.Trim() & nl & nl)
End If
i = i + 1
Loop
Next
End Sub
End Class
Bây giờ hãy nhấn “Run” (hoặc nhấn F5) trong Visual Studio và thử nghiệm addin của bạn!
Nguồn: hjalte.nl