Hallo allemaal,
Wij maken gebruik van Windows Workflow Foundation 4 in onze applicaties (WinForms). De eindgebruikers van onze applicaties hebben de mogelijkheid om zelf workflows aan te maken met de rehosted workflow designer. Deze designer is door middel van een ElementHost en een WPF UserControl op een WinForms form geplaatst.
Naast het maken van workflow kunnen eindgebruikers ook assemblies inladen als references zoals dit bijvoorbeeld ook in Visual Studio kan.
Met gewone .dll assemblies geeft dit geen problemen en de types binnen de dll kunnen ook in de workflow gebruikt worden. De assemblies worden opgeslagen in de database en tijdens het laden van de applicatie worden deze op schijf gezet in een tijdelijke map en ingeladen door middel van de Assembly.Load functie.
Naast gewone .dll assemblies willen we ook toestaan om Activity Libraries met daarin Workflow Activities in te laden en de Activities in deze assemblies toe te voegen aan de ToolBoxControl met activities. Hierin gaat het fout.
Zo gauw ik probeer de activities toe te voegen aan de ToolBoxControl krijg ik een FileNotFound exception. Ergens in de .Net code wordt geprobeerd de zojuist gekozen assemblies nogmaals in te laden, terwijl ik deze zelf al ingeladen heb door middel van Assembly.Load(). Ik heb er zelf al de types welke erven van Activity al uit opgehaald.
De code die ik nu heb is als volgt:
Aan de ene kant begrijp ik de exception wel, het framework probeert de dll te zoeken maar kan deze niet vinden omdat die buiten de zoekplaatsen zich bevindt, maar de dll is al ingeladen dus er hoeft eigenlijk helemaal niet gezocht te worden.
Weet iemand misschien hoe dit op te lossen is?
Wij maken gebruik van Windows Workflow Foundation 4 in onze applicaties (WinForms). De eindgebruikers van onze applicaties hebben de mogelijkheid om zelf workflows aan te maken met de rehosted workflow designer. Deze designer is door middel van een ElementHost en een WPF UserControl op een WinForms form geplaatst.
Naast het maken van workflow kunnen eindgebruikers ook assemblies inladen als references zoals dit bijvoorbeeld ook in Visual Studio kan.
Met gewone .dll assemblies geeft dit geen problemen en de types binnen de dll kunnen ook in de workflow gebruikt worden. De assemblies worden opgeslagen in de database en tijdens het laden van de applicatie worden deze op schijf gezet in een tijdelijke map en ingeladen door middel van de Assembly.Load functie.
Naast gewone .dll assemblies willen we ook toestaan om Activity Libraries met daarin Workflow Activities in te laden en de Activities in deze assemblies toe te voegen aan de ToolBoxControl met activities. Hierin gaat het fout.
Zo gauw ik probeer de activities toe te voegen aan de ToolBoxControl krijg ik een FileNotFound exception. Ergens in de .Net code wordt geprobeerd de zojuist gekozen assemblies nogmaals in te laden, terwijl ik deze zelf al ingeladen heb door middel van Assembly.Load(). Ik heb er zelf al de types welke erven van Activity al uit opgehaald.
De code die ik nu heb is als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| public Assembly AddReference(string AssemblyFileName) { try { Assembly asm = Assembly.LoadFrom(AssemblyFileName); //Load the assembly AssemblyContextControlItem contextItem = _WorkflowDesigner.Context.Items.GetValue<AssemblyContextControlItem>(); if (contextItem.ReferencedAssemblyNames == null) { contextItem.ReferencedAssemblyNames = new List<AssemblyName>(); } contextItem.ReferencedAssemblyNames.Add(asm.GetName()); _WorkflowDesigner.Context.Items.SetValue(contextItem); var root = GetRootElement(); var fullname = asm.FullName; if (null == root) { return null; } VisualBasicSettings vbs = VisualBasic.GetSettings(root) ?? new VisualBasicSettings(); var namespaces = (from type in asm.GetTypes() select type.Namespace).Distinct(); foreach (var name in namespaces) { var import = new VisualBasicImportReference() { Assembly = fullname, Import = name }; vbs.ImportReferences.Add(import); } VisualBasic.SetSettings(root, vbs); List<Type> activities = GetActivitiesFromAssembly(asm); if (activities != null && activities.Count > 0) { AddCategoryToToolbox(_ToolboxControl, asm.GetName().Name, activities); } _ReferencedAssemblies.Add(asm.GetName().Name, asm); return asm; } catch (Exception) { return null; } } private void AddCategoryToToolbox(ToolboxControl tb, string Category, List<Type> activities) { var builder = new AttributeTableBuilder(); ToolboxCategory cat = CreateToolboxCategory(Category, activities, true, builder); MetadataStore.AddAttributeTable(builder.CreateTable()); tb.Categories.Add(cat); } |
Aan de ene kant begrijp ik de exception wel, het framework probeert de dll te zoeken maar kan deze niet vinden omdat die buiten de zoekplaatsen zich bevindt, maar de dll is al ingeladen dus er hoeft eigenlijk helemaal niet gezocht te worden.
Weet iemand misschien hoe dit op te lossen is?
Hail to the king baby!