.net - Plugin Architecture - Make An MDI Parent Form Aware Of Children In DLLs
Jan 25, 2010
I'm experimenting with a plugin architecture for my company's internal business system. I have managed to read all .DLLs in a Plugin folder which implement a specific interface. What I am trying to figure out is the best method of communication between the "host" MDI parent application and forms that will be in the .DLLs which I intend to make MDI children.
Currently, I am returning just ToolStripMenuItem objects from the .DLLs to add to the MDI Parent. I've also tested that events wired in the .DLLs to the ToolStripMenuItems do propagate to the code in the .DLLs. I've also managed to return a Form object via the interface and open that form, as the Plugin folder is being "scanned".
However, I am not clear how I would make these forms MDI children. Also, any other forms living in the .DLLs will also have to be MDI children. I created a VS 2008 Addin project just to see what's going on, and it seems that the Addin accepts an Application object on which it adds to the ToolStripMenuItems and does other operations. The code to build the menu inside the .DLL. This is opposite of what I have done so far, where the MDI requests a ToolStripMenuItem from each .DLL and adds the returned object to its own menu.
Would designing my plugin architecture to accept an application object in the same manner the only way I could get forms to open as an MDI child? Am I asking for other, currently unknown to me, headaches by NOT passing in the application object to the .DLL?
I need to write an app that that will iterate over our database, and perform various anaylsis on each record. In order to do this (partially for the learning exercise in creating plugin support) I want to use a Plugin model.
Currently, I have a simple Interface in my main app, which plugins can Implement. My app then loads all DLL's in a folder looking for ones implementing the Interface.
As you can see in the pseudo-code below, I have to keep performing a loop through all loaded plugins calling the process methods.
Sub ProcessData() For Each Record In MyDataSet For Each Plugin In MyPluginCollection
how to create a stable plugin architecture. Stable because I plan on opening up plugin creation to the public but I dont want a sloppy coded plugin to take down my whole application.
So I thought of using an AppDomain per plugin and I did a little seaching. But it seems that even using a temp AppDomain to load plugins and then unloading it once all assemblies have been inspected raises complexity allot and I was planing on using an AppDomain per plugin.
I feel the gained stability (if there is any at all) may be raising the complexity so much the app will never be done..
Is there another way to both create a stable application and at the same time making it extensible?
I cases where the host calls a defined function via say IPluginInterface I guess I can pack a whole lot of try catch blocks around that call but what if a plugin insisted of a timed routine that would run continously without being invoked from the host other that a starting call to StartPluginService or something like that?
If I include a plugin like that in the default AppDomain and it blows up I sure will blow my own foot off right?
I have four children in a parent container. Each child form is a test for the user to type correct answers into text boxes. Option to open each form is on a menu strip in the parent. In form load, I have disabled all but the first form option. I only want the second form to become available if the first form answers are correct. I would like to figure this out on my own as much as possible. I have searched on line but since I am not sure what to ask, I have not found and answer. Can someone get me started in the right direction? Perhaps some reading that would explain how to go about this, or what I should be typing into google to get what I'm looking for.
How do you set it up so that a treeview control will select/deselect all children of a parent when it is selected/deselected? Is there a property you set or do you have to write code to do it?
I'm working on a drag-and-drop method to copy items from a listview control to a treeview. I've got the drag and drop working, but I'm hoping to limit the ability to drag items that create a child of a child. Ideally, if someone drags an item from the listview to the Treeview and the drop the listview item over a child, it would drop the dragged item to the parent.
I have recently built an N-Tier app using VB.Net 2008. The application is based on Beth Massi's tutorial at [URL] I am trying to incorporate a datagrridview control on a Parent form - one parent (father and mother) to many children. For example,
I have a the following Class structure. Company > List(of Departments) > List(of Employees) I want to Query a Company to find out if it has a department of the following name and a Employee in that department with the following ID! How could I query this. The way I have the code it expect to return one department so I have it doing
Basically, I am trying to write a LINQ to Objects statement where the relationship is a grandparent, parent, child relationship. (You could also call it a Master Detail relationship.)
In Legacy code here is a simplified version what I am trying to accomplish. Dim coverages As New List(Of Coverage) Dim coverage As Coverage For Each rl In oClaimsPolicy.RiskLocations coverage = New Coverage coverage.Level = "Location" [Code] .....
If is it not clear one Location can have many Items and one Item can have many Coverages. I basically want to list the items and show the relationship between grandparent (Location), parent (Item) and child (Coverage).
I am working on my final project and I need to have 1 MDI Form. For the life of me I cannot figure out what to do. My book mentions doing this:
Dim childForm as New ChildFormClass() childForm.MdiParent = parentForm childForm.Show()
When I put that in the Parent form it doesn't like the ChildFormClass(). I wouldn't think it would be too hard to make a parent child relationship? I have tried looking for the MdiList property but I cannot seem to find it. I think I need to have some menu items to have a child form. If there is a way to have an MDI form without that I would like that. Does anyone know a good tutorial that explains creating MDI forms well, and what to do/put in the parent and child forms code?
i need to check all child node when the parent node is checked and i had do research from the internet but it seem that i had a error which is Type 'MSComctlLib.Node' is not defined.do i need to import any reference? [code]
I'm trying to make an MDI parent form to call other forms. I have put this code which I found in a post here into the main form which I added to my project as an MDI parent form:
[Code]...
I get an error message which say FrmEmbed is not defined. How can I correct this?
I do have some classes that implement their own serialization/deserialization but I'm doing all of these without implementing system.runtime.serialization.ISerializable. so my question is what exactly is the benefit of using system.runtime.serialization.ISerializable ? in what example situation will we need to implement system.runtime.serialization.ISerializable?
I've got a C#.NET background and due to circumstances I'm trying to make a plugin written in VB.NET. I've created a new class project which gives me a DLL. This class implements a C# interface which all works.My only question is this... In my C# code I've got an implemented DLL (which loads at runtime) with the following declaration before the class...
[Plugin(PluginType.Storage)] public class XmlPlugin<T> : IStoragePlugin<T> {
[code]....
How do I write [Plugin(PluginType.Storage)] in VB syntax?
i am wondering how to make a trackbar with vlc activex plugin i have it part working but i want to make it more accurate meaning how do i make it display the exact seconds then it is right now here is the code
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick With TrackBar1 .Minimum = "0"
[code]....
that is the timer i am using to set the track bar's values and the trackbar1 to take the time and play it at that time?
I am looking for the best way to make a plugin type system for themes. have allow users to create custom GDI based controls in a dll plugin that is to be able to be switched on runtime by users. My issue is there is no way to have a dynamic inheritance so how can I make it so the controls show in the toolbox and can be changed on runtime?
does anyone know if there is a plugin that makes it available to make visual studio language independend? So when I "push" a button I can see and edit the code in C# or in VB.net? I would be ok if I cant use all language specific options.
Ive created an application that reads plugins but I can't figure out a way of making a form thats housed in the plugin into an MDI for my existing application.[code]...
I am trying to understand how to interact with external DLLs written in C++ for use in my VB.NET application. I have some DLLs that a client wrote that do some math functions. Everything was working on a 32-bit machine. Because we were taxing the 32-bit machine we moved to 64-bit. Now we can't get the same functions to work. The DLLs were re-compiled as 64-bit DLLs and they still don't work. So my client wrote some dummy DLLs to see if we could figure out the problem. Here are the "signatures" of the DLL calls that I am making:[code]....Ultimately I would like to get to calling initialize_quiet and I am guessing at the format of the marshalling, const size etc.
i MDI form there, i was create the children form within a same MDI form every time i click on the button to show the form, which means i create a new form, how i do for ensure that each time i click on the button there will not create a new form is the form is really exist? how to avoid duplicate of the form will not exist twice?another 1 more question is also about the MDI form, everytime i create i new form, the new form is covered by old form, how i do that the new form i created will always show infront, other 1 will show at behide
I've decided to make an new archiver based on existing dlls. Im aiming at a simple 7zip style archiver thats quadcore optimized and 8 core compatible (the 8 core part can wait cause amd's bulldozer aint out yet). I'd like to include [code]Where do I start? And where can I get the dll's? (multiupload.com links are nice).
[URL]. Attached is a MEF WPF and WinForms project that I have been playing around with. I was able to add two 'plug-in' buttons to the form but how do I provide functionality to the buttons? How can I add objects from a separate assembly, like most plug-ins do? Let's say I want to break out each menu (File, Edit, View, Tools) into their own assemblies, leaving the main application window as a blank form that will import each assembly on startup. Also, could functionality from the Edit menu assembly interact with the code from the File menu assembly? I have also not created custom user controls before so as you can see I am having trouble creating a plug-in menu structure.
I have two mdi children forms open. I would think that clicking on the non active form would change the focus from the active form to the form I just clicked on. It only does this if I click on the title bar. Then the focus changes. But if I click on a control on the non-active form, focus does not transfer.
I am trying to create an interface between a third party application which can make use of C/C++ DLLs, but no interface directly to .NET. What I was hoping to accomplish (not sure if possible though), is create a very basic C++ DLL (not .NET), which the third party application would call directly. This DLL would contain a basic method such as "DoSomething()". Somehow, from my .NET application, I want to "listen" to this DLL and "takeover" the DoSomething() method, and then returning the result back to the DLL, which will in turn return the result back to the calling third party application.
I don't even know if this is possible because I'm sure I would somehow have to get a hold of the memory space of the DLL as initiated by the third party application. Also, it seems that creating a managed DLL does not work, based on feedback from other individuals who have tried this.
I am trying to create an application. I am using MDI forms method to navigate throughout the application. However, when a user clicks a button to create a new child or when the application execute this code
I'm trying to create a MDI DockManager component. Basically what it should do is take each MDI child form and turn it into a TabPage. Instead of showing the MDI forms, the main form then hosts a TabControl with each 'form' as a TabPage.I expect this to be quite a big challenge, and I know I will probably not manage to do it... But it would be a great control if I could!Well, for this to work I need my component to know when an MDI child form is added / removed. As far as I know, there are no events the form throws when this happens... The forms are not added to the Controls collection (are they?!) but the user merely sets the MdiParent property of the child forms.
The only useful event I could find was the MdiChildActivate event, which should fire when an MDI child is activated. I am pretty sure that is not enough for my idea. It might be enough to detect new MDI child forms being added, but if one is closed (eg, removed) there is no way I can detect that.So, I'm basically looking for a way to detect when an MDI child is added or removed from a form. Is that possible at all?