c# – 使用roslyn编译Xaml以获取* .g.cs文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用roslyn编译Xaml以获取* .g.cs文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3287字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用roslyn编译Xaml以获取* .g.cs文件](/upload/InfoBanner/zyjiaocheng/779/7ee06813b46a44f3aa791ee9c33a27ea.jpg)
我正在寻找使用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# – 使用roslyn编译Xaml以获取* .g.cs文件全部内容,希望文章能够帮你解决c# – 使用roslyn编译Xaml以获取* .g.cs文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。