Автоматически добавлять ссылки на исходные файлы классов в указанном каталоге другого проекта в решении Visual Studio 2008 - PullRequest
1 голос
/ 03 мая 2010

Я хочу поделиться некоторыми исходными файлами класса между двумя проектами в Visual Studio 2008. Я не могу создать проект для общих частей и ссылаться на него (см. Мой комментарий, если вам интересно, почему) .

Мне удалось поделиться некоторыми исходными файлами, но это может быть намного более аккуратным. Я создал тестовое решение под названием Commonality .

Обозреватель решений Commonality , который содержит проект Один и Два :

alt text

Что мне нравится:

  • Все файлы классов в папке Common проекта One автоматически добавляются в проект Two путем связывания. Это почти то же самое, как если бы я выбрал Добавить / Существующий элемент ...: Добавить как ссылку в каждый новый исходный файл класса.
  • Понятно, что эти файлы были связаны между собой. Символ стрелки быстрого доступа обозначает каждый значок файла.

Что мне не нравится:

  • Структура дерева файлов и папок в Common of project One не включена. Все плоско.
  • Связанные исходные файлы отображаются в корневом каталоге проекта Два . Было бы гораздо менее загроможденным, если бы они находились под Common , как в проекте One .

Структура дерева файлов решения Commonality , содержащего проект Один и Два :

$ tree /F /A

Folder PATH listing for volume Cystem
Volume serial number is 0713370 1337:F6A4
C:.
|   Commonality.sln
|
+---One
|   |   One.cs
|   |   One.csproj
|   |
|   +---bin
|   |   \---Debug
|   |           One.vshost.exe
|   |           One.vshost.exe.manifest
|   |
|   +---Common
|   |   |   Common.cs
|   |   |   CommonTwo.cs
|   |   |
|   |   \---SubCommon
|   |           CommonThree.cs
|   |
|   +---obj
|   |   \---Debug
|   |       +---Refactor
|   |       \---TempPE
|   \---Properties
|           AssemblyInfo.cs
|
\---Two
    |   Two.cs
    |   Two.csproj
    |   Two.csproj.user
    |   Two.csproj~
    |
    +---bin
    |   \---Debug
    +---obj
    |   \---Debug
    |       +---Refactor
    |       \---TempPE
    \---Properties
            AssemblyInfo.cs

И соответствующая часть проекта Файл проекта * Two Two.csproj :

<ItemGroup>
  <Compile Include="..\One\Common\**\*.cs">
  </Compile>
  <Compile Include="Two.cs" />
  <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Как мне обратиться к тому, что мне не нравится, оставив то, что мне нравится?

1 Ответ

0 голосов
/ 05 мая 2010

Вот пример кода.

Скажем, у вас есть две библиотеки DLL, которые предоставляют используемый вами API, одна новее. Они используют одно и то же пространство имен и множество одинаковых классов и методов. В моем примере, вот код для двух версий API:

API V1.0:

namespace API
{
    public class Class1
    {
        public void Call1()
        {
            Console.WriteLine("Call1 in API1");
        }
    }
}

API V2.0:

namespace API
{
    public class Class1
    {
        public void Call1()
        {
            Console.WriteLine("Call1 in API2");
        }

        public void Call2()
        {
            Console.WriteLine("Call2 in API2");
        }

    }
}

Вы хотите написать оболочку, в которой для начала используются общие вещи, поэтому возьмите общее и создайте общую сборку, используя интерфейс и абстрактный базовый класс.

Интерфейс:

namespace ApiCommon
{
    public interface ICommon
    {
        void Call1();
    }
}

Абстрактный класс:

namespace ApiCommon
{
    public abstract class CommonBase : ICommon
    {

        #region ICommon Members

        public void Call1()
        {
            Class1 common = new Class1();
            common.Call1();
        }

        #endregion
    }
}

Теперь, чтобы расширить ваш абстрактный класс, используя API V1.0 или V2.0, создайте новый проект и добавьте ссылку на вашу Common dll.

Расширенный класс:

using ApiCommon;

namespace ConditionalTest
{
    public class MyApi : CommonBase
    {
        public void Call3()
        {
            Console.WriteLine("Call 3 MyApi");
        }
    }
}

Теперь проводка, чтобы она заработала.

Создайте две новые конфигурации сборки в Configuration Manager, назовите их API1 и API2 и скопируйте настройки из Debug.

Отредактируйте общие настройки .csproj и добавьте следующие строки:

  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'API1|AnyCPU' ">
    <Reference Include="API1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\API1\bin\Debug\API1.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'API2|AnyCPU' ">
    <Reference Include="API2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\API2\bin\Debug\API2.dll</HintPath>
    </Reference>
  </ItemGroup>

Теперь, когда вы строите, в зависимости от выбранной вами опции Build Config (API1 или API2), он свяжет Common.dll с правильным API, и вам будет хорошо.

Чтобы проверить это, создайте консольное приложение с кодом, подобным следующему:

namespace ConditionalTest
{
    class Program
    {
        static void Main(string[] args)
        {
            MyApi test = new MyApi();
            test.Call1();
            test.Call3();
        }
    }
}

В зависимости от выбранной вами сборки, он либо выплюнет:

Call1 in API1
Call 3 in MyApi

или

Call1 in API2
Call 3 in MyApi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...