使用MS Build手动构建在引用时失败

时间:2014-01-30 04:15:53

标签: c# .net wpf xaml msbuild

我正在学习C#和XAML中的WPF结构。我相信最好的学习方法是不使用除编译器和基本文本编辑器之外的任何工具。不幸的是,因为我拒绝使用Visual Studio,所以运行我的代码时遇到了很多困难。 我的问题:我有一个基本的WPF应用程序,具有以下结构:

+HelloWorld
|-app.xaml
|-app.proj
|-compile.proj
|+main
 |-mainWindow.xaml
|+obj
 |+Debug
  |-app.g.cs
  |+main
   |-mainwindow.g.cs

感兴趣的文件是mainwindow.xamlapp.xamlapp.projcompile.proj。 我首先使用以下代码将app.xaml和mainwindow.xaml编译为生成的c#代码:

msbuild compile.proj /tv:4.0

compile.proj的样子:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask 
        TaskName="Microsoft.Build.Tasks.Windows.MarkupCompilePass1" 
        AssemblyFile="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationBuildTasks.dll" />
    <Target Name="MarkupCompilePass1Task">
        <MarkupCompilePass1 
            AssemblyName="HelloWorld"
            Language="C#"
            OutputType="WinExe"
            OutputPath="obj\Debug\"
            ApplicationMarkup="App.xaml"
            PageMarkup="main\mainwindow.xaml"    
            References="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\PresentationCore.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\PresentationFramework.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\WindowsBase.dll" />
    </Target>
</Project>

之后(成功构建)我将生成的c#代码编译成可执行文件。有了这个:

msbuild app.proj /tv:4.0

app.proj的代码如下:

<Project DefaultTargets="Compile"
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask
        TaskName="Microsoft.Build.Tasks.Windows.MarkupCompilePass1"
        AssemblyFile="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationBuildTasks.dll" />
    <PropertyGroup>
        <appname>HelloWorld</appname>
        <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    </PropertyGroup>
 <ItemGroup>
        <Reference Include="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Core.dll" />
        <Reference Include="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll" />
         <Reference Include="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\WindowsBase.dll" />
         <Reference Include="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\PresentationCore.dll" />
        <Reference Include="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\WPF\PresentationFramework.dll" />
    </ItemGroup>
    <ItemGroup>
            <ApplicationDefinition Include="app.xaml">
            <Generator>MSBuild:Compile</Generator>
            <SubType>Designer</SubType>
        </ApplicationDefinition>
        <Compile Include="G:\Docs\Programming\work\WPF\HelloWorld2\obj\debug\App.g.cs">
            <DependentUpon>app.xaml</DependentUpon>
            <SubType>Code</SubType>
        </Compile>
        <Page Include="main/mainwindow.xaml">
            <Generator>MSBuild:Compile</Generator>
            <SubType>Designer</SubType>
        </Page>
        <Compile Include="G:\Docs\Programming\work\WPF\HelloWorld2\obj\debug\main\mainwindow.g.cs">
            <DependentUpon>main\mainwindow.xaml</DependentUpon>
            <SubType>Code</SubType>
         </Compile>
    </ItemGroup>
    <Target Name="Compile">
        <CSC
            Sources = "@(Compile)"
            References="@(Reference)"
            OutputAssembly ="$(appname).exe">
             <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
         </CSC>
    </Target>
 </Project>

这也成功建立。然后创建helloworld.exe。不幸的是,在运行时,可执行文件无法说出以下内容

Unhandled Exception: System.IO.IOException: Cannot locate resource 'main/mainwindow.xaml'.

在此之后,它列出了以:

结尾的功能轨迹
at HelloWorld.app.Main()

另外两个书面文件是app.xamlmainwindow.xaml App.xaml中:

<Application x:Class="HelloWorld2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="main/mainwindow.xaml">
    <Application.Resources>

    </Application.Resources>
</Application>

mainwindow.xaml:

<Window x:Class="HelloWorld.mainwindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="mainwindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="23" Width="120" Margin="78,89,319,207" Name="MainTextBox" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left"></TextBox>
    </Grid>
</Window>

我不知道为什么它找不到合适的xaml文件。我使用的是不正确的文件结构吗?我错过了任何一个msbuild调用的编译选项吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

MsBuild使用MarkupCompilePass1任务执行初步构建。为什么?因为为了使XamlCompilePass成功,它需要在编译的二进制文件中引用本地类型。

不是重新发明轮子,而是检查Visual Studio创建的WPF项目文件的结构。您会注意到默认二进制引用和默认属性组值之类的内容,如下所示:

<ProjectGuid>{CAFEFCAD-429A-4C61-BD3A-157F042E1FE7}</ProjectGuid>
<OutputType>WinExe</OutputType>

这可以帮助您开始使用MsBuild构建WPF项目。

关于Visual Studio和MsBuild的问题,您是否知道MsBuild现在附带Visual Studio而不是.NET Framework?