我正在寻找一种方法来扩展 C# 项目的现有 MSBuild 编译流程,方法是在编译器拾取某些代码文件之前重写它们。更具体地说,我想使用顶级语句处理文件,并将底层代码包装在自定义类/方法中,而不是自动生成的<Program>$.Main().
换句话说,给定一个具有以下两个编译单元的 C# 项目:
Foo.csConsole.WriteLine("Foo");
Run Code Online (Sandbox Code Playgroud)
Bar.csConsole.WriteLine("Bar");
Run Code Online (Sandbox Code Playgroud)
我想注入一些处理逻辑,以便将这些文件传递给编译器:
Foo.g.cspublic static class Foo
{
public static void Execute()
{
Console.WriteLine("Foo");
}
}
Run Code Online (Sandbox Code Playgroud)
Bar.g.cspublic static class Bar
{
public static void Execute()
{
Console.WriteLine("Bar");
}
}
Run Code Online (Sandbox Code Playgroud)
同时,我希望用户在编辑原始文件Foo.cs和Bar.cs文件时保持完整的静态分析、自动完成和其他编译器驱动的 IDE 功能。这意味着,如果生成的文件包含错误,我希望将其报告在原始文件上。
最终,我的目标是使用户能够在多个文件中编写顶级语句,同时让我的框架调用Execute()生成的代码来执行所有这些语句(顺序并不重要)。
为了实现这样的事情,我需要采取的最佳方法和最少的步骤是什么?
我最初的想法是执行以下操作:
<None>项目包含在内,以便它们保留为项目的一部分#line指令将生成文件中的所有静态分析重新映射到原始文件Project.csproj<ItemGroup>
<Compile Remove="*.cs" />
<None Include="*.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
Foo.g.cspublic static class Foo
{
public …Run Code Online (Sandbox Code Playgroud) 我有一个 .NET Framework 3.5 项目,我想为其启用框架翻转,以便用户可以在安装了 .NET Framework 3.5 或 .NET Framework 4.x 运行时的系统上运行它。这应该允许用户通过从 Windows 7 开始的任何开箱即用的 Windows 安装来运行我的应用程序。
\n我已经使用以下App.config文件进行了此工作:
<?xml version="1.0" encoding="utf-8" ?>\n\n<!-- This configuration file is required by the apphost which runs on legacy .NET Framework for compatibility reasons -->\n\n<configuration>\n <!-- Prefer .NET 3.5 (preinstalled on Windows 7), rollover to .NET 4.x (preinstalled on Windows 8+) -->\n <startup useLegacyV2RuntimeActivationPolicy="true">\n <supportedRuntime version="v2.0.50727" />\n <supportedRuntime version="v4.0" />\n </startup>\n</configuration>\nRun Code Online (Sandbox Code Playgroud)\n但是,我不想将配置文件与应用程序一起分发。我读过Michal Strehovsk\xc3\xbd 写的这篇很棒的文章,它解释了我可以通过在执行程序的入口点之前COMPLUS_OnlyUseLatestCLR=1设置环境变量来获得相同的行为。 …