Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² для БАПР ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π² ΠΌΠΎΠ΅ΠΌ случаС это AutoCAD, Revit ΠΈ Renga) со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ появляСтся ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° – выходят Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, мСняСтся ΠΈΡ… API ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².

Когда Ρƒ вас всСго ΠΎΠ΄ΠΈΠ½ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈΠ»ΠΈ Π’Ρ‹ Π΅Ρ‰Π΅ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ-самоучка Π² этом Π΄Π΅Π»Π΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π½Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста ΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΠ»Π°Π³ΠΈΠ½Π°. БоотвСтствСнно, ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΏΠΎΠ²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚.

По ΠΌΠ΅Ρ€Π΅ накоплСния ΠΎΠΏΡ‹Ρ‚Π° ΠΈ Π·Π½Π°Π½ΠΈΠΉ Π’Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ нСсколько способов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ этого процСсса. Π― ΠΏΡ€ΠΎΡˆΠ΅Π» этот ΠΏΡƒΡ‚ΡŒ ΠΈ Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π’Π°ΠΌ ΠΊ Ρ‡Π΅ΠΌΡƒ я ΠΏΡ€ΠΈΡˆΠ΅Π» Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΈ насколько это ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ я Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя пользовался

Бсылки Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

И Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ просто, наглядно ΠΈ понятно, я Π±ΡƒΠ΄Ρƒ всС ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π° абстрактном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°.

ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Visual Studio (Ρƒ мСня вСрсия Community 2019. И Π΄Π° – Π½Π° русском языкС) ΠΈ создадим Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. НазовСм Π΅Π³ΠΎ MySuperPluginForRevit

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ΄ Revit для вСрсий 2015-2020. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ создам Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° классов Net Framework) ΠΈ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ MySuperPluginForRevit_2015

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Нам Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылки Π½Π° API Revit. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылки Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСбС всС Π½ΡƒΠΆΠ½Ρ‹Π΅ SDK ΠΈΠ»ΠΈ всС вСрсии Revit), Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠΉΠ΄Π΅ΠΌ сразу ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ NuGet-ΠΏΠ°ΠΊΠ΅Ρ‚. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π½Π΅ ΠΌΠ°Π»ΠΎΠ΅ количСство ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π½ΠΎ я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свои собствСнныС.

ПослС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΆΠΌΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΊΠΈ Π½Π° ΠΏΡƒΠ½ΠΊΡ‚ «Бсылки» ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π² мСню ΠΏΡƒΠ½ΠΊΡ‚ Β«ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ packages.config Π² PackageReference…»

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Если Π²Π΄Ρ€ΡƒΠ³ Π½Π° этом мСстС Ρƒ вас начнСтся ΠΏΠ°Π½ΠΈΠΊΠ°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΎΠΊΠ½Π΅ свойств ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° Β«ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ локально», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π°ΠΌ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ρ‚ΠΎ Π½Π΅ стоит ΠΏΠ°Π½ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ – ΠΈΠ΄Π΅ΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .csproj Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²Π°ΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ (я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Notepad++) ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Ρ‚Π°ΠΌ запись ΠΎ нашСм ΠΏΠ°ΠΊΠ΅Ρ‚Π΅. Выглядит ΠΎΠ½Π° сСйчас Ρ‚Π°ΠΊ:

<PackageReference Include="ModPlus.Revit.API.2015">
  <Version>1.0.0</Version>
</PackageReference>

ДобавляСм Π΅ΠΌΡƒ свойство <ExcludeAssets>runtime</ExcludeAssets>. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡΡ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

<PackageReference Include="ModPlus.Revit.API.2015">
  <Version>1.0.0</Version>
  <ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ построСнии ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ.
