C # Windows теряет ссылку на библиотеку классов, когда эти классы используют определенные объекты? - PullRequest
1 голос
/ 14 мая 2011

Я полностью перефразирую (точнее) испытываю потерю ссылки на библиотеку классов, на которую ссылаются, из службы C # Windows.

Процесс: Создан новый C # .Net v4.0 Windows сервис. В этом решении я создал новую библиотеку классов, которая будет вызываться из метода OnStart () службы, и в службе Windows делается ссылка на библиотеку классов. Я импортирую проект RssToolkit (найдено здесь ). Фреймворк проекта 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) в моей библиотеке классов.

Кто-нибудь может пролить свет на это?

Ответы [ 2 ]

9 голосов
/ 15 мая 2011
  1. Ваш серверный проект должен ссылаться как на ваш проект библиотеки классов, так и на сборку RssToolkit.
  2. Убедитесь, что ваш сервисный проект нацелен на соответствующую инфраструктуру.Щелкните правой кнопкой мыши по проекту и выберите «Свойства».На вкладке «Приложение» убедитесь, что вы нацелены на соответствующую структуру.Например, возможно, вы ориентируетесь на профиль клиента, когда вам действительно нужна вся структура.
2 голосов
/ 16 мая 2011

После дальнейшего изучения эта статья MSDN точно нацелена на эту проблему.Однако представленные ошибки действительно неясны, и на Microsoft Connect .

ОТ MSDN было сделано предложение:

Профиль клиента .NET Framework 4:Подмножество .NET Framework 4, оптимизированное для клиентских приложений.Он предоставляет функциональные возможности для большинства клиентских приложений, включая функции Windows Presentation Foundation (WPF), Windows Forms, Windows Communication Foundation (WCF) и ClickOnce.Это ускоряет развертывание и уменьшает размер установочного пакета для приложений, нацеленных на клиентский профиль .NET Framework 4.

**

Примечание. Если вы нацелены на .NETВ профиле клиента Framework 4 нельзя ссылаться на сборку, которой нет в профиле клиента .NET Framework 4.Вместо этого вы должны настроить таргетинг на .NET Framework 4. Дополнительные сведения см. В разделе «Устранение ошибок при таргетинге .NET Framework».

**

Я думаю, что Примечание, однако, далеко не зашлодовольно.Я просто ссылался на внешнюю сборку.Проблема заключалась в том, что сама сборка ссылалась на сборки не 4.0.

...