Nelze Nastavit Vlastnost Aplikace Pomocí MSbuild.exe

0

Otázka

Když jsem se jít do Projektu->Aplikace->Vlastnosti->Nastavení a zadejte Název, jako WhichApp typu string a zadejte Rozsah jako Aplikace a Hodnoty PCB. Když jsem se ukázat hodnotu v můj hlavní formulář pomocí MessageBox.Show(Properties.Settings.Default.WhichApp); Vidím okno se zprávou, ukazuje "PCB".

Ale když se pokusím nastavit vlastnost pomocí MSBuild.exe -nemovitosti:WhichApp=SUB při zobrazení hodnoty nemovitosti jsem stále vidět "PCB".

Jak mohu zavolat MSBuild.exe kompilátor nástroj pro nastavení majetku v okamžiku sestavení?

Zkoušel jsem použít Externí Nástroje v aplikaci Visual Studio..

Název: Sada Majetku

Příkaz: C:\Program Files(x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\MSBuild.exe

Argumenty: -nemovitosti:WhichApp=SUB

Initial Directory: $(ProjectDir)

---- CO JSEM SE SNAŽÍ DOSÁHNOUT V LOAD() METODA HLAVNÍ FORMULÁŘ ----

if (Properties.Settings.Default.PCAppConfig == "PCB")
{
// create new PCB form
// PCBForm.ShowDialog();
}
else if (Properties.Settings.Default.PCAppConfig == "SUB")
{
  // create new SUB form
  // SUBForm.ShowDialog();
}

--- V řešení jtijn, zkoušel jsem to přidat další vlastnost s názvem VersionNum ale selže... ---

<Target Name="BeforeBuild">
   <PropertyGroup>
     <!--Default value.-->
     <PcAppConfig Condition="'$(PcAppConfig)' == ''">PCB</PcAppConfig>
     <VersionNum Condition="'$(VersionNum)' == ''">1.0.0.66</VersionNum>
     <!--The source code.-->
     <TheSourceCode>internal static class PcAppConfig{ public static readonly string value = "$(PcAppConfig)"%3B%0A }internal static class VersionNum{ public static readonly string value = "$(VersionNum)"%3B</TheSourceCode>
   </PropertyGroup>
   <!--Get current source so we can only create it again when needed, to avoid being recompiled.-->
   <ReadLinesFromFile File="PcAppConfig.cs" ContinueOnError="True">
     <Output TaskParameter="Lines" ItemName="CurrentSourceCode" />
   </ReadLinesFromFile>
   <!--Write source, if needed.-->
   <WriteLinesToFile File="PcAppConfig.cs" Overwrite="True" Lines="$(TheSourceCode)" Condition="'@(CurrentSourceCode)' != '$(TheSourceCode)'" />
 </Target>

--- Není sestavovat, když se hodnoty změní, Nedokáže vytvořit instalační soubory ... Moje argumenty MSBuild.exe

SelectApp.csproj.user /p:PcAppConfig=SUB /p:VersionNum=1.0.0.67
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Compile Update="Form1.cs">
            <SubType>Form</SubType>
        </Compile>
    </ItemGroup>
<Target Name="BeforeBuild">
    <PropertyGroup>
        <!--Default value.-->
        <PcAppConfig Condition="'$(PcAppConfig)' == ''">PCB</PcAppConfig>
        <VersionNum Condition="'$(VersionNum)' == ''">1.0.0.66</VersionNum>
        <!--The source code.-->
        <TheSourceCode>internal static class PCAppConfig{ public static readonly string value = "$(PcAppConfig)"%3B }%0Ainternal static class VersionNum{ public static readonly string value = "$(VersionNum)"%3B }</TheSourceCode>
    </PropertyGroup>
    <!--Get current source so we can only create it again when needed, to avoid being recompiled.-->
    <ReadLinesFromFile File="PcAppConfig.cs" ContinueOnError="True">
        <Output TaskParameter="Lines" ItemName="CurrentSourceCode" />
    </ReadLinesFromFile>
    <!--Write source, if needed.-->
    <WriteLinesToFile File="PcAppConfig.cs" Overwrite="True" Lines="$(TheSourceCode)" Condition="'@(CurrentSourceCode)' != '$(TheSourceCode)'" />
    <ItemGroup>
        <Compile Update="PcAppConfig.cs">
            <SubType>Component</SubType>
        </Compile>
    </ItemGroup>
</Target>
<Target Name="AfterCompile">
<Exec Command="&quot;$(ProgramFiles)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.com&quot; C:\DummyApps\SelectApp\PCBSetup\PCBSetup.vdproj /build &quot;Debug|AnyCPU&quot;"/>
</Target>
</Project>
msbuild visual-studio
2021-11-24 04:16:43
1

Nejlepší odpověď

0

Můžete mít projekt generovat C# zdrojový kód na základě msbuild majetku. Tento cíl jde na konci v souboru projektu:

<Target Name="BeforeBuild">
  <PropertyGroup>
     <!--Default value.-->
    <PcAppConfig Condition="'$(PcAppConfig)' == ''">PCB</PcAppConfig>
    <!--The source code.-->
    <TheSourceCode>internal static class PcAppConfig{ public static readonly string value = "$(PcAppConfig)"%3B }</TheSourceCode>
  </PropertyGroup>
  <!--Get current source so we can only create it again when needed, to avoid being recompiled.-->
  <ReadLinesFromFile File="PcAppConfig.cs" ContinueOnError="True">
    <Output TaskParameter="Lines" ItemName="CurrentSourceCode" />
  </ReadLinesFromFile>
  <!--Write source, if needed.-->
  <WriteLinesToFile File="PcAppConfig.cs" Overwrite="True" Lines="$(TheSourceCode)" Condition="'@(CurrentSourceCode)' != '$(TheSourceCode)'" />
</Target>

Výsledný zdrojový soubor musí být přidán do projektu, můžete to udělat v VS po vybudování jednou nebo ještě přidat tento řádek spolu s dalšími Compile položky:

<Compile Include="PcAppConfig.cs" />

Nyní v kódu můžete použít PcAppConfig.value.

Chcete-li změnit hodnotu vytvořit jako

msbuild my.csproj /p:PcAppConfig=SUB
2021-11-25 14:17:19

Díky stijn, Že je velmi blízko na to, co se ptám. Co by <Cíl> kód projektu bylo, kdyby PcAppConfig.cs již existuje (což je pravda) a já jen chci využít PcAppConfig.hodnoty, aby viděli, co je hodnota vlastnost?
GRF

Podmínkou pro WriteLinestoFile by to být něco jako Condition="!Exists(PcAppConfig.cs)" ale já bych poradit proti tomu, protože to dělá cíl nebude fungovat, jak bylo zamýšleno. A už můžete podívat do souboru, ne?
stijn

Ahoj stijn, TO FUNGUJE. Dal jsem <Cíl> XML .csproj těsně před </Projekt> a sestavují pomocí MSBuild.exe pomocí různých hodnot a funguje skvěle. Jediná další věc, kterou musím udělat, je vytvořit zvláštní Nastavení projektu kromě hlavního projektu. Můžete mi říct, jestli je to wright příkaz? msbuild myProject.csproj mySetupProject.csproj /p:PcAppConfig=SUB
GRF

Ano, můžete vytvořit více projektů, jako že
stijn

Četl jsem, že msbuild.exe nefunguje .vdproj (nastavení projektů). Znáte jiný způsob? Můžete mi vysvětlit, co tyto příkazy dělají v <Target Name="BeforeBuild">, takže vím, že pro budoucnost? Pak označím odpověď jako správnou odpověď.
GRF

Také, jak mohu použít jinou vlastnost ve stejné třídě soubor PcAppConfig.uo. Naleznete v horní hlavní popis pro to, co jsem se snažil
GRF

Vaše TheSourceCode není správný kód, např. chybí } na konci
stijn

Že to FUNGOVALO. Díky stijn. Máte nějaký nápad, jak mohu přidat konkrétní Nastavení projektu na základě hodnoty PcAppConfig.hodnota? v souboru projektu. MSBuild.exe nemá podporu stavebních projektů Instalace (.vdproj). Také pro mé reference můžete mi říct, co všechny kód v <Target Name="BeforeBuild"> je dělat?
GRF

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................