[c#] dll uitsluiten van modulecatalog composite WPF

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
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?

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.

Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Een try-catch-block is hier waarschijnlijk de eenvoudigste oplossing ;)

In dat geval zou ik de body van de SelectMany in een aparte methode zetten. Dan kan je er een try-catch omheen zetten en in het geval dat de Module niet geladen wordt, een lege lijst of iets dergelijks opleveren.

[ Voor 60% gewijzigd door Infinitive op 18-04-2010 23:21 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]