ИдСм дальшС – сразу прСдставим, Ρ‡Ρ‚ΠΎ наш ΠΏΠ»Π°Π³ΠΈΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Revit API, Ρ‡Ρ‚ΠΎ мСнялось со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π½ΠΎΠ²Ρ‹Ρ… вСрсий. Ну ΠΈΠ»ΠΈ просто Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ своС ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ Π² зависимости ΠΎΡ‚ вСрсии Revit, ΠΏΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символы условной компиляции. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ свойства ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Β«Π‘Π±ΠΎΡ€ΠΊΠ°Β» ΠΈ Π² ΠΏΠΎΠ»Π΅ Β«ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ условной компиляции» напишСм R2015.

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ символ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Debug ΠΈ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Release.

Ну ΠΈ ΠΏΠΎΠΊΠ° ΠΌΡ‹ находимся Π² ΠΎΠΊΠ½Π΅ свойств, Ρ‚ΠΎ сразу ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Β«ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈ Π² ΠΏΠΎΠ»Π΅ Β«ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» удаляСм суффикс _2015, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ нас пространство ΠΈΠΌΠ΅Π½ Π±Ρ‹Π»ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ нСзависимым ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ сборки:

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Π’ ΠΌΠΎΠ΅ΠΌ случаС Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ всСх вСрсий ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ ΠΏΠ°ΠΏΠΊΡƒ, поэтому Ρƒ мСня ΠΈΠΌΠ΅Π½Π° сборок ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ с суффиксом Π²ΠΈΠ΄Π° _20Ρ…Ρ…. Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ суффикс ΠΈ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ сборки, Ссли прСдполагаСтся располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ°ΠΏΠΊΠ°Ρ….

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ΄Ρƒ Ρ„Π°ΠΉΠ»Π° Class1.cs ΠΈ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π°ΠΌ Π½Π΅ΠΊΠΈΠΉ ΠΊΠΎΠ΄ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий Revit:

namespace MySuperPluginForRevit
{
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;

    [Regeneration(RegenerationOption.Manual)]
    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
#if R2015
            TaskDialog.Show("ModPlus", "Hello Revit 2015");
#elif R2016
            TaskDialog.Show("ModPlus", "Hello Revit 2016");
#elif R2017
            TaskDialog.Show("ModPlus", "Hello Revit 2017");
#elif R2018
            TaskDialog.Show("ModPlus", "Hello Revit 2018");
#elif R2019
            TaskDialog.Show("ModPlus", "Hello Revit 2019");
#elif R2020
            TaskDialog.Show("ModPlus", "Hello Revit 2020");
#endif
            return Result.Succeeded;
        }
    }
}

Π― сразу ΡƒΡ‡Π΅Π» всС вСрсии Revit Π²Ρ‹ΡˆΠ΅ 2015 вСрсии (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ) ΠΈ сразу ΡƒΡ‡Π΅Π» Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ символов условной компиляции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρƒ мСня ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ изюминкС. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² нашСм Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΆΠ΅ для вСрсии ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΠΎΠ΄ Revit 2016. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ всС описанныС Π²Ρ‹ΡˆΠ΅ дСйствия, соотвСтствСнно, замСняя число 2015 Π½Π° число 2016. Но Ρ„Π°ΠΉΠ» Class1.cs ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° удаляСм.

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Π€Π°ΠΉΠ» с Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ – Class1.cs – Ρƒ нас ΡƒΠΆΠ΅ имССтся ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ просто Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ ссылку Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Π•ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΡƒΡ‚ΠΈ вставки ссылок:

  1. Π”ΠΎΠ»Π³ΠΈΠΉ – ΠΆΠΌΠ΅ΠΌ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΊΠΈ, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» -> Β«Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт», Π² ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ вмСсто Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ связь»

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

  1. ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ – прям Π² ΠΎΠ±ΠΎΠ·Ρ€Π΅Π²Π°Ρ‚Π΅Π»Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. А ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Ρ†Π΅Π»Ρ‹Π΅ ΠΏΠ°ΠΏΠΊΠΈ) ΠΈ пСрСтаскиваСм Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π·Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавишСй Alt. ΠŸΡ€ΠΈ пСрСтаскивании Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши Alt курсор Π½Π° ΠΌΡ‹ΡˆΠΊΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ с плюсика Π½Π° стрСлочку.
    UPD: Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ внСс смуты Π² этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² слСдуСт Π·Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Shift+Alt!

