1

そのため、その場で ContentProject を作成し、それをビルドするツールを構築しています(Xnb を出力するように)。'always' または 'PreserveNewest' . .contentProj を見ていたら、ビルドすべきではなくコピーすべきファイルのセクションは次のようになります。

<ItemGroup>
 <None Include="MyFile.file">
   <Name>level1</Name>
   <Importer>XmlImporter</Importer>
   <Processor>PassThroughProcessor</Processor>
   <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 </None>

ただし、コンテンツ プロジェクトをオンザフライで構築しているため、プロジェクトを作成してアイテムを追加するには、次のコードが必要です。

   var projectPath = Path.Combine(buildDirectory, "content.contentproj");
_projectRootElement = ProjectRootElement.Create(projectPath);

        _projectRootElement.AddImport("$(MSBuildExtensionsPath)\\Microsoft\\XNA Game Studio\\v4.0\\Microsoft.Xna.GameStudio.ContentPipeline.targets");

        _contentProject = new Project(_projectRootElement);

        _contentProject.SetProperty("XnaPlatform", "Windows");
        _contentProject.SetProperty("XnaProfile", "HiDef");
        _contentProject.SetProperty("XnaFrameworkVersion", "v4.0");
        _contentProject.SetProperty("Configuration", "Debug");
        _contentProject.SetProperty("OutputPath", _outputDirectory);

        // Register any custom importers or processors.
        foreach (string pipelineAssembly in PipelineAssemblies)
        {
            _contentProject.AddItem("Reference", pipelineAssembly);
        }

        // Hook up our custom error logger.
        _errorLogger = new ErrorLogger();
        _buildParameters = new BuildParameters(ProjectCollection.GlobalProjectCollection)
                            {
                                Loggers = new ILogger[] { _errorLogger,  }
                            };
//.... removed code that is not required the following is code that adds each item to the project. In case of items that shoulndt compile I m using None (as in xml from project above)

        var itemType = compile ? "Compile" : "None";

        var items = _contentProject.AddItem(itemType, filename);
        var item = items.SingleOrDefault(x => x.EvaluatedInclude.Equals(filename, StringComparison.InvariantCultureIgnoreCase));

        item.SetMetadataValue("Link", Path.GetFileName(filename));
        item.SetMetadataValue("Name", Path.GetFileNameWithoutExtension(filename));

        if (!compile)
            item.SetMetadataValue("CopyToOutputDirectory", "Always");

最後にビルドコード

BuildManager.DefaultBuildManager.BeginBuild(_buildParameters);

        var request = new BuildRequestData(_contentProject.CreateProjectInstance(), new string[0]);

        var submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

        var execute = Task.Factory.StartNew(() => submission.ExecuteAsync(null, null), cancellationTokenSource.Token);
        var endBuild = execute.ContinueWith(ant => BuildManager.DefaultBuildManager.EndBuild());

        endBuild.Wait();

BuildRequest では、空の配列はターゲットであるパラメーターを受け取ります...ビルドから、実際にはファイルを出力せずに依存関係の dll をメインフォルダーにコピーするまで、さまざまなことを行う多くの異なるターゲットを通過しましたが、必要なものはコピーしませんでした

乾杯

4

0 に答える 0