0

祝大家心情愉快!请帮助我使用 Unity。

我的 App.config 文件包含:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <system.diagnostics>
    <sources>
      <source name="TraceTest" switchName="SourceSwitch"
        switchType="System.Diagnostics.SourceSwitch" >
        <listeners>
          <add name="console" />
          <remove name ="Default" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="SourceSwitch" value="All" />
    </switches>
    <sharedListeners>
      <add name="console"
        type="System.Diagnostics.ConsoleTraceListener"
        initializeData="false"/>
    </sharedListeners>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="console" />
      </listeners>
    </trace>
  </system.diagnostics>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="ContextDownloader"/>
    <namespace name="ContextDownloader.Log"/>
    <namespace name="System.Diagnostics"/>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, 
Microsoft.Practices.Unity.Interception.Configuration"/>
    <container>
      <extension type="Interception"/>
      <register type="ILogWorker" mapTo="FileLogWorker">
        <interceptor type="InterfaceInterceptor"/>
        <interceptionBehavior type="TraceBehavior"/>
      </register>
      <register type="TraceSource" name="interception">
        <constructor>
          <param name="name" type="System.String" value="TraceTest" />
        </constructor>
      </register>
      <register type="TraceBehavior">
        <constructor>
          <param name="source" dependencyName="interception" />
        </constructor>
      </register>
    </container>
  </unity>
</configuration>

我在代码中从 App.config 加载配置:

var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = "App.config" };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
var container = new UnityContainer();

所以它抛出异常

未处理的异常:System.Configuration.ConfigurationErrorsException:为统一创建配置节处理程序时出错:类型名称或别名 Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,Microsoft.Practices.Unity.Interception.Configuration 不能解决。请检查您的配置文件并验证此类型名称。

排队var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");。如何加载 Microsoft.Practices.Unity.Interception.Configuration 程序集?

有关应用程序的更多详细信息。我有控制台应用程序和库。我刚刚在我的控制台应用程序中调用了一种方法,然后所有逻辑都在库中。

感谢您对此 Microsoft.Practices.Unity.InterceptionExtension.Configuration.dll 复制到输出库的回答。你能帮我加载 system.diagnostic 部分吗?

4

1 回答 1

1

您是否确认Microsoft.Practices.Unity.Interception.dllMicrosoft.Practices.Unity.Interception.Configuration.dll位于您的应用程序基础文件夹中,或者它们已在 GAC 中注册?

您是否检查过您的App.config文件仍然App.config在编译后命名,而不是重命名为类似的名称MyApp.Foo.dll.config

能否请您发布完整的配置文件。上面的代码片段在我的机器上完美运行,所以我想还有一些东西丢失了。

顺便说一句:如果你想使用默认值App.config或者Web.config无论如何你可以放弃ExeConfigurationFileMap并直接调用ConfigurationManager.GetSection("unity")


更新

所以你有一个不是控制台应用程序的应用程序(例如 WinForms 或 WPF)并且想要将跟踪输出写入控制台?那么也许这篇文章可以提供帮助。它展示了如何使用来自托管代码的本机 Win32 调用来分配控制台窗口。

如果您想使用与库捆绑在一起且独立于应用程序配置文件的配置文件,则可能会对 StackOverflow 上的这篇文章感兴趣。

于 2012-06-01T07:43:04.023 回答