无法在自定义配置文件提供程序中加载类型

Posted

技术标签:

【中文标题】无法在自定义配置文件提供程序中加载类型【英文标题】:Could not load type in Custom Profile provider 【发布时间】:2010-04-19 08:36:56 【问题描述】:

我正在用 C# 编写一个小型控制台应用程序,它引用了一个实现自定义 .net 配置文件提供程序的自定义程序集。我已将以下部分添加到引用自定义类和程序集的 app.config 文件中。

<system.web>
<profile defaultProvider="MyCompanyProfileProvider" inherits="MyCompany.Web.User.GenericProfile" automaticSaveEnabled="false">
    <providers>
        <clear/>
        <add name="MyCompanyProfileProvider" connectionStringName="defaultDatabase" applicationName="/myApplication" type="MyCompany.Web.ProfileProvider, MyCompany.Web"/>
    </providers>
    <properties>
        <add name="JobRoleId" type="System.Int32"/>
        <add name="LastCompetencyId" type="System.Int32" defaultValue="0"/>
        <add name="MixSettings" type="System.Xml.XmlDocument"/>
    </properties>
</profile></system.web>

但是,当我在调试模式下运行应用程序时,我收到以下错误,就好像它正在查看 System.Web 程序集而不是 app.config 文件中指定的程序集一样。

无法从程序集“System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”加载类型“MyCompany.Web.User.GenericProfile”。强>

我有一个本地 Web 应用程序,它也使用程序集和自定义配置文件提供程序,并且可以正常工作。我检查了引用的程序集是否被复制到输出目录。

有什么想法吗??

【问题讨论】:

【参考方案1】:

我终于找到了答案,而且很简单!! (他说,经过数小时的搜索和调试)。

我只需要明确说明我的自定义提供程序驻留在哪个程序集中。我以为只有在添加提供者时指定类型时才需要这样做。

但是,您需要在继承属性中定义配置文件时进行定义。像这样:

之前:

<profile defaultProvider="MyCompanyProfileProvider"
         inherits="MyCompany.Web.User.GenericProfile"
         automaticSaveEnabled="false">

之后:

<profile defaultProvider="MyCompanyProfileProvider" 
         inherits="MyCompany.Web.User.GenericProfile, MyCompany.Web" 
         automaticSaveEnabled="false">

希望这可以帮助将来遇到同样问题的其他人。

【讨论】:

+1 - 这帮助我让我的 NUnit 测试正常工作。运行我的 MVC4 应用程序时一切正常,但是单元测试失败了。确保此更改包含在任何单元测试模块引用的 app.config 文件中。【参考方案2】:

尝试删除指定类和程序集的逗号后面的多余空格,但我认为这不会解决问题。

您的应用正在 System.Web 程序集中查找您的自定义类,这很奇怪。

我会使用fuslogvw 来获取有关失败的更多详细信息。

【讨论】:

尝试了这两个建议,但仍然没有进一步的进展。 Fuslogvw 没有给我任何合适的信息来进一步追踪问题。【参考方案3】:

在我浪费了几天宝贵的时间来解决这个问题之后,你的解决方案让我很抱歉。像往常一样,我浪费了几天时间与微软的产品作斗争,而不是我需要自己解决的实际 IT 问题。我的 App.Config 行现在看起来像这样,而且似乎工作正常:

<profile defaultProvider="DefaultProfileProvider" inherits="SmartTariffs_V13.ProfileCommon, SmartTariffs_V13">
  <providers>
    <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</profile>

其中 SmartTariffs_V13 是项目的名称,SmartTariffs_V13.ProfileCommon 是该项目中 .cs 文件的名称。我发现这无需添加您的“automaticSaveEnabled”标签就可以工作,但是嘿嘿...

【讨论】:

以上是关于无法在自定义配置文件提供程序中加载类型的主要内容,如果未能解决你的问题,请参考以下文章

Cypress 在自定义命令中加载环境变量

如何在Spring容器中加载自定义的配置文件

spring - @ContextConfiguration 无法在 src/test/resources 中加载配置文件

混合模式程序集是针对版本X构建的,如果没有其他配置信息,则无法在运行时的版本Y中加载

libfastcommon总结从文件中加载配置信息

在 Rails 引擎中加载多个配置文件