【问题标题】:Is it possible to add C# classes immediately before compilation in Visual Studio是否可以在 Visual Studio 中编译之前立即添加 C# 类
【发布时间】:2015-06-17 06:20:42
【问题描述】:

现在我以编程方式生成源代码并在编译之前创建一些类,并且显然将其添加到解决方案中的项目中。也许可以在编译之前“静默”添加类,而无需在磁盘中创建 .cs 文件并且不在解决方案资源管理器中显示这些类(可能使用 Roslyn)。

编辑:我不能使用任何运行时代码生成。

【问题讨论】:

标签: c# visual-studio compilation roslyn


【解决方案1】:

您可以将类放在单独的 DLL(类库)中。当您使用其他解决方案创建该 DLL 时,您将不会在包含它们的项目的解决方案资源管理器中看到这些类。

不要忘记在主项目中添加对 DLL(类库)的引用。

【讨论】:

    【解决方案2】:

    您可能可以使用 MSBuild 做一些事情,创建一个可以完成工作的自定义项目目标,但我从来没有这样做过。

    我最近所做的现在可以在基于 DNX 的 ASP.NET 5 平台上实现,这是一个称为元编程的概念。我已经写了一个关于这个概念的blog article,特别是在编译时生成代码的例子。在我的特定示例中,我有一个无法编译的类,但是通过引入 ICompileModule,我可以在编译时填写缺少的方法 return 语句。

    这是可能的,因为在基于 DNX 的应用程序中,RoslynCompiler 类实际上支持在编译时加载 ICompileModule 的实例,然后在主项目编译之前运行这些实例。这使您可以在编译器完成其工作之前在编译中添加/删除/替换语法树。

    如果您希望在 ASP.NET 5 上进行开发,这可以使您能够做您需要的事情,但我不知道您将如何去做。 p>

    对我来说似乎很方面

    我问了一个问题,我自己也回答了一个关于设计一个为另一个场景执行代码生成的编译时解决方案的问题:

    Getting interface implementations in referenced assemblies with Roslyn

    最后,这可能有用的其他示例以及我一直在玩弄的东西是能够从嵌入在我的程序集中的.sql 文件生成 EF 样式的迁移类。我现在更容易在 ASP.NET 5 + Roslyn 上实现所有这些场景。

    【讨论】:

      【解决方案3】:

      在不正确了解您的用例的情况下,这里有一个想法...

      创建一个监听“on build”事件的 VSIX

      在初始化构建时,VSIX 会创建您的新类*

      相同的 VSIX 还将侦听“构建完成”事件

      在构建完成后,VSIX 将拆除新类

      *您的问题表明不应在光盘上创建类,因此 VSIX 可以

      • 将类创建为内存流 (?)

      • 将新类作为代码添加到光盘上的现有文件中

      • 在 C:\Temp 或其他位置的磁盘(或云?)上将新类创建为新文件

      • 新类可能是部分类的一部分(应用程序中的真实部分类或空的新虚拟部分类)

      在任何情况下,都需要(通过 vsix)自动编辑项目文件以引用新文件。大概您希望项目文件恢复原状?

      如果和我不同,如果你想低调和肮脏,你总是可以干涉 IL,但你自己在那里!

      正如TarkaDaal 所说,在不知道您为什么需要它的情况下,要提供更明确的答案并不容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 2016-05-18
        • 2012-07-06
        • 2010-10-26
        • 2016-12-13
        相关资源
        最近更新 更多