Here are answers to questions about the MicroStation® Development Library (VB.NET and C#). When implementing functionality in .NET, there are Windows environment variables to consider. Similar questions are posted by MDL developers on the Bentley Discussion Groups.
Q Have you any hints about developing an application for MicroStation using .NET?
A
At the end of the build process you should end up with a .NET assembly that either has the
command.xml file embedded in the assembly or as an external resource (.xml file) next to the assembly.
Now you need to tell MicroStation where the assembly is located by augmenting the
MS_ADDINPATH configuration varialble in MicroStation.
We typically do this by creating a configuration file in the appl directory under MicroStation/config/appl.
In the file we have one line that is MS_ADDINPATH > "location of where my assembly is".
Now once that is in place we can load the addin in MicroStation using the command MDL LOAD AssemblyName.
Make sure that your MDL Task ID is not greater than 15 characters (legacy limit).
To validate the addin before running you can use the USTNXOM program from the developer shell.
To use this simply run the executable like this:
USTNXOM -validateAddin "Your Assembly.dll"
It should then tell you if it finds and resolves the command table and is formatted correctly.
To develop a Tool I would recomend starting with the AddIn class. This will help you to define an application that will run in MicroStation. Here is some sample code for implementing the AddIn part of the application …
Imports Bentley.MicroStation.WinForms Imports Bentley.MicroStation.InteropServices Imports Bentley.Interop.MicroStationDGN Imports System.Runtime.InteropServices Imports Bentley.MicroStation Namespace ProjectReviewApp Public Class ProjectReviewAppVB Inherits Bentley.MicroStation.AddIn Private Shared s_App As ProjectReviewAppVB Private Shared pReviewDialog As ProjectReviewForm Sub New(ByVal mdlDesc As System.IntPtr) MyBase.New(mdlDesc) s_App = Me End Sub Public Shared Function GetApp() As ProjectReviewAppVB GetApp = s_App End Function Public Shared Function GetDialog() As ProjectReviewForm If pReviewDialog Is Nothing Then pReviewDialog = New ProjectReviewForm End If GetDialog = pReviewDialog End Function Protected Overrides Function run(ByVal cmdLine() As String) As Integer run = 0 End Function Public Shared Sub ReleaseDialog() pReviewDialog = Nothing End Sub End Class Public Class KeyinCommands Public Shared Sub Open(ByVal unparsed As String) Dim pDialog As ProjectReviewForm pDialog = ProjectReviewAppVB.GetDialog If Not pDialog Is Nothing Then pDialog.ScanFile() pDialog.ShowForm() End If End Sub Public Shared Sub Close(ByVal unparsed As String) Dim pDialog As ProjectReviewForm pDialog = ProjectReviewAppVB.GetDialog If Not pDialog Is Nothing Then pDialog.CloseForm() End If End Sub Public Shared Sub Scan(ByVal unparsed As String) Dim pDialog As ProjectReviewForm pDialog = ProjectReviewAppVB.GetDialog If pDialog Is Nothing Then pDialog.ShowForm() Else pDialog.ScanFile() End If End Sub End Class End Namespace
Now for the "Tool" itself I would recommend using the COM Interop Bentley.Interop.MicroStationDGN and the
IPrimitiveCommandEvents or ILocateCommandEvents class.
For documentation on those classes refer to the MicroStationVBA.chm file.
For the user interface I would use a winform that inherits from the Bentley.MicroStation.Winforms.Adapter class.
Note when you inherit from this class you will not be able to use the designer mode of the IDE.
You can then design with the various components of the IDE for buttons etc.
Here is a sample that has a listbox and a scan of the design file …
Imports Bentley.MicroStation.Winforms Imports Bentley.Interop.MicroStationDGN Imports Bentley.MicroStation Imports Bentley.Windowing Imports System.Windows.Forms Namespace ProjectReviewApp Public Class ProjectReviewForm Inherits Bentley.MicroStation.WinForms.Adapter Private Shared s_App As Bentley.Interop.MicroStationDGN.Application Private Shared s_Current As ProjectReviewForm Dim m_window As Bentley.Windowing.WindowContent #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call s_Current = Me End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) s_Current = Nothing End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents ListBox1 As System.Windows.Forms.ListBox Private Sub InitializeComponent() Me.ListBox1 = New System.Windows.Forms.ListBox Me.SuspendLayout() ' 'ListBox1 ' Me.ListBox1.Location = New System.Drawing.Point(48, 40) Me.ListBox1.Name = "ListBox1" Me.ListBox1.Size = New System.Drawing.Size(200, 173) Me.ListBox1.TabIndex = 0 ' 'ProjectReviewForm ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(292, 268) Me.Controls.Add(Me.ListBox1) Me.Name = "ProjectReviewForm" Me.Text = "ProjectReviewForm" Me.ResumeLayout(False) End Sub #End Region Public Function ScanFile() As Integer Dim oEnum As Bentley.Interop.MicroStationDGN.ElementEnumerator Dim oScanCriteria As Bentley.Interop.MicroStationDGN.ElementScanCriteriaClass Dim iStatus As Integer oScanCriteria = New Bentley.Interop.MicroStationDGN.ElementScanCriteriaClass oEnum = Bentley.MicroStation.InteropServices.Utilities.ComApp.ActiveModelReference.Scan(oScanCriteria) ListBox1.Items.Clear() Do While oEnum.MoveNext If ListBox1.Items.Contains(oEnum.Current.Type.ToString) = False Then iStatus = ListBox1.Items.Add(oEnum.Current.Type.ToString) End If Loop ScanFile = iStatus End Function Public Sub ShowForm() If s_Current Is Nothing Then s_Current = New ProjectReviewForm End If Dim winManager As Bentley.Windowing.WindowManager winManager = Bentley.Windowing.WindowManager.GetForMicroStation m_window = winManager.DockPanel(s_Current, "ProjectReviewForm", s_Current.Text, Bentley.Windowing.DockLocation.Floating) End Sub Public Sub CloseForm() If s_Current Is Nothing Then Exit Sub End If ProjectReviewAppVB.ReleaseDialog() m_window.Close() m_window = Nothing s_Current = Nothing End Sub End Class End Namespace
The Bentley Developer Network group has a wizard for starting and a tutorial on building .NET AddIn applications.
Return to .NET articles index.