2

如果您尝试在 Metro 风格的应用程序(例如 MyCompany.Windows)中将 Windows 用作您自己的命名空间的一部分,它似乎会关闭编译器,因为它们开始在您的命名空间而不是 Windows.* 下寻找 WinRT 内容。

例如,如果您创建一个名为 App1 的空白 Windows Metro 风格应用程序并将 App1 命名空间重命名为 App1.Windows 并尝试编译它,您将收到错误消息:

命名空间“App1.Windows”中不存在类型或命名空间名称“UI”(您是否缺少程序集引用?) F:\temp\App1\App1\obj\Debug\App.gics

生成文件的顶部如下所示:

namespace App1.Windows
{
#if !DISABLE_XAML_GENERATED_MAIN
    public static class Program
    {
        [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        static void Main(string[] args)
        {
            Application.Start((p) => new App());
        }
    }
#endif

    partial class App : Windows.UI.Xaml.Application

问题是编译器开始在 App1.Windows 下寻找 Windows.UI。

现在这已经不是什么新鲜事了,如果您将命名空间命名为 App1.System,那么您可能会在某些时候遇到类似的麻烦。问题是那里有相当多的 WPF/Silverlight/Windows Phone 代码使用 MyCompany.Windows.Xyz 命名空间,并且可能容易受到这种麻烦的影响。

Microsoft 是否有一些关于如何处理这些命名空间的指导(似乎找不到)?或者也许有一些计划在未来的版本中解决这个问题?还是我只是错过了什么?

4

2 回答 2

2

我查看了这个问题,我们应该在生成的代码中使用 global::。我们已经解决了这个问题,并将在 Visual Studio 的下一版本中提供。

于 2012-07-03T23:08:39.423 回答
1

这是 C# 语言规范中的已知行为。基本上,只要命名空间出现在“using”子句中,系统就会将命名空间中的所有元素视为可能是 using 命名空间的一部分。有两种解决方法:从类型的内部节点中删除名称“Windows”或删除“使用”指令。

不幸的是,这不是 winrt 问题,您可以使用纯 CLR 应用程序发生同样的事情。

于 2012-07-02T21:27:07.750 回答