2009-02-10 2 views
9

У меня есть решение winforms C# .net, и я хочу создать две разные сборки: одну, которая поддерживает IE6 и поддерживает IE7. Некоторые из файлов в одном из моих проектов отличаются для сборки IE6 по сравнению с сборкой IE7, поэтому я хочу включать файлы IE6 при сборке для IE6 и файлов IE7 при создании для IE7. Каков наилучший способ структурирования моего решения для этой ситуации?Как использовать разные файлы в проекте для разных конфигураций компоновки - Visual Studio C# .net

Из-за других ограничений я не хочу создавать отдельную сборку, содержащую общие элементы; Я хочу, чтобы проект скомпилировался с одной сборкой «foo.dll», независимо от того, какую сборку я создаю.

Я думал, что могу просто создать два отдельных проекта, которые скомпилируются в 'foo.dll', а затем создать две конфигурации выпуска и включить только соответствующий проект в соответствующую конфигурацию. Однако мне нужно включить файлы, одинаковые для IE6 и IE7, в оба проекта, и я не вижу, как использовать одну копию файла в двух проектах (когда я добавляю существующий элемент, он создает копию в каталог проекта). Я использую SVN для управления исходным кодом, поэтому, возможно, вы можете использовать это для совместного использования между папками, но сомневаетесь, что это лучший способ.

NB: Различные сборки необходимы из-за различий API в IE, детали которых не имеют отношения к вопросу - просто поверьте мне, что необходимы две сборки.

ответ

12

В MSBuild, вы можете указать условия для групп элементов. Затем вы можете привязать эти условия к целевому устройству.

Пример:

<!-- Declare the condition property at the beggining of the build file --> 
<PropertyGroup Condition="$(Platform) == 'IE7'"> 
    <UseNewLibrary>true</UseNewLibrary> 
</PropertyGroup> 

<PropertyGroup Condition="$(Platform) == 'IE6'"> 
    <UseNewLibrary>false</UseNewLibrary> 
</PropertyGroup> 


<!-- Then those the property to select the right file --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Compile Include="Class1.cs"/> 
    <Compile Include="Class2.cs"/> 
    <Compile Include="Class3.cs"/> 
    <Compile Include="Class4.cs"/> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Compile Include="Class1Old.cs"/> 
    <Compile Include="Class2Old.cs"/> 
    <Compile Include="Class3Old.cs"/> 
    <Compile Include="Class4Old.cs"/> 
</ItemGroup> 

<!-- And now references --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Reference Include="MyAssembly, Version=1.1.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Reference Include="MyAssembly, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

Обратите внимание, что все файлы будут отображаться в IDE, но во время компиляции все должно выровнять правильно.

Затем все, что вам нужно сделать, это создать свои платформы (IE6 и IE7) в управлении конфигурацией.

Вы также можете напрямую использовать свойство платформы вместо создания промежуточного свойства.

+0

Как создать свои платформы в управлении конфигурацией? Visual Studio 2005 не позволяет мне добавлять новые проектные платформы, это только дает мне x86 и x64 и AnyCPU. – Rory

+0

У меня 2008, так что это может быть другое название, но вы заходите в диспетчер конфигурации, а затем в раскрывающемся списке Платформа есть . Появится окно со списком, которое можно редактировать вручную – Coincoin

+0

Да, я могу добавить Платформы для решения, но для каждого Проекта я ограничены параметрами, которые у них есть. Я предполагаю, что это имеет смысл, если оно действительно передается компилятору с параметром/platform. Я просто использую разные Конфигурации вместо этого. – Rory

0

Я не уверен, как делать то, что вы просите, но не могли бы вы просто включить обе версии вашей оболочки API в DLL и определить, какой из них вызывать во время выполнения? Например, что делать, если пользователь устанавливает версию вашего IE6 вашего приложения, а затем обновляется до IE7? Им нужно будет переустановить, верно?

Мне кажется, как это было бы гораздо более простое решение, но, возможно, я что-то отсутствует ...

+0

Поскольку я m подключается к API, предоставляемому IE, который отличается в разных версиях, существуют различные проблемы, возникающие при использовании refe Rencing API, а также иметь различные сборки interop и т. д. Просто проще скомпилировать две версии с немного другим кодом. – Rory

+0

О, слишком плохо :(Похоже, ответ Коинкоина будет делать то, что вы хотите. –

3

Для того, чтобы добавить один и тот же файл в двух или более проектов, которые вы можете

правой кнопкой мыши на проекте и выберите Добавить >> Существующий элемент
Выберите файл в filepicker
Нажмите на маленький треугольник правая сторона кнопки «Добавить» в подборщике файлов
Выбрать Добавить как ссылку

Это добавит файл в проект без его копии.

Я не знаю всех деталей вашей ситуации, но вы неловкое решение. Две версии одной и той же DLL могут привести к проблемам конфигурации на клиентских компьютерах в конечном итоге. Я рекомендую вам рассмотреть идею Кевина о единой DLL со всеми возможностями и при необходимости вызвать соответствующий код.

2

Предполагая, что вы используете VS2005 или выше, вы можете использовать свойство Condition в файле проекта.

Вам нужно отредактировать файл csproj непосредственно

  1. выгрузить проект
  2. Редактировать

затем на файлы, которые вы хотите условно включать

<Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " /> 
<Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " /> 
<Compile Include="IE.cs" /> 
Смежные вопросы