سؤال

وماذا سيكون وسيلة لاسترداد المجلد Windows SDK في مهمة MSBuild؟

وباستخدام مهمة generateBootstrapper أنا خلق الإطلاق لبلدي الإعداد لتكون قادرة على تثبيت الشروط المسبقة. هذه المهمة تحتاج المسار إلى المجلد حيث توجد حزم شرطا مسبقا، أي مجلد Windows SDK

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\"

وعندما باستخدام Visual Studio 2008. وحتى الآن لقد تم استخدام مسار القرص الثابت تلوينها ولكن هذا لن يعمل على أي نظام. هل هناك طريقة أفضل للحصول على مسار؟

وهذا هو بلدي النصي بناء:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
         ToolsVersion="3.5">
    <ItemGroup>
        <BootstrapperFile Include="Microsoft.Net.Framework.2.0">
            <ProductName>.NET Framework 2.0</ProductName>
        </BootstrapperFile>
        <BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
            <ProductName>Windows Installer 3.1</ProductName>
        </BootstrapperFile>
    </ItemGroup>

    <Target Name="Bootstrapper">
        <GenerateBootstrapper ApplicationFile="mySetup.msi" 
            Culture="de-DE" 
            ApplicationName="My Application" 
            OutputPath="$(OutDir)\de-DE" 
            BootstrapperItems="@(BootstrapperFile)" 
            Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\" />

        <GenerateBootstrapper ApplicationFile="mySetup.msi" 
            Culture="en-US" 
            ApplicationName="My Application" 
            OutputPath="$(OutDir)\en-US" 
            BootstrapperItems="@(BootstrapperFile)" 
            Path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\" />
    </Target>
</Project>
هل كانت مفيدة؟

المحلول

ويمكنك أيضا استخدام المهمة GetFrameworkSdkPath MSBuild.

<GetFrameworkSdkPath>
  <Output TaskParameter="Path" PropertyName="WindowsSdkPath" />
</GetFrameworkSdkPath>  

وعلى سبيل المثال:

<GenerateBootstrapper 
  ApplicationFile="$(SolutionName).application"
  ApplicationName="$(ClickOnceAppTitle)"
  ApplicationUrl="$(ClickOnceUrl)"
  BootstrapperItems="@(BootstrapperFile)"
  Culture="en"
  FallbackCulture="en-US"
  Path="$(WindowsSDKPath)"
  OutputPath="." /> 

نصائح أخرى

وبفضل جون. ووفقا لمشاركتك أنا بتحرير النصي MSBuild لقراءة مجلد من التسجيل. كان ذلك ولكن ليس من الضروري إلحاق "الحزم" في نهاية المطاف، كان ذلك خطأ آخر في مخطوطتي الأصلي.

وفيما يلي النص العمل:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <WindowsSDKPath>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5@Path)</WindowsSDKPath>
    </PropertyGroup>

    <ItemGroup>
        <BootstrapperFile Include="Microsoft.Net.Framework.2.0">
                <ProductName>.NET Framework 2.0</ProductName>
        </BootstrapperFile>
        <BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
                <ProductName>Windows Installer 3.1</ProductName>
        </BootstrapperFile>
    </ItemGroup>

    <Target Name="Bootstrapper">
        <GenerateBootstrapper ApplicationFile="mySetup.msi" 
            Culture="de-DE" 
            ApplicationName="My Application" 
            OutputPath="$(OutDir)\de-DE" 
            BootstrapperItems="@(BootstrapperFile)" 
            Path="$(WindowsSDKPath)" />

        <GenerateBootstrapper ApplicationFile="mySetup.msi" 
            Culture="en-US" 
            ApplicationName="My Application" 
            OutputPath="$(OutDir)\en-US" 
            BootstrapperItems="@(BootstrapperFile)" 
            Path="$(WindowsSDKPath)" />
    </Target>
</Project>

ويتم تخزين تثبيت مسار SDK Windows في قيمة CurrentInstallFolder مفتاح التسجيل التالي:

وHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows

وتابعت الجواب من جيريمي D، ولكن هذا أعطى رسالة الخطأ:     خطأ MSB3147: تعذر العثور على الملف المطلوب 'setup.bin' في 'C: \ ملفات البرنامج (x86) و \ مايكروسوفت تطوير البرامج \ ويندوز \ v8.0A \ المحرك.

والسبب هو أن الطريق إلى تشغيل الإطلاق (على الأقل مع V8.0A من SDK) هو دليل فرعي تحت المسار إرجاعها بواسطة GetFrameworkSdKPath.

وهكذا رمز MSBuild الذي يعمل بالنسبة لي هو:

<Target Name="AfterBuild">
  <GetFrameworkSdkPath>
    <Output TaskParameter="Path" PropertyName="WindowsSdkPath"/>
  </GetFrameworkSdkPath>
  <GenerateBootstrapper 
      ApplicationFile="myapp.msi" 
      ApplicationName="MyApplication" 
      BootstrapperItems="@(BootstrapperFile)" 
      OutputPath="$(OutputPath)" 
      Path="$(WindowsSdkPath)\Bootstrapper" />
</Target>

لاحظ \ الإطلاق لاحقة إلى $ (WindowsSdkPath)

ويتم تخزين المسار إلى الإطلاق ضمن مفتاح التسجيل:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5

لمعرفة المجلد الحزم، وفتح بذلك، اقرأ "مسار" قيمة التسجيل، وإلحاق "الحزم" في نهاية المطاف، والتي ينبغي أن تعطيك المسار الكامل إلى المجلد الذي تريد.

وعلى سبيل المثال:

string bootStrapperPackagesFolder = "";

RegistryKey regKey = Registry.LocalMachine.OpenSubKey
   (@"SOFTWARE\Microsoft\GenericBootstrapper\3.5");
if (regKey != null)
{
   bootStrapperPackagesFolder = (string)regKey.GetValue("Path");
   if (bootStrapperPackagesFolder != null)
   {
      bootStrapperPackagesFolder += @"Packages\";
      Console.WriteLine(bootStrapperPackagesFolder);
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top