由于装配中缺少类型的例外(修订)

时间:2009-08-17 23:50:57

标签: c# .net

我在昨天发布的问题上取得了一些进展,所以我正在改写帖子。

我的问题似乎与我对泛型的使用有关。这是App.config的相关部分(为了便于阅读,用空格格式化):

<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>

这是我要尝试映射到配置部分的类:

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; }
        }
    }
}

以下是尝试访问配置文件的C#代码:

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

这是我得到的例外文字:

  
    

为NA5300ResolverSynchroDevices创建配置节处理程序时发生错误:无法加载类型'InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection&lt; NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement&gt;'来自装配'NA5300ResolverSynchroModule'。

  

我知道在C#中,generics在运行时而不是在编译时实例化(与C ++不同)。我还不太了解泛型,以了解当泛型类型和实例化类型存在于不同的程序集中时,运行时生成的类型被认为是什么程序集。上面,我告诉运行时在程序集NA5300ResolverSynchroModule中查找它。我也试过告诉它在程序集InfrastructureModule中查找它。两者都不起作用。

我正在尝试使用genric类型,因为我将有许多配置节,对应的ConfigurationSection派生类型将全部采用上面显示的形式。我想避免代码重复。

任何人都可以看到为什么我的方法失败以及我如何解决它?

2 个答案:

答案 0 :(得分:1)

您的问题实际上是您引用泛型类型的方式。

而不是(缩短):

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

尝试

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

注意`1 [[...]] 而不是&lt; ...&gt; &amp; lt; ...&amp; gt; 部分用于泛型类型。 [[...]]中的部分也可以是完整类型定义 - 如namespace.class,assembly,token。

1 is "generic type with one type parameter". If the type takes 2 "aka SomeType<T,V>", use 2。请注意,您应该将“type,assembly”放在双方括号中,而不仅仅是“type”

答案 1 :(得分:0)

我相信我的问题根源于我尝试映射到配置部分的运行时生成的类型不在程序集中。所以,我创建了一个的类型。

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

我可以在App.config中很好地引用NA5300ResolverSynchroDeviceConfigurationSection。