ПослС провСдСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρƒ нас появится Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρ„Π°ΠΉΠ» Class1.cs с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠΊΠΎΠ½ΠΊΠΎΠΉ (синяя стрСлочка):

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠŸΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π² ΠΎΠΊΠ½Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π² контСкстС ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… символах условной компиляции:

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

По этой схСмС создаСм всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ (2017-2020). Π›Π°ΠΉΡ„Ρ…Π°ΠΊ – Ссли ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΎΠ±ΠΎΠ·Ρ€Π΅Π²Π°Ρ‚Π΅Π»Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ вставлСны ΠΊΠ°ΠΊ связь, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Alt!

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²ΠΏΠΎΠ»Π½Π΅ Ρ…ΠΎΡ€ΠΎΡˆ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° добавлСния Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈΠ»ΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° добавлСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² – всС это становится ΠΎΡ‡Π΅Π½ΡŒ ΠΌΡƒΡ‚ΠΎΡ€Π½Ρ‹ΠΌ. А Π½Π΅Π΄Π°Π²Π½ΠΎ я Π²Π΄Ρ€ΡƒΠ³ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ осознал ΠΊΠ°ΠΊ всС это Ρ€Π°Π·Ρ€ΡƒΠ»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ способу

Магия ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ

Π”ΠΎΡ‡ΠΈΡ‚Π°Π² сюда, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΊΠ»ΠΈΠΊΠ½ΡƒΡ‚ΡŒ «А Π½Π°Ρ„ΠΈΠ³ Ρ‚Ρ‹ описывал ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ способ, Ссли ΡΡ‚Π°Ρ‚ΡŒΡ сразу ΠΏΡ€ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ?!Β». А описал я всС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ яснСС для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ символы условной компиляции ΠΈ Π² ΠΊΠ°ΠΊΠΈΡ… мСстах Ρƒ нас ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ становится яснСС, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ различия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π°ΠΌ Π½Π°Π΄ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, оставив всСго ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

И Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° внСсСм измСнСния Π² наш Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, созданный ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ способом.

Π˜Ρ‚Π°ΠΊ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ удаляСм ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ всС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ основного (содСрТащСго нСпосрСдствСнно Ρ„Π°ΠΉΠ»Ρ‹). Π’.Π΅. ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ для вСрсий 2016-2020. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ с Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ удаляСм Ρ‚Π°ΠΌ ΠΏΠ°ΠΏΠΊΠΈ этих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π£ нас Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ остался ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” MySuperPluginForRevit_2015. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ свойства ΠΈ:

  1. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ сборки удаляСм суффикс _2015 (Π΄Π°Π»Π΅Π΅ станСт ясно Π·Π°Ρ‡Π΅ΠΌ)
  2. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«Π‘Π±ΠΎΡ€ΠΊΠ°Β» удаляСм символ условной компиляции R2015 ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ поля

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π² послСднСй вСрсии Visual Studio имССтся глюк – символы условной компиляции Π½Π΅ выводятся Π² ΠΎΠΊΠ½Π΅ свойств ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, хотя ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ. Если Ρƒ вас этот глюк Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈΡ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .csproj. Однако, Π½Π°ΠΌ всС-Ρ€Π°Π²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π½Π΅ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ дальшС.

ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² ΠΎΠΊΠ½Π΅ обозрСватСля Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΡƒΠ΄Π°Π»ΠΈΠ² суффикс _2015 ΠΈ Π·Π°Ρ‚Π΅ΠΌ удаляСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для поддСрТания порядка ΠΈ чувств пСрфСкционистов! ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ нашСго Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Π΅ΠΌ Ρ‚Π°ΠΌ Ρ‚Π°ΠΊΠΈΠΌ-ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ диспСтчСр ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Нам конфигурация Release Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚, поэтому удаляСм Π΅Ρ‘. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Π½Π°ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ R2015, R2016, …, R2020. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ИдСм Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .csproj Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²Π°ΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈ Π² Visual Studio – Π½Π°Π΄ΠΎ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π² контСкстном мСню Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚:

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Visual Studio Π΄Π°ΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ ΠΈ подсказываСт.

Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ элСмСнты PropertyGroup – Π² самом Π²Π΅Ρ€Ρ…Ρƒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ, Π° слСдом ΠΈΠ΄ΡƒΡ‚ с условиями. Π­Ρ‚ΠΈ элСмСнты Π·Π°Π΄Π°ΡŽΡ‚ свойства ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ Π΅Π³ΠΎ сборкС. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Π· условий, Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠ΅ свойства, Π° элСмСнты с условиями, соотвСтствСнно, ΠΌΠ΅Π½ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свойства Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΎΠ±Ρ‰ΠΈΠΉ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ) элСмСнт PropertyGroup ΠΈ смотрим свойство AssemblyName – это имя сборки ΠΈ ΠΎΠ½ΠΎ Ρƒ нас Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π±Π΅Π· суффикса _2015. Если суффикс имССтся, Ρ‚ΠΎ удаляСм Π΅Π³ΠΎ.

