为什么修改项目输出目录会导致:IOExceptionUnhandled"Unabletofindresource'app.xaml'。"为了将项目设置合并到C++和C#项目的属性表中,构造了以下属性表:$(ProjectName)$(AssemblyName)x86x86x64AnyCPU$(OutputRelativePath)/$(ProjectOrAssemblyName)_$(ShortPlatform)_$(Configuration)/$(OutputRelativePath)/Obj_Exe/$(ProjectOrAssemblyName)_$(ShortPlatform)$(BaseIntermediateOutputPath)_$(Configuration)/$(IntermediateOutputPath)$(OutputPath)此属性表移动所有构建输出OutputRelativePath(定义在单独的属性表或直接在项目文件中)到包含用于清理等的源代码的外部目录的单独位置。但是,在设置完成后,构建工作正常并且所有单元测试工作正常,很明显WPF可执行项目不是很好,因为使用上述属性表运行应用程序会导致臭名昭著:IOException未处理“无法找到资源‘app.xaml’。”为什么更改输出路径会导致此错误?我如何确定原因是项目构建输出路径?这可以在生成的代码中看到吗?我找不到?这不是一个错误吗?注意:使用以下属性表有效,但前提是IntermediateOutputPath包含BaseIntermediateOutputPath。$(OutputRelativePath)/$(AssemblyName)_$(Platform)_$(Configuration)$(OutputRelativePath)/Obj_Exe/$(AssemblyName)_$(Platform)$(BaseIntermediateOutputPath)_$(Configuration)所以看起来不知何故,输出路径包含AssemblyName属性或类似属性。更新另一个组件中的XAML样式:如果这些样式(例如Brushes.xaml)位于另一个程序集中,并且该程序集还更改了OutputPath,则同样适用于xamlResourceDictionary,它也会引发异常:XamlParseException未处理设置属性源InnerException“找不到资源‘Brushes.xaml’”总之,输出位置更改了xaml资源名称,因此无法在运行时发现这些名称。奇怪的是它在设计时不是问题...更新:重现异常的最少步骤:打开VisualStudio2013创建新的C#项目WPF应用程序,例如XamlIntermediateOutputPathBug卸载项目编辑项目文件在第一个PropertyGroup之后插入新的PropertyGroup:$(ProjectDir)..Build$(OutputRelativePath)/$(AssemblyName)_$(平台)_$(配置)/$(OutputRelativePath)/Obj_Exe/$(AssemblyName)_$(平台)$(BaseIntermediateOutputPath)_$(Configuration)/$(IntermediateOutputPath)$(OutputPath)删除其余PropertyGroups中的OutputPath属性,例如binDebug和:binRelease然后这应该在mainwindow.xaml启动时抛出IOException。这是由于$(AssemblyName).g.resources嵌入式资源的名称如下:.mresourcepublic'Build/Obj_Exe/XamlIntermediateOutputPathBug_AnyCPU_Debug/XamlIntermediateOutputPathBug.g.resources'asBuild_Obj_Exe_XamlIntermediateOutputPathBug_AnyCPU_Debug_XamlIntermediateOutputPathBug.g.resources{//Offset:0x00000000Length:0x000003BC}.mresourcepublic'Build/Obj_Exe/XamlIntermediateOutputPathBug_AnyCPU_Debug/XamlIntermediateOutputPathBug.Properties.Resources.resources'asBuild_Obj_Exe_XamlIntermediateOutputPathBug_AnyCPU_Debug_XamlIntermediateOutputPathBug.Properties.Resources.resources{//Offset:0x000003C0Length:0x000000B4}可以看到ildasm.exe并打开程序集的MANIFEST。It也可以看出,正常资源的输出路径前缀也是错误的名称。但是,这可以通过在项目文件中为此资源设置LogicalName来解决(在使用MSBuild构建后运行测试时,请参阅MissingManifestResourceException(.mresource在清单中有路径))。这似乎不适用于xaml资源......查看配置我注意到我在OutputPath和IntermediateOutputPath的末尾使用/,删除它们似乎有效,见下文:$(ProjectDir)..Build$(OutputRelativePath)/$(AssemblyName)_$(Platform)_$(Configuration)$(OutputRelativePath)/Obj_Exe/$(AssemblyName)_$(Platform)$(BaseIntermediateOutputPath)_$(Configuration)$(IntermediateOutputPath)/$(OutputPath)/我觉得这很奇怪......如果能深入了解为什么会出现这种情况,或者如果它是真的,我们将不胜感激。请注意,C++IntDir和OutDir必须有尾部反斜杠,否则您将收到有关它的警告。将MSBuild输出详细程度设置为“诊断”可以快速揭示问题的根源:1>(TaskId:21)1>Microsoft(R)BuildTask'ResourcesGenerator'Version'4.0.30319.33440builtby:FX45W81RTMREL'。(TaskId:21)1>版权所有(C)MicrosoftCorporation2005。保留所有权利。(TaskId:21)1>1>(TaskId:21)1>生成.resources文件:'..Build/Obj_Exe/WpfApplication8_AnyCPU_Debug/WpfApplication8.g.resources'...(TaskId:21)1>读取资源文件:'C:Usershpass_000ProjectsBuildObj_ExeWpfApplication8_AnyCPU_DebugMainWindow.baml'...(TaskId:21)1>资源ID是'mainwindow.baml'。(TaskId:21)1>生成。资源文件:'..Build/Obj_Exe/WpfApplication8_AnyCPU_Debug/WpfApplication8.g.resources'。请注意路径名中正斜杠和反斜杠的混合。Windows本机知道如何很好地处理路径名中的正斜杠。但这种能力往往是其他软件所缺乏的,资源生成器任务是缺乏的。这需要一个真正的反斜杠作为路径分隔符,正斜杠在资源名称中有效。固定:$(OutputRelativePath)$(AssemblyName)_$(Platform)_$(Configuration)$(OutputRelativePath)Obj_Exe$(AssemblyName)_$(Platform)$(BaseIntermediateOutputPath)_$(Configuration)换句话说,我只是替换/和。这解决了问题。当Xaml引用当前项目中的类型时,WinFX和Xaml目标会执行一些幕后技巧/魔术。在此构建任务期间,wpf.csproj被复制到tempfilename.tmp_proj,与程序集引用相关的几个节点被修剪,文件被编译到IntermediateOutputPath中。这允许Xaml编译器引用临时程序集中的类型。以上是C#学习教程:为什么修改项目输出目录会导致:IOExceptionunhandled"Unabletofindresource'app.xaml'."请注意——本文摘自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
