XNA 4中的管线装配是什么?

3

我正在尝试构建Nick Gravelyn的TiledLib演示。我从BitBucket下载了ZIP文件并在Visual Studio 2010中打开。当我尝试构建时,出现以下错误:

Error XNA 4

基本上,这是三个项目中的每个项目出现的错误:

错误 1 加载管道程序集“C:\Users\Moshe\Downloads\TiledLib_GS4\TiledLib GS4\References\ContentPipeline\TiledPipelineExtensions.dll”时发生错误。 Demo [Windows]

我对.NET不熟悉,所以我肯定错过了一些基本概念。这个依赖项可能在哪里被引用,为什么程序集无法加载?该文件存在于指定的路径。
XNA 4中的管道程序集是什么,为什么Visual Studio无法加载它?

此程序集被 DemoContent 内容项目所引用。这个内容项目是否在你的解决方案中?如果是,就查看它的引用以查看它是否能正常找到它。 - user155407
@ScottW - 能详细说明一下吗?我不知道从哪里开始验证你所说的要检查的事情。 - Moshe
解决方案浏览器在 Visual Studio 默认情况下位于右侧。如果没有出现,请点击“视图”->“解决方案资源管理器”。这将显示您的所有项目(展开时每个项目下面的信息)。验证是否存在“DemoContent”项目。如果存在,请展开 DemoContent 并展开“引用”文件夹,您应该看到 TiledPipelineExtensions 作为一个引用。 - user155407
嗯,也许这篇有点老的文章可以帮到你:http://www.codeproject.com/Articles/114146/Error-loading-pipeline-assembly-compile-error-on? - Josh Darnell
1个回答

6

更新:在您的内容项目中添加引用:TiledLib_GS4\TiledLib GS4\References\ContentPipeline\TiledPipelineExtensions.dll

自定义内容管道是一项高级游戏开发主题,但它并不难(当然取决于您处理内容的方式和内容本身)。

内容管道是将内容包含到游戏中所执行的一系列步骤。例如,波形声音文件会通过内容管道进行处理,以便您可以将其作为SoundEffect对象在游戏中使用。同样适用于作为纹理(Texture2D或Texture3D)包含在游戏中的图像。

当您使用Content.Load在XNA游戏中加载内容,比如说一个2D纹理时,您正在调用已经在XNA框架中定义的内容导入器和处理器,即Microsoft.Xna.Framework.Content.Pipeline.Processors.TextureProcessor和Microsoft.Xna.Framework.Content.Pipeline.TextureImporter。FBX、视频、音频等类型的内容也有类似的类。

管道程序集就是这样:一个允许您导入某种类型内容的程序集。在我们深入了解之前,请注意,所有您的内容都在一个特殊的内容项目中,并且此项目引用了包含大量基于基础内容处理器和导入器类派生的预设导入器的程序集。这些类允许内容项目类型填充您可以用于某种类型的导入器列表,并且您可以使用属性窗口更改这些列表。请参阅下面的屏幕截图。

属性窗口中的内容导入选项

内容项目中的内容导入引用

如上所述,XNA有预定义的内容导入器。XNA还允许您使用自己的导入实现扩展内容管道。为此,XNA为您提供了两个类,在内容管道扩展项目中进行扩展。第一个是内容导入器,另一个是内容处理器。

内容导入器是一个从Microsoft.Xna.Framework.Content.Pipeline.ContentImporter派生的类,覆盖了一个名为Import的方法,该方法传递了一个字符串文件名和一个导入上下文对象,并返回一些类型的对象(通用类型T),以在游戏中使用:Texture2D、字符串或您自己复杂的类型。这是在加载内容时首先调用的。

内容处理器是一个提供将内容转换或将一种类型的内容转换为另一种类型的方法的类。在XNA中,它是Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor的子类,覆盖了一个名为Process的方法,该方法接受一个TInput对象和一个导入上下文对象,并返回TOutput。在导入内容后第二次调用。如果您以某种单一方式导入单一类型的内容,但是有许多选项可以进一步处理它,则这非常有用。

要看到这个实际效果,只需要添加一个内容管道扩展项目,并向其中添加内容处理器和内容导入器类。通过添加新项来完成此操作,这两种类型的类都有项目模板,因此您可以轻松地创建一个基本的无实现管道。但是,在使用之前,您需要让您的内容项目引用此内容管道扩展项目。一旦添加了此引用,您的自定义内容管道将出现在资产属性窗口中出现的内容处理器/导入器列表中。对于其扩展名与您的内容导入器类中的ContentImporterAttribute定义的扩展名匹配的资产,将自动选择您的导入器/处理器。
//[using statements omitted for brevity]
// TODO: replace this with the type you want to import.
using TImport = System.String;

namespace ContentPipelineExtension1
{
    /// <summary>
    /// This class will be instantiated by the XNA Framework Content Pipeline
    /// to import a file from disk into the specified type, TImport.
    /// 
    /// This should be part of a Content Pipeline Extension Library project.
    /// 
    /// TODO: change the ContentImporter attribute to specify the correct file
    /// extension, display name, and default processor for this importer.
    /// </summary>
    [ContentImporter(".abc", DisplayName = "ABC Importer", DefaultProcessor = "AbcProcessor")]
    public class ContentImporter1 : ContentImporter<TImport>
    {
        //Microsoft.Xna.Framework.Content.Pipeline.ContentImporter<T>
        public override TImport Import(string filename, ContentImporterContext context)
        {
            return "This the simplest importer ever that doesn't even take into account the file being imported.";
        }
    }
}

// TODO: replace these with the processor input and output types.
using TInput = System.String;
using TOutput = System.String;

namespace ContentPipelineExtension1
{
    /// <summary>
    /// This class will be instantiated by the XNA Framework Content Pipeline
    /// to apply custom processing to content data, converting an object of
    /// type TInput to TOutput. The input and output types may be the same if
    /// the processor wishes to alter data without changing its type.
    ///
    /// This should be part of a Content Pipeline Extension Library project.
    ///
    /// TODO: change the ContentProcessor attribute to specify the correct
    /// display name for this processor.
    /// </summary>
    [ContentProcessor(DisplayName = "ContentPipelineExtension1.ContentProcessor1")]
    public class ContentProcessor1 : Microsoft.Xna.Framework.Content.Pipeline.ContentProcessor<TInput, TOutput>
    {
        public override TOutput Process(TInput input, ContentProcessorContext context)
        {
            return input + "processed!!!!";
        }
    }
}

我再次提醒您,您的内容导入扩展必须被您的内容项目所引用。请查看下面我解决方案资源管理器的快照。
此外,现在已经可以选择使用内容导入器来处理您的资产。资产的导入器和处理器是根据其扩展名自动选择的。
如果您想让其他人以非编程方式与您协作创建游戏,那么这是一个很好的工具。例如,您希望关卡设计师创建描述关卡的 XML 文件或文本文件。现在您可以让他们这样做,然后创建内容导入器将这些文件导入并将它们放置到游戏对象中,就好像您在一开始就是以编程方式创建它们一样。
那么,您看到的错误信息是从哪里来的呢?您的内容项目中存在内容,其内容导入器和内容处理器属性设置为某个未被引用的程序集中的设置,但某些资产的设置指向该程序集作为内容导入器。内容管道扩展作为 DLL 存在于您下载的 ZIP 文件中,请参见本帖子第一句话中给出的路径。
哇,结果是一篇相当长的帖子!我得在我的博客中使用它!:D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接