I have written a plugin application into a third party 3D design software. The 3D design software is owned by another company.
The problem that I have is that with each version of the 3D design software that is released, they add new code and change the version of the dll's that I reference within my plugin app. Therefore I have to completely copy my plugin Visual Studio project, and reference the new version of their dll's and recompile. The problem with this approach is that I then have multiple Visual Studio projects to manage. Because I am only using one function in the API dll, I am 99% sure that they will not change this (an assumption I know).
I want my plugin application to load what ever version of the dll is on the users machine, not the one that I have compiled my application with. Now I have tried setting the "Specific Version" and "Copy Local" property on the dll's to false and this does not work, as it returns the "unable to load dll version ...." error messgae.
One of my friends mention using reflection to load the dll's at runtime, which seems perfect and have tested this using a dll I created to test the approach, and all seemed to work fine. However I have hit a problem with my plugin as this uses an "Implement" from the thrid party dll, and therefore because this is done I am unsure where I can put my reflection code so the dll is reflected prior to the "Implement" code is run.
I hope this makes sense? Below is my code from 2 clases that have to exist within my plugin so as to create a docking form within the thrid party application:
NETAddin.vb
Creates and registers my plugin with the 3D design software and then calls my NetCmd.vb class to create the docking form
NETCmd.vb
This create a docking form with a panel in it
The problem that I have is that with each version of the 3D design software that is released, they add new code and change the version of the dll's that I reference within my plugin app. Therefore I have to completely copy my plugin Visual Studio project, and reference the new version of their dll's and recompile. The problem with this approach is that I then have multiple Visual Studio projects to manage. Because I am only using one function in the API dll, I am 99% sure that they will not change this (an assumption I know).
I want my plugin application to load what ever version of the dll is on the users machine, not the one that I have compiled my application with. Now I have tried setting the "Specific Version" and "Copy Local" property on the dll's to false and this does not work, as it returns the "unable to load dll version ...." error messgae.
One of my friends mention using reflection to load the dll's at runtime, which seems perfect and have tested this using a dll I created to test the approach, and all seemed to work fine. However I have hit a problem with my plugin as this uses an "Implement" from the thrid party dll, and therefore because this is done I am unsure where I can put my reflection code so the dll is reflected prior to the "Implement" code is run.
I hope this makes sense? Below is my code from 2 clases that have to exist within my plugin so as to create a docking form within the thrid party application:
NETAddin.vb
Creates and registers my plugin with the 3D design software and then calls my NetCmd.vb class to create the docking form
Code:
Imports ThirdParty.ApplicationFramework
Imports ThirdParty.ApplicationFramework.Presentation
Public Class NETAddin
Implements IAddin ' This is from the third party dll
' Set the DESCRIPTION string for the CLASS
ReadOnly Property Description() As String Implements IAddin.Description
Get
Return "Myplugin Description"
End Get
End Property
' Set the NAME string for the CLASS
ReadOnly Property Name() As String Implements IAddin.Name
Get
Return "Myplugin Name"
End Get
End Property
' When the ADDIN is started, register the command with the command manager
Public Sub Start(ByVal serviceManager As ServiceManager) Implements IAddin.Start
' Get instances of the COMMANDMANAGER and WINDOWMANAGER
RISData.Instance.CommandManager = serviceManager.GetService(GetType(CommandManager))
RISData.Instance.WindowManager = serviceManager.GetService(GetType(WindowManager))
' Declare the NETCMD and register it with the COMMANDMANAGER
Dim CreatePanel As NETCmd = New CreatePanelNETCmd(RISData.Instance.WindowManager)
RISData.Instance.CommandManager.Commands.Add(CreatePanel)
End Sub
' For completeness, implement the STOP Sub, but it is left empty
Public Sub [Stop]() Implements IAddin.Stop
End Sub
End Class
NETCmd.vb
This create a docking form with a panel in it
Code:
Imports ThirdParty.ApplicationFramework.Presentation
Imports System.Windows.Forms
Public Class NETCmd
Inherits Command
' Store the private members for the class
Private mForm As DockedWindow
Private bSkip As Boolean = False
' Constructor method, supplied with an instance of the WINDOWMANAGER
Public Sub New(ByRef wndManager As WindowManager)
' Update the KEY of the COMMAND (must be unqiue for all the loaded commands)
MyBase.Key = "MyCompany.MyPlugin.Main"
' Add an EVENT to look out for when the window is loaded
AddHandler wndManager.WindowLayoutLoaded, AddressOf OnWindowLayoutLoaded
' Create the CONTROL and set the docking position
Dim control As UserControl = New frmCreateComment
Dim docking As DockedPosition = DockedPosition.Right
' Create a new DOCKED window in the WINDOWMANAGER
mForm = wndManager.CreateDockedWindow("MyCompany.MyPlugin.Main", "Plugin Title", control, docking)
' Allow the form to be floated and set the initial width
mForm.Floatable = True
mForm.Width = 435
mForm.SaveLayout = False
' Add an EVENT to look out for when the window is closed
AddHandler mForm.Closed, AddressOf OnFormClosed
' Sets value so that knows if RIS has been loaded and ignores error on close
RISData.Instance.RISLoaded = False
End Sub
' When the control is loaded, ensure the CHECKED property is TRUE
Sub OnWindowLayoutLoaded(ByVal sender As Object, ByVal e As EventArgs)
Me.Checked = mForm.Visible
End Sub
' When the CONTROL is closed, ensure the CHECKED property is FALSE
Sub OnFormClosed(ByVal sender As Object, ByVal e As EventArgs)
' to override problem in 12.0.SP5
Me.bSkip = True
Me.Checked = False
Me.bSkip = False
RISData.Instance.WindowManager.Windows("MyCompany.MyPlugin.ViewComments").Visible = False
End Sub
' The CHECKED property is used by toggle gadgets on toolbars
Public Overrides Property Checked() As Boolean
Get
Return mForm.Visible
End Get
Set(ByVal value As Boolean)
MyBase.Checked = value
End Set
End Property
' When the COMMAND is executed, either hide or show the FORM
Public Overrides Sub Execute()
' If BSKIP is TRUE, stop
If bSkip Then
Return
End If
' If the FORM is visible, hide it and vice versa
If mForm.Visible Then
mForm.Hide()
Else
mForm.Show()
End If
' Execute standard method on the base class
MyBase.Execute()
End Sub
End Class