4

我想在 Visual Studio 解决方案中创建 3 个项目:

  • Windows 服务(参考业务层、公共层、log4net.dll)
  • 业务层(参考公共层、log4net.dll)
  • 公共层(参考 log4net.dll)

脚步:

  1. 我使用向导创建了业务层和公共层,没有做任何修改。我设置了参考,一切正常。

  2. 然后我创建了一个新的 Windows 服务项目添加到解决方案中。我注意到它添加了目标平台 x86 而不是 Any CPU。我引用了这 3 件事,代码颜色正确,预编译错误消失:这意味着引用被识别。

  3. 但是,当我构建解决方案时,Windows 服务项目出现编译错误:找不到任何引用的程序集。

这里发生了什么?x86 配置是否导致“找不到类型或命名空间名称‘log4net’(您是否缺少 using 指令或程序集引用?)”错误?

我强制 Windows 服务项目使用任何 CPU 配置。我仔细检查了每一个参考,它们是正确的。我仍然无法引用任何内容。

系统规格:

  • Windows 7 x64 SP1 视觉工作室 2010
  • 最终的
4

3 回答 3

6

好吧,你已经找到了答案。Log4net 依赖于 System.Web.dll,这是一个在客户端配置文件中不可用的程序集。这种依赖的可能核心原因是 log4net.Appender.AspNetTraceAppender 类,它使用 HttpContext 类并且需要 System.Web。

现在,这是您需要从库的文档中或通过艰难的方式找到它来了解的内容。构建会产生警告,但它只是警告而不是错误,很容易错过:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1360,9):警告 MSB3253:引用的程序集“C:\projects\WindowsFormsApplication2\ClassLibrary1\bin\Debug\ClassLibrary1.dll”无法解决,因为它依赖于“System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,它不在当前目标框架“.NETFramework,Version=v4.0,Profile=Client ”。请删除对不在目标框架中的程序集的引用,或考虑重新定位您的项目。

随后是代码中尝试引用包含 log4net 引用的程序集中的类的任何语句的错误。

C:\projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs(12,9):错误 CS0246:找不到类型或命名空间名称“ClassLibrary1”(您是否缺少 using 指令或程序集引用?)

如果您在编写代码时没有增量构建,您也不会错过任何内容,并且可能会出现很多错误。您专注于错误并且不会意识到警告是错误的真正来源。另一个令人讨厌的陷阱是 IntelliSense 一开始很高兴,它确实正确地解析了程序集引用。有一些证据表明警告并不总是产生,纯粹是因为许多程序员似乎错过了它。不过,我还没有找到这种情况。没有把握。

于 2011-07-03T15:59:10.247 回答
3

在失去了几把头发后,我发现了这个 Stackoverflow答案,它解决了这个问题。但是为什么 Visual Studio 会添加一个以x86作为目标平台并以.Net Framework 4 Client Profile作为目标框架的 Windows 服务呢?

于 2011-07-03T09:13:11.750 回答
0

检查解决方案是否已构建。您可以通过右键单击解决方案 > 属性 > 配置属性来执行此操作。确保构建所有解决方案

于 2011-07-03T09:13:59.457 回答