我有一个C#类库和一个启动项目(一个控制台应用程序)。类库包括对Web服务的服务引用。当我尝试运行项目时,我得到一个InvalidOperationException,因为启动项目没有读取类库的app.config,而是忽略了服务引用。为了使它工作,我被迫为启动项目添加相同的服务引用。有什么方法可以避免这种情况吗?我是否可以让启动项目识别类库的服务引用和app.config,而不必将其复制到启动项目中?
我已尝试从类库中添加指向app.config的链接,但这不起作用。如果需要使用它的任何人将该服务引用添加到启动项目中,则类库不是非常便携。
答案 0 :(得分:15)
想想你想要做什么 - 你有两个正在构建的程序集:
Library
ConsoleApp
这两个程序集都有配置文件 - 我想它们看起来像这样:
Library
app.config
ConsoleApp
ConsoleApp.exe.config
当您运行ConsoleApp
时,它无法从app.config
程序集中读取或了解Library
。它知道或关心的唯一配置文件是ConsoleApp.exe.config
。现在可以让配置文件相互引用,但这不是您尝试做的正确解决方案。
由于您的Library
程序集没有入口点,因此永远不会将其加载到AppDomain中。由于永远不会将其加载到AppDomain中,因此永远不会使用其应用程序配置文件。
您应该做的是通过项目参考在Library
中引用ConsoleApp
。然后将所有相关配置数据从app.config
移动到ConsoleApp.exe.config
,因为这是您的应用程序将使用的配置文件。
这将允许您在Web服务上调用方法所需的两件事
Library
中可以发送和接收SOAP消息的代码。 Library
运行所需的配置元数据。 答案 1 :(得分: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>
答案 2 :(得分:1)
您可以将app.config的相关部分从类库的配置复制到控制台应用程序的app.config中。
或者,如果您真的想要使其真正可移植,那么您需要考虑从类库中引用特定服务引用的地址的另一种方法。
答案 3 :(得分:0)
您只需将指向服务的配置密钥从类库配置文件复制到控制台应用程序的配置文件中。
答案 4 :(得分:0)
如果您有多个配置文件在运行,我认为会更加混乱。
如果一个库有可配置的项目,我完全希望必须将该配置放在我的配置文件中以正确使用该库。