Hallo,
Nog even een tweede probleem, nadat mijn vorige probleem is opgelost.
Ik heb in WPF 3.5 sp1 en composite application guidance oct 2009 een applicatie met een module A die dll B referenced. B vereist dat dll C in dezelfde map staat om te functioneren. Ik heb C toegevoegd aan de folder waar de module staat, echter als ik mijn applicatie start krijg ik een error melding dat dll C niet geladen kan worden omdat een assembly manifest verwacht wordt.
Ik zat even te kijken in de code van CAG, in .\CAL\Desktop\Composite\Modularity\DirectoryModuleCatalog.Desktop.cs op regel 141 worden de modules in een directory opgezocht. Hoe kan ik dat aanpassen zodat non-.NET dll's worden overgeslagen ipv een error opleveren?
Op regel 32-33 loopt hij vast. De error is:
Ik zat zelf te denken om mijn modules letterlijk 'module' in de naam te geven, en dan nog een where clause toe te voegen, maar misschien is er een optie om dll's over te slaan dat hier op zijn plaats is.
Nog even een tweede probleem, nadat mijn vorige probleem is opgelost.
Ik heb in WPF 3.5 sp1 en composite application guidance oct 2009 een applicatie met een module A die dll B referenced. B vereist dat dll C in dezelfde map staat om te functioneren. Ik heb C toegevoegd aan de folder waar de module staat, echter als ik mijn applicatie start krijg ik een error melding dat dll C niet geladen kan worden omdat een assembly manifest verwacht wordt.
Ik zat even te kijken in de code van CAG, in .\CAL\Desktop\Composite\Modularity\DirectoryModuleCatalog.Desktop.cs op regel 141 worden de modules in een directory opgezocht. Hoe kan ik dat aanpassen zodat non-.NET dll's worden overgeslagen ipv een error opleveren?
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
| [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] internal ModuleInfo[] GetModuleInfos(string path) { DirectoryInfo directory = new DirectoryInfo(path); ResolveEventHandler resolveEventHandler = delegate(object sender, ResolveEventArgs args) { return OnReflectionOnlyResolve(args, directory); }; AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += resolveEventHandler; Assembly moduleReflectionOnlyAssembly = AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies().First( asm => asm.FullName == typeof (IModule).Assembly.FullName); Type IModuleType = moduleReflectionOnlyAssembly.GetType(typeof (IModule).FullName); IEnumerable<ModuleInfo> modules = GetNotAllreadyLoadedModuleInfos(directory, IModuleType); var array = modules.ToArray(); AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= resolveEventHandler; return array; } private IEnumerable<ModuleInfo> GetNotAllreadyLoadedModuleInfos(DirectoryInfo directory, Type IModuleType) { Assembly[] alreadyLoadedAssemblies = AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies(); return directory.GetFiles("*.dll") .Where(file => alreadyLoadedAssemblies .FirstOrDefault( assembly => String.Compare(Path.GetFileName(assembly.Location), file.Name, StringComparison.OrdinalIgnoreCase) == 0) == null) .SelectMany(file => Assembly.ReflectionOnlyLoadFrom(file.FullName) .GetExportedTypes() .Where(IModuleType.IsAssignableFrom) .Where(t => t != IModuleType) .Where(t => !t.IsAbstract) .Select(type => CreateModuleInfo(type))); } |
Op regel 32-33 loopt hij vast. De error is:
code:
1
| Kan bestand of assembly file:///C:\[..]\OUTPUT\dten600.dll of een van de afhankelijkheden hiervan niet laden. Er wordt verwacht dat de module een assembly-manifest zou bevatten. |
Ik zat zelf te denken om mijn modules letterlijk 'module' in de naam te geven, en dan nog een where clause toe te voegen, maar misschien is er een optie om dll's over te slaan dat hier op zijn plaats is.