小编Tyr*_*rrz的帖子

在 MSBuild 中的编译器处理 C# 文件之前重写它们

我正在寻找一种方法来扩展 C# 项目的现有 MSBuild 编译流程,方法是在编译器拾取某些代码文件之前重写它们。更具体地说,我想使用顶级语句处理文件,并将底层代码包装在自定义类/方法中,而不是自动生成的<Program>$.Main().

换句话说,给定一个具有以下两个编译单元的 C# 项目:

  • Foo.cs
Console.WriteLine("Foo");
Run Code Online (Sandbox Code Playgroud)
  • Bar.cs
Console.WriteLine("Bar");
Run Code Online (Sandbox Code Playgroud)

我想注入一些处理逻辑,以便将这些文件传递给编译器:

  • Foo.g.cs
public static class Foo
{
    public static void Execute()
    {
        Console.WriteLine("Foo");
    }
}
Run Code Online (Sandbox Code Playgroud)
  • Bar.g.cs
public static class Bar
{
    public static void Execute()
    {
        Console.WriteLine("Bar");
    }
}
Run Code Online (Sandbox Code Playgroud)

同时,我希望用户在编辑原始文件Foo.csBar.cs文件时保持完整的静态分析、自动完成和其他编译器驱动的 IDE 功能。这意味着,如果生成的文件包含错误,我希望将其报告在原始文件上。

最终,我的目标是使用户能够在多个文件中编写顶级语句,同时让我的框架调用Execute()生成的代码来执行所有这些语句(顺序并不重要)。

为了实现这样的事情,我需要采取的最佳方法和最少的步骤是什么?

我最初的想法是执行以下操作:

  1. 从编译中排除原始文件,但将它们作为<None>项目包含在内,以便它们保留为项目的一部分
  2. 生成输出文件(使用源生成器或只是简单的 MSBuild 任务)
  3. 使用#line指令将生成文件中的所有静态分析重新映射到原始文件
  • Project.csproj
<ItemGroup>
    <Compile Remove="*.cs" />
    <None Include="*.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
  • Foo.g.cs
public static class Foo
{
    public …
Run Code Online (Sandbox Code Playgroud)

.net c# msbuild

10
推荐指数
1
解决办法
686
查看次数

作为构建过程的一部分,在 C#/.NET 程序集中注入 C 代码

我有一个 .NET Framework 3.5 项目,我想为其启用框架翻转,以便用户可以在安装了 .NET Framework 3.5 或 .NET Framework 4.x 运行时的系统上运行它。这应该允许用户通过从 Windows 7 开始的任何开箱即用的 Windows 安装来运行我的应用程序。

\n

我已经使用以下App.config文件进行了此工作:

\n
<?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>\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我不想将配置文件与应用程序一起分发。我读过Michal Strehovsk\xc3\xbd 写的这篇很棒的文章,它解释了我可以通过在执行程序的入口点之前COMPLUS_OnlyUseLatestCLR=1设置环境变量来获得相同的行为。 …

.net c c# msbuild roslyn

5
推荐指数
0
解决办法
233
查看次数

标签 统计

.net ×2

c# ×2

msbuild ×2

c ×1

roslyn ×1