23

我有一个 C# 类库和一个启动项目(一个控制台应用程序)。类库包括对 Web 服务的服务引用。当我尝试运行该项目时,我得到一个 InvalidOperationException,因为启动项目没有读取类库的 app.config,并且它忽略了服务引用。为了让它工作,我不得不向启动项目添加相同的服务引用。有什么办法可以避免这种情况吗?我可以让启动项目识别类库的服务引用和app.config,而不必将其复制到启动项目中吗?

我尝试从类库中添加指向 app.config 的链接,但这不起作用。如果类库需要使用它的任何人将该服务引用添加到启动项目,那么它的可移植性就不是很好。

4

5 回答 5

15

想想你想要做什么——你有两个正在构建的程序集:

Library
ConsoleApp

这两个程序集都有配置文件——我想它们看起来像这样:

Library
    app.config
ConsoleApp
    ConsoleApp.exe.config

当您运行ConsoleApp时,它无法读取或了解app.config您的Library程序集。它知道或关心的唯一配置文件是ConsoleApp.exe.config. 现在可以让配置文件相互引用,但这不是您尝试做的正确解决方案。

由于您的Library程序集没有入口点,因此它永远不会加载到 AppDomain 中。因为它永远不会被加载到 AppDomain 中,所以它的应用程序配置文件永远不会被使用。

您应该做的是通过项目引用进行引用LibraryConsoleApp然后将所有相关配置数据app.config移入ConsoleApp.exe.config,因为这是您的应用程序将使用的配置文件。

这将允许您在 Web 服务上调用方法所需的两件事

  1. 其中的代码Library可以发送和接收 SOAP 消息。
  2. 运行所需的配置元数据Library
于 2009-02-09T20:38:47.227 回答
3

在类库中使用服务引用然后复制配置的替代方法是使用调用 svcutil.exe 的构建事件。我喜欢这一点的一点是,当服务更改时,您不必进行“更新服务参考”。它将自动更新。

在类库中,使用只生成代理代码的构建事件:

svcutil.exe net.tcp://localhost:3315/MyService/mex /noConfig

在应用程序中,使用生成配置的构建事件。您可以使用 /mergeConfig 选项将其合并到现有的 app.config 中。

svcutil.exe net.tcp://localhost:3315/MyService/mex 
            /config:App.config /mergeConfig

如果您不想在服务未运行时出现构建错误,请将其放入项目文件中,您将收到警告而不是错误:

<Target
    Name="PreBuildEvent"
    Condition="'$(PreBuildEvent)'!=''"
    DependsOnTargets="$(PreBuildEventDependsOn)">
  <Exec WorkingDirectory="$(OutDir)"
        Command="$(PreBuildEvent)"
        ContinueOnError="true" />
</Target>
于 2010-04-19T11:14:51.240 回答
1

您只需将指向服务的配置键从类库配置文件复制到控制台应用程序的配置文件。

于 2009-02-09T19:40:44.073 回答
1

您可以将 app.config 的相关部分从类库的配置复制到控制台应用程序的 app.config 中。

或者,如果您真的想使其真正可移植,则需要考虑另一种方法来从类库中引用特定服务引用的地址。

于 2009-02-09T19:41:22.527 回答
0

如果您有多个配置文件在运行,我认为它会更加混乱。

如果一个库有可配置的项目,我完全希望必须将该配置放在我的配置文件中才能正确使用该库。

于 2009-02-09T19:40:54.917 回答