Находим элСмСнт с условиСм

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

Он Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ – удаляСм Π΅Π³ΠΎ.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с условиСм

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

Π½ΡƒΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ свойства ΠΏΠΎΠ΄ ваши Π½ΡƒΠΆΠ΄Ρ‹ – Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΌΠ΅Π½ΡΡ‚ΡŒ символы условной компиляции ΠΈ Ρ‚.ΠΏ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создаСм Π½ΠΎΠ²Ρ‹Π΅ элСмСнты PropertyGroup для Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Π’ этих элСмСнтам Π½Π°ΠΌ достаточно Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ свойства:

  • OutputPath – выходная ΠΏΠ°ΠΏΠΊΠ°. Π― задаю стандартноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ binR20xx
  • DefineConstants – символы условной компиляции. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRACE;R20Ρ…Ρ…
  • TargetFrameworkVersion – вСрсия ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Для Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий Revit API Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.
  • AssemblyName – имя сборки (Ρ‚.Π΅. имя Ρ„Π°ΠΉΠ»Π°). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ прям Π½ΡƒΠΆΠ½ΠΎΠ΅ имя сборки, Π½ΠΎ для ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ я ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $(AssemblyName)_20Ρ…Ρ…. Для этого ΠΌΡ‹ Ρ€Π°Π½Π΅Π΅ ΠΈ удаляли суффикс ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ сборки

Бамая главная Ρ„ΠΈΡˆΠΊΠ° всСх этих элСмСнтов – ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ банально ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ измСняя. Π”Π°Π»Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΡ€ΠΈΠ»ΠΎΠΆΡƒ всС содСрТимоС Ρ„Π°ΠΉΠ»Π° .csproj.

Π₯ΠΎΡ€ΠΎΡˆΠΎ, со свойствами ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ – это Π½Π΅ слоТно. Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (NuGet-ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ). Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Π°Π»Π΅Π΅, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ элСмСнтах ItemGroup. Но Π²ΠΎΡ‚ Π½Π΅Π·Π°Π΄Π°Ρ‡Π° – этот элСмСнт Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ условия, ΠΊΠ°ΠΊ элСмСнт PropertyGroup. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ это Π΄Π°ΠΆΠ΅ глюк Visual Studio, Π½ΠΎ Ссли Π·Π°Π΄Π°Ρ‚ΡŒ нСсколько элСмСнтов ItemGroup с условиями ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ссылки Π½Π° NuGet-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Ρ‚ΠΎ ΠΏΡ€ΠΈ смСнС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹.

На ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ элСмСнт Choose, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ Π½Π°ΠΌ Π»ΠΎΠ³ΠΈΠΊΠ΅ if-then-else.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ элСмСнт Choose, Π·Π°Π΄Π°Π΅ΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ NuGet-ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

ВсС содСрТимоС csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0"  ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{5AD738D6-4122-4E76-B865-BE7CE0F6B3EB}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MySuperPluginForRevit</RootNamespace>
    <AssemblyName>MySuperPluginForRevit</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>binDebug</OutputPath>
    <DefineConstants>DEBUG;R2015</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2015|AnyCPU' ">
    <OutputPath>binR2015</OutputPath>
    <DefineConstants>TRACE;R2015</DefineConstants>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2015</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2016|AnyCPU' ">
    <OutputPath>binR2016</OutputPath>
    <DefineConstants>TRACE;R2016</DefineConstants>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2016</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2017|AnyCPU' ">
    <OutputPath>binR2017</OutputPath>
    <DefineConstants>TRACE;R2017</DefineConstants>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2017</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2018|AnyCPU' ">
    <OutputPath>binR2018</OutputPath>
    <DefineConstants>TRACE;R2018</DefineConstants>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2018</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2019|AnyCPU' ">
    <OutputPath>binR2019</OutputPath>
    <DefineConstants>TRACE;R2019</DefineConstants>
    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2019</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2020|AnyCPU' ">
    <OutputPath>binR2020</OutputPath>
    <DefineConstants>TRACE;R2020</DefineConstants>
    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2020</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Class1.cs" />
    <Compile Include="PropertiesAssemblyInfo.cs" />
  </ItemGroup>
  <Choose>
    <When Condition=" '$(Configuration)'=='R2015' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2015">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2016' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2016">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2017' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2017">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2018' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2018">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2019' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2019">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2020' or '$(Configuration)'=='Debug'">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2020">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
  </Choose>
  <Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" />
</Project>

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· условий я ΡƒΠΊΠ°Π·Π°Π» Π΄Π²Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· Π˜Π›Π˜ (Or). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Debug.

И Π²ΠΎΡ‚ Ρƒ нас ΠΏΠΎΡ‡Ρ‚ΠΈ всС идСально. Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π½ΡƒΠΆΠ½ΡƒΡŽ Π½Π°ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π² контСкстном мСню Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°) ΠΏΡƒΠ½ΠΊΡ‚ Β«Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ NuGetΒ» ΠΈ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Ρƒ нас ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹.

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

И Π²ΠΎΡ‚ Π½Π° этом этапС я ΠΏΡ€ΠΈΡˆΠ΅Π» Π² Ρ‚ΡƒΠΏΠΈΠΊ – Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ сразу всС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ сборкой (мСню Β«Π‘Π±ΠΎΡ€ΠΊΠ°Β» -> Β«ΠŸΠ°ΠΊΠ΅Ρ‚Π½Π°Ρ сборка»), Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Π½Π΅ происходит автоматичСского восстановлСния ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². И ΠΏΡ€ΠΈ сборкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠΆΠ΅ Π½Π΅ происходит, хотя, ΠΏΠΎ ΠΈΠ΄Π΅Π΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ. РСшСния этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ стандартными срСдствами я Ρ‚Π°ΠΊ ΠΈ Π½Π΅ нашСл. И скорСС всСго это Ρ‚ΠΎΠΆΠ΅ Π±Π°Π³ Visual Studio.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ сборки Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ систСму Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ сборки Nuke. На самом Π΄Π΅Π»Π΅ я этого Π½Π΅ Ρ…ΠΎΡ‚Π΅Π», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΡ‡ΠΈΡ‚Π°ΡŽ это излишним Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π½ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ я Π½Π΅ Π²ΠΈΠΆΡƒ. А Π½Π° вопрос Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Nuke?Β» ΠΎΡ‚Π²Π΅Ρ‚ прост – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅.

Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ нашСго Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°), Π·Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Shift ΠΈ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΊΠΈ ΠΏΠΎ пустому мСсту Π² ΠΏΠ°ΠΏΠΊΠ΅ – Π² контСкстном мСню Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ Β«ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ PowerShell здСсь».

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

