【问题标题】:C# Windows loses reference to class library when those classes use certain objects?当这些类使用某些对象时,C# Windows 会丢失对类库的引用?
【发布时间】:2011-05-14 16:08:19
【问题描述】:

我完全改写(更准确地说)我正在经历失去对 C# Windows 服务中引用的类库的引用。

过程: 创建了一个全新的 C# .Net v4.0 Windows 服务。 在该解决方案中,我创建了一个新的类库,该类库将从服务的 OnStart() 方法中调用,并在 Windows 服务中对类库进行引用。 我导入了 RssToolkit 项目(找到 here)。 RssToolkit 项目框架是 2.0(不过没关系),但仅供参考。引用类库中的 RssToolkit。

所以,我们有 Windows 服务 --> 类库 --> RssToolkit。

Windows 服务:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using ClassLibraryToExecuteRss;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Class1.DoSomeWork();

        }

        protected override void OnStop()
        {
        }
    }
}

类库:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RssToolkit.Rss;

namespace ClassLibraryToExecuteRss
{
    public static class Class1
    {
        public static void DoSomeWork()
        {
           //RssDocument rssDocument = new RssDocument();
           //rssDocument = RssDocument.Load(new System.Uri("http://www.somerssurl.com"));
        }

    }
}

如您所见,使用 RssDocument 类的代码行已被注释掉。将这些注释掉后,我就可以很好地编译解决方案了……但它的用处不大。

取消注释后,我会在服务代码中收到以下编译错误:

错误 3 类型或命名空间名称 'ClassLibraryToExecuteRss' 不能 被发现(您是否缺少使用 指令或程序集 参考?)C:\Projects\TestBed\TestingServiceWithXLibs\WindowsService1\WindowsService1\Service1.cs 9 7 WindowsService1

...和...

错误 4 名称 'Class1' 没有 存在于当前 上下文 C:\Projects\TestBed\TestingServiceWithXLibs\WindowsService1\WindowsService1\Service1.cs 22 13 WindowsService1

那么这里发生了什么?我构建了一个工作正常的 TDD 解决方案,但是当将调用该类库的代码从我的单元测试带入解决方案时,我得到了这个。

我没有更改任何名称空间,并将所有内容保留为默认值。

顺便说一句,我确实将 RssToolkit 的目标框架更改为 4.0...没有任何变化,并且我遇到了与在我的类库中使用另一个外部库 (SubSonic) 相同的问题。

有人能解释一下吗?

【问题讨论】:

  • 您在这些项目中是否有一个名为 workproject 的类?
  • 不,没有名为 WorkProject 的类——即命名空间中的项目名称。我尝试从解决方案中添加其他项目......同样的问题。但是,我能够添加 WCF 服务,对其进行代码引用并毫无问题地编译(虽然不是我真正想要的)
  • 试试不同的默认命名空间(试试看)
  • 您发布的错误只是由于错误导致类库不再编译导致的后续错误(因此服务不再找到引用)。请检查类库在编译时抛出的错误。
  • 单独编译类库不会产生任何错误。

标签: c# .net windows-services namespaces


【解决方案1】:
  1. 您的服务器项目需要 引用你的类库 项目和 RssToolkit 程序集。
  2. 确保您的服务项目以正确的框架为目标。右键单击项目并选择属性。在应用程序选项卡上,确保您的目标是正确的框架。例如,当您真正需要整个框架时,您可能正在定位客户端配置文件。

【讨论】:

  • 不,不是这样。根据您的建议,我在我的服务项目中添加了对 RssToolkit 的引用。没有变化。
  • 在添加对 RssToolkit 的引用后,我,为了它,添加了“使用 RssToolkit.Rss;”到服务类。拿起了RssToolkit命名空间的intellisense,但是当我编译时,我得到了和上面一样的错误,但是对于RssToolkit也是如此(找不到类型或命名空间'RssToolkit'......“
  • 是的,成功了。该服务项目的目标是客户档案而不是整个框架。所以回顾一下,关于修复,我遇到的错误/问题真的有意义吗?这很令人困惑,因为最初添加引用时,直到编译时才出现问题。谢谢!
  • 是的,有点不清楚。 DLL 无法被引用,因为“东西丢失了”之类的。更好的错误消息会有所帮助。
  • 向 MS 提交 VS 的修复/建议的流程是什么?
【解决方案2】:

经过进一步挖掘,this MSDN article 准确定位到了这个问题。但是出现的错误确实不清楚,并且已经在Microsoft Connect 提出了建议。

来自 MSDN:

.NET Framework 4 客户端配置文件是 .NET Framework 4 的一个子集,它 针对客户端应用程序进行了优化。 它为大多数人提供功能 客户端应用程序,包括 Windows 演示基础 (WPF),Windows 窗体、Windows 通信 基金会 (WCF) 和 ClickOnce 特征。这样可以更快 部署和较小的安装 面向应用程序的软件包 .NET Framework 4 客户端配置文件。

**

注意:如果您的目标是 .NET 框架 4 客户端配置文件,您不能 引用不在其中的程序集 .NET Framework 4 客户端配置文件。 相反,您必须以 .NET 为目标 框架 4。有关更多信息,请参阅 .NET 框架疑难解答 定位错误。

**

我认为 Note 还远远不够。我很好地引用了一个外部程序集。问题是该程序集本身引用了非 4.0 程序集。

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2019-04-19
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多