ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 使用roslyn编译Xaml以获取* .g.cs文件

2019-07-03 07:04:12  阅读:384  来源: 互联网

标签:c wpf xaml roslyn


我正在寻找使用xaml文件来生成自动生成文件(* .g.cs文件)

我在roslyn解决方案中找到了MSBuidWorkspaceTests.cs中的这个方法:

    public void TestOpenProjectAsyncWithXaml()
    {
        CreateFiles(GetSimpleCSharpSolutionFiles()
            .WithFile(@"CSharpProject\CSharpProject.csproj", GetResourceText("CSharpProject_CSharpProject_WithXaml.csproj"))
            .WithFile(@"CSharpProject\App.xaml", GetResourceText("CSharpProject_App.xaml"))
            .WithFile(@"CSharpProject\App.xaml.cs", GetResourceText("CSharpProject_App.xaml.cs"))
            .WithFile(@"CSharpProject\MainWindow.xaml", GetResourceText("CSharpProject_MainWindow.xaml"))
            .WithFile(@"CSharpProject\MainWindow.xaml.cs", GetResourceText("CSharpProject_MainWindow.xaml.cs")));

        var project = MSBuildWorkspace.Create().OpenProjectAsync(GetSolutionFileName(@"CSharpProject\CSharpProject.csproj")).Result;
        var documents = project.Documents.ToList();

        // AssemblyInfo.cs, App.xaml.cs, MainWindow.xaml.cs, App.g.cs, MainWindow.g.cs, + unusual AssemblyAttributes.cs
        Assert.Equal(6, documents.Count);

        // both xaml code behind files are documents
        Assert.Equal(true, documents.Contains(d => d.Name == "App.xaml.cs"));
        Assert.Equal(true, documents.Contains(d => d.Name == "MainWindow.xaml.cs"));

        // prove no xaml files are documents
        Assert.Equal(false, documents.Contains(d => d.Name.EndsWith(".xaml")));

        // prove that generated source files for xaml files are included in documents list
        Assert.Equal(true, documents.Contains(d => d.Name == "App.g.cs"));
        Assert.Equal(true, documents.Contains(d => d.Name == "MainWindow.g.cs"));
    }

但是当我尝试它时,测试失败了..

你知道如何在roslyn中使用xaml文件吗?如何生成* .g.cs文件?
在这个例子中,他们有xaml文件到解决方案,但xaml文件不在文档属性中,所以他们在哪里?

解决方法:

Roslyn本身不能,但你可以使用MSBuild来做到这一点(使用XamlBuildTask程序集).
这是一个代码片段来说明:

var msbuildTask = new PartialClassGenerationTask()
{
     ApplicationMarkup = new[] { new XamlItem(@"c:\path\to\your\xaml") },
     AssemblyName = "AssemblyName",
     BuildTaskPath = typeof(PartialClassGenerationTask).Assembly.Location,
     Language = "cs", // use "vb" to generate Visual Basic code
     OutputPath = @"C:\temp",
     References = new[]
     {
          new XamlItem(typeof(Uri).Assembly.Location),
          new XamlItem(typeof(XamlLanguage).Assembly.Location),
          new XamlItem(typeof(System.Windows.Point).Assembly.Location),
          new XamlItem(typeof(System.Windows.Application).Assembly.Location),
          new XamlItem(typeof(ApplicationGesture).Assembly.Location)
     },
     RequiresCompilationPass2 = false
};

msbuildTask.Execute();

‘References’属性是所有必需程序集的路径列表.我将它们添加为项目的引用,以便我可以通过typeof(ApplicationGesture).Assembly.Location构造获取它们的位置.
请注意,所需的程序集是:

>系统
> System.Xaml
> WindowsBase
> PresentationFramework
> PresentationCore

最后,这里是XamlItem类的定义(只是ITaskItem的虚拟实现):

private class XamlItem : ITaskItem
{
    public XamlItem(string path)
    {
         ItemSpec = path;
    }

    public string ItemSpec { get; set; }
    public string GetMetadata(string metadataName) { return ""; }
    public void SetMetadata(string metadataName, string metadataValue) {}
    public void RemoveMetadata(string metadataName) { }
    public void CopyMetadataTo(ITaskItem destinationItem) { }
    public IDictionary CloneCustomMetadata() { return null; }
    public ICollection MetadataNames { get { return null; } }
    public int MetadataCount { get { return 0; } }
}

有关更多详细信息,请参阅07DN的MSDN参考

标签:c,wpf,xaml,roslyn
来源: https://codeday.me/bug/20190703/1364343.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有