Если Ρƒ вас Π½Π΅ установлСн nuke, Ρ‚ΠΎ сначала ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

dotnet tool install Nuke.GlobalTool –global

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ nuke ΠΈ Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ nuke для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. НС знаю ΠΊΠ°ΠΊ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° русском языкС – Π½Π° английском Π±ΡƒΠ΄Π΅Ρ‚ написано Could not find .nuke file. Do you want to setup a build? [y/n]

НаТимаСм ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Y ΠΈ дальшС Π±ΡƒΠ΄ΡƒΡ‚ нСпосрСдствСнныС ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ настройки. Нам Π½ΡƒΠΆΠ΅Π½ самый простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с использованиСм MSBuild, поэтому ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ ΠΊΠ°ΠΊ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅:

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π² Visual Studio, которая Π½Π°ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас появился ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ build Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ нас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» – Build.cs

Π”Π΅Π»Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½Π° с компиляциСй ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Revit/AutoCAD

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ этот Ρ„Π°ΠΉΠ» ΠΈ пишСм скрипт ΠΏΠΎ сборкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ΄ всС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Ну ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠΉ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ сСбя:

using System.IO;
using Nuke.Common;
using Nuke.Common.Execution;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.MSBuild;
using static Nuke.Common.Tools.MSBuild.MSBuildTasks;

[CheckBuildProjectConfigurations]
[UnsetVisualStudioEnvironmentVariables]
class Build : NukeBuild
{
    public static int Main () => Execute<Build>(x => x.Compile);

    [Solution] readonly Solution Solution;

    // If the solution name and the project (plugin) name are different, then indicate the project (plugin) name here
    string PluginName => Solution.Name;

    Target Compile => _ => _
        .Executes(() =>
        {
            var project = Solution.GetProject(PluginName);
            if (project == null)
                throw new FileNotFoundException("Not found!");

            var build = new List<string>();
            foreach (var (_, c) in project.Configurations)
            {
                var configuration = c.Split("|")[0];

                if (configuration == "Debug" || build.Contains(configuration))
                    continue;

                Logger.Normal($"Configuration: {configuration}");

                build.Add(configuration);

                MSBuild(_ => _
                    .SetProjectFile(project.Path)
                    .SetConfiguration(configuration)
                    .SetTargets("Restore"));
                MSBuild(_ => _
                    .SetProjectFile(project.Path)
                    .SetConfiguration(configuration)
                    .SetTargets("Rebuild"));
            }
        });
}

ВозвращаСмся Π² ΠΎΠΊΠ½ΠΎ PowerShell ΠΈ снова пишСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ nuke (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ nuke с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Target. Но Ρƒ нас ΠΎΠ΄ΠΈΠ½ Target, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). ПослС наТатия клавиши Enter ΠΌΡ‹ почувствуСм сСбя настоящими Ρ…Π°ΠΊΠ΅Ρ€Π°ΠΌΠΈ, ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ Π² ΠΊΠΈΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ автоматичСская сборка нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PowerShell прям ΠΈΠ· Visual Studio (мСню Β«Π’ΠΈΠ΄Β» -> Β«Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΊΠ½Π°Β» -> «Консоль диспСтчСра ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²Β»), Π½ΠΎ Ρ‚Π°ΠΌ всС Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ€Π½ΠΎ-Π±Π΅Π»Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

На этом моя ΡΡ‚Π°Ρ‚ΡŒΡ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°. Π£Π²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ с Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ для AutoCAD Π²Ρ‹ смоТСтС Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ сами. НадСюсь, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΡƒΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π°ΠΉΠ΄Π΅Ρ‚ своих Β«ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²Β».

Бпасибо за вниманиС!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