2009-08-17 7 views
0

J'ai fait quelques progrès sur le problème que j'ai posté hier, donc je réécris le post.Exception due au type manquant de l'assemblage (révisé)

Mon problème semble être lié à mon utilisation de génériques. Voici la partie pertinente de App.config (formaté avec un espace pour une meilleure lisibilité):

<configSections> 
    <section 
     name="NA5300ResolverSynchroDevices" 
     type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection 
      &lt;NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement&gt;, 
      NA5300ResolverSynchroModule"> 
    </section> 
</configSections> 

<NA5300ResolverSynchroDevices> 
    <Device deviceName="AzResolverSynchro" busAddress="7"/> 
    <Device deviceName="ElResolverSynchro" busAddress="8"/> 
</NA5300ResolverSynchroDevices> 

Voici la classe que je suis en train de la carte à la section de configuration:

namespace InfrastructureModule.DeviceConfiguration 
{ 
    public class DeviceConfigurationSection<T> : ConfigurationSection 
      where T : DeviceConfigurationElement, new() 
    { 
     [ConfigurationProperty("", IsDefaultCollection = true, IsKey = false)] 
     public DeviceConfigurationElementCollection<T> Devices 
     { 
      get { return (DeviceConfigurationElementCollection<T>) base[""]; } 
      set { base[""] = value; } 
     } 
    } 
} 

Voici le code C# qui tente pour accéder au fichier de configuration:

DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement> devices = 
    ConfigurationManager.GetSection("NA5300ResolverSynchroDevices") as 
    DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement>; 

Voici le texte d'exception que je reçois:

Une erreur est survenue la création du gestionnaire de section de configuration pour NA5300ResolverSynchroDevices: Impossible de charger le type 'InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection <NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement>' ensemble de 'NA5300ResolverSynchroModule.

Je sais que dans C génériques # sont instanciés lors de l'exécution plutôt que de la compilation (contrairement à C++). Je ne sais pas encore assez sur les génériques pour comprendre à quel assemblage un type généré à l'exécution est considéré comme vivant lorsque le type générique et le type d'instanciation vivent dans des assemblages différents. Ci-dessus, j'ai dit à l'exécution de le chercher dans l'assemblage NA5300ResolverSynchroModule. J'ai également essayé de lui dire de le chercher dans l'ensemble InfrastructureModule. Aucun des deux ne fonctionne.

J'essaye d'utiliser un type de générique parce que j'aurai beaucoup de sections de config pour lesquelles les types dérivés de ConfigurationSection correspondants seront tous de la forme montrée ci-dessus. Je veux éviter la duplication de code.

Quelqu'un peut-il voir pourquoi mon approche est défaillante et comment je peux la réparer?

+0

Il est dû à la façon dont il est la création du gestionnaire de configuration. A quoi ressemble la section de configuration? –

+0

Cette exception serait provoquée si le type n'était pas dans l'assembly. .NET n'invente pas cela ou ne vous ment pas. Il a vraiment besoin de ce type, et ce n'est pas vraiment dans cet assemblage. Vous devez enquêter pour savoir comment cela pourrait être vrai. –

+0

Dave

Répondre

1

Votre problème est réellement comment vous avez référencé le type générique.

au lieu de (raccourci):

<section name="..." 
type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection 
      &lt;NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement&gt;, 
      NA5300ResolverSynchroModule" /> 

Essayez

<section name="..." 
type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection`1[[NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement, NA5300ResolverSynchroModule]], 
      NA5300ResolverSynchroModule" /> 

Notez le `1 [[...]] plutôt que <...> ou & lt; ... & gt; partie pour le type générique. La partie à l'intérieur du [...]] peut également être une définition complète de type - comme namespace.class, assembly, token.

Le 1 is "generic type with one type parameter". If the type takes 2 "aka SomeType<T,V>", use 2. Notez que vous devez mettre « le type, l'assemblage » dans les doubles crochets, pas seulement « type »

+0

Eh bien, il se trouve que je ne suis pas encore tout à fait là. J'ai essayé à la fois un tick avant (') et un tick arrière ('), et j'ai essayé à la fois InfrastructureModule et NA5300ResolverSynchroModule pour l'assemblage. C'est quatre combinaisons, et tous ont abouti à une exception indiquant toujours que le type requis n'a pas pu être trouvé dans l'assemblage que j'ai spécifié. Je pense que c'est vraiment proche. Y at-il un certain réglage syntaxique qui doit être fait à votre suggestion? – Dave

+0

Pour le compte rendu, il y a un backtick, 1, doubles crochets: '1 [[- Les deux types sont-ils dans le même assemblage? –

+0

J'ai édité avec un peu plus d'infos. –

0

Je crois que mon problème était ancré dans le fait que le type généré par l'exécution que j'ai essayé de mapper à une section de configuration ne réside pas dans un assemblage. Donc, j'ai créé un type que ne vit dans un assigne.

namespace NA5300ResolverSynchroModule 
{ 
    public class NA5300ResolverSynchroDeviceConfigurationSection : 
      DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement> 
    { 
    } 
} 

Je peux faire référence à NA5300ResolverSynchroDeviceConfigurationSection très bien dans App.config.

+0

Ce n'est pas l'emplacement de votre type générique, c'est en fait la syntaxe dans votre app.config. –