【问题标题】:C# Windows Service doesn't seem to like privatePathC# Windows 服务似乎不喜欢 privatePath
【发布时间】:2010-05-01 08:45:26
【问题描述】:

我编写了一个 C# Windows 服务来处理我们应用程序的任务调度。我正在尝试将“业务规则”程序集移动到调度应用程序的 bin 子目录中,以便我们更轻松地进行更新(停止服务,删除 bin 文件夹中的所有文件,替换为新文件,启动服务)。

我加了

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <probing privatePath="bin;"/>
  </assemblyBinding>
</runtime>

到服务的应用程序配置,如果服务作为控制台应用程序运行,它可以正常工作。问题是当服务作为 Windows 服务运行时它不起作用。似乎当 windows 运行该服务时,应用程序配置文件被正确读取,但随后该服务被执行,就好像它在 c:\windows\system32 而不是实际的 EXE 位置一样,这会使工作变得混乱。

我们有很多程序集,所以我真的不想使用 GAC 或 &lt;codeBase&gt;。是否可以让 EXE 将其基本目录更改回它作为服务运行时的位置?

【问题讨论】:

  • 如果将 DLL 与 EXE 放在同一个文件夹中,它会起作用吗?然后代码库很好。我没有看到 &lt;configuration&gt; 元素,它在那里吗?使用 fuslogvw.exe 解决分辨率问题。
  • 是的,当 EXE 作为服务运行并且程序集与 EXE 位于同一文件夹中时,一切正常。是的,配置文件有 (实际配置要长得多,这就是我没有发布整个内容的原因)。我会试试 fuslogvw.exe。

标签: c# windows-services


【解决方案1】:

原来我错了。 privatePath 即使在 Windows 服务中也能正常工作。问题是我已将 &lt;runtime&gt; 部分添加到 app.config 的顶部,这会引发错误,因为 &lt;configSections&gt; 不是文件中的第一项。但是,该服务仍然表示它启动良好(我们必须修复)并且用于启动错误的日志文件被写入一个目录,而不是带有 EXE 的目录(我们必须修复的其他东西),一旦我移动了&lt;runtime&gt; 块在 app.config 中的适当位置一切正常。

感谢 fuslogvw.exe 的评论,如果可以的话,我会给你答案。它让我看到 privatePath 被跟踪并且错误在其他地方。

【讨论】:

  • 您的回答让我放心,我可以让它与我的 TopShelf 服务一起使用。就我而言,我从网络上的某个地方复制并粘贴了一个不正确的 xmlns。谢谢!
  • @c17r “合适的地方”在哪里?
  • @David 如果你的配置文件有一个 块,它需要是文件中的第一个块。我首先有 块。我只是把它移到 之后
  • @c17r 不适合我。
  • @David 如果您没有任何自定义配置设置,那么您不需要在其中添加&lt;configSections /&gt;。我不知道这是否是复制/粘贴错误,但您的配置没有 &lt;/configuration&gt; 标签。除此之外,我不确定你的问题可能是什么,一切看起来都很好。如果您仍有问题,请尝试使用fuslogvw.exe 观看。祝你好运!
【解决方案2】:

使用完全限定的路径。如果您在作为服务运行时没有完全限定它,那么您在 system32 中寻找 bin 是正确的。

【讨论】:

  • 我不认为你可以用 privatePath 做一个完全限定的路径,它必须是 EXE 目录的子目录。还是我的知识过时